// Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . import BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import { Link } from 'react-router'; import { isEqual } from 'lodash'; import ReactTooltip from 'react-tooltip'; import { Balance, Container, ContainerTitle, IdentityIcon, IdentityName, Tags, Input } from '~/ui'; import { nullableProptype } from '~/util/proptypes'; import styles from '../accounts.css'; export default class Summary extends Component { static contextTypes = { api: React.PropTypes.object }; static propTypes = { account: PropTypes.object.isRequired, balance: PropTypes.object, link: PropTypes.string, name: PropTypes.string, noLink: PropTypes.bool, handleAddSearchToken: PropTypes.func, owners: nullableProptype(PropTypes.array) }; static defaultProps = { noLink: false }; shouldComponentUpdate (nextProps) { const prev = { link: this.props.link, name: this.props.name, noLink: this.props.noLink, meta: this.props.account.meta, address: this.props.account.address }; const next = { link: nextProps.link, name: nextProps.name, noLink: nextProps.noLink, meta: nextProps.account.meta, address: nextProps.account.address }; if (!isEqual(next, prev)) { return true; } const prevTokens = this.props.balance.tokens || []; const nextTokens = nextProps.balance.tokens || []; if (prevTokens.length !== nextTokens.length) { return true; } const prevValues = prevTokens.map((t) => ({ value: t.value.toNumber(), image: t.token.image })); const nextValues = nextTokens.map((t) => ({ value: t.value.toNumber(), image: t.token.image })); if (!isEqual(prevValues, nextValues)) { return true; } const prevOwners = this.props.owners; const nextOwners = nextProps.owners; if (!isEqual(prevOwners, nextOwners)) { return true; } return false; } render () { const { account, handleAddSearchToken } = this.props; const { tags } = account.meta; if (!account) { return null; } const { address } = account; const addressComponent = ( ); return ( { this.renderOwners() } { this.renderBalance() } ); } renderOwners () { const { owners } = this.props; const ownersValid = (owners || []).filter((owner) => owner.address && new BigNumber(owner.address).gt(0)); if (!ownersValid || ownersValid.length === 0) { return null; } return (
{ ownersValid.map((owner, index) => (
{ owner.name } (owner)
)) }
); } renderLink () { const { link, noLink, account, name } = this.props; const { address } = account; const viewLink = `/${link || 'account'}/${address}`; const content = ( ); if (noLink) { return content; } return ( { content } ); } renderBalance () { const { balance } = this.props; if (!balance) { return null; } return ( ); } }