aboutsummaryrefslogblamecommitdiffstats
path: root/ui/app/accounts.js
blob: dbf4ee0fa0c0d884e98f6b3162f2fc57ef602c1a (plain) (tree)
1
2
3
4
5
6
7
8
9




                                              
                                                   
                                    
                                                        
                                             

                                                       
                                                    










                                                         
                                                  















                                                
                                                   
                                   


          
                                      

                         
                                       
                                                      
                                  
           
                                                

         
                              



                                                 
                          



                              




















                                                           












                                                    
      









                                                                 
                        

                               
                                                       

            
                                                                                                  
                                                 

                           
          
                                                                          

          
                                                                     

                                     







                                                                                   



                                                                  




           


   










                                                                 















                                                                 



                                                       



                                              
const inherits = require('util').inherits
const Component = require('react').Component
const h = require('react-hyperscript')
const connect = require('react-redux').connect
const extend = require('xtend')
const Identicon = require('./components/identicon')
const actions = require('./actions')
const EtherBalance = require('./components/eth-balance')
const valuesFor = require('./util').valuesFor
const addressSummary = require('./util').addressSummary
const formatBalance = require('./util').formatBalance
const findDOMNode = require('react-dom').findDOMNode

module.exports = connect(mapStateToProps)(AccountsScreen)


function mapStateToProps(state) {
  return {
    accounts: state.metamask.accounts,
    identities: state.metamask.identities,
    unconfTxs: state.metamask.unconfTxs,
    selectedAddress: state.metamask.selectedAddress,
    currentDomain: state.appState.currentDomain,
    scrollToBottom: state.appState.scrollToBottom,
  }
}

inherits(AccountsScreen, Component)
function AccountsScreen() {
  Component.call(this)
}


AccountsScreen.prototype.render = function() {
  var state = this.props
  var identityList = valuesFor(state.identities)
  var unconfTxList = valuesFor(state.unconfTxs)
  var actions = {
    onSelect: this.onSelect.bind(this),
    onShowDetail: this.onShowDetail.bind(this),
    revealAccount: this.onRevealAccount.bind(this),
    goHome: this.goHome.bind(this),
  }
  return (

    h('.accounts-section.flex-grow', [

      // subtitle and nav
      h('.section-title.flex-center', [
        h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', {
          onClick: actions.goHome,
        }),
        h('h2.page-subtitle', 'Select Account'),
      ]),

      h('hr.horizontal-line'),

      // identity selection
      h('section.identity-section.flex-column', {
        style: {
          height: '418px',
          overflowY: 'auto',
          overflowX: 'hidden',
        }
      },
      [
        identityList.map(renderAccountPanel),

        h('hr.horizontal-line', {key: 'horizontal-line1'}),
        h('div.footer.hover-white.pointer', {
          key: 'reveal-account-bar',
          onClick:() => {
            actions.revealAccount()
          },
          style: {
            display: 'flex',
            flex: '1 0 auto',
            height: '40px',
            paddint: '10px',
            justifyContent: 'center',
            alignItems: 'center',
          }
        }, [
          h('i.fa.fa-chevron-down.fa-lg', {key: ''}),
        ]),
      ]),

      unconfTxList.length ? (

        h('.unconftx-link.flex-row.flex-center', {
          onClick: this.navigateToConfTx.bind(this),
        }, [
          h('span', 'Unconfirmed Txs'),
          h('i.fa.fa-arrow-right.fa-lg'),
        ])

      ) : (
        null
      ),
    ])
  )

  function renderAccountPanel(identity){
    var mayBeFauceting = identity.mayBeFauceting
    var isSelected = state.selectedAddress === identity.address
    var account = state.accounts[identity.address]
    var isFauceting = mayBeFauceting && account.balance === '0x0'
    var componentState = extend(actions, {
      identity: identity,
      account: account,
      isSelected: false,
      isFauceting: isFauceting,
    })
    const selectedClass = isSelected ? '.selected' : ''

    return (
      h(`.accounts-list-option.flex-row.flex-space-between.pointer.hover-white${selectedClass}`, {
        key: `account-panel-${identity.address}`,
        style: {
          flex: '1 0 auto',
        },
        onClick: (event) => actions.onShowDetail(identity.address, event),
      }, [

        h('.identicon-wrapper.flex-column.flex-center.select-none', [
          h(Identicon, {
            address: identity.address
          }),
        ]),

        // account address, balance
        h('.identity-data.flex-column.flex-justify-center.flex-grow.select-none', [

          h('span', identity.name),
          h('span.font-small', addressSummary(identity.address)),
          // h('span.font-small', formatBalance(account.balance)),
          h(EtherBalance, {
            value: account.balance,
          }),

        ]),

      ])
    )
  }
}

// If a new account was revealed, scroll to the bottom
AccountsScreen.prototype.componentDidUpdate = function(){
  const scrollToBottom = this.props.scrollToBottom

  if (scrollToBottom) {
    var container = findDOMNode(this)
    var scrollable = container.querySelector('.identity-section')
    scrollable.scrollTop = scrollable.scrollHeight
  }
}

AccountsScreen.prototype.navigateToConfTx = function(){
  event.stopPropagation()
  this.props.dispatch(actions.showConfTxPage())
}

AccountsScreen.prototype.onSelect = function(address, event){
  event.stopPropagation()
  // if already selected, deselect
  if (this.props.selectedAddress === address) address = null
  this.props.dispatch(actions.setSelectedAddress(address))
}

AccountsScreen.prototype.onShowDetail = function(address, event){
  event.stopPropagation()
  this.props.dispatch(actions.showAccountDetail(address))
}

AccountsScreen.prototype.onRevealAccount = function() {
  this.props.dispatch(actions.revealAccount())
}

AccountsScreen.prototype.goHome = function() {
  this.props.dispatch(actions.goHome())
}