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

                                     
                                              





                                   

                                                                                      
                     
                          
                     
                     














































                                                              
                                              







                              
                                              























































                                              













                                              

                                   
                                        

                              
                         

























































































































































                                                                                    
const extend = require('xtend')
const actions = require('../actions')
const valuesFor = require('../util').valuesFor

module.exports = reduceApp

function reduceApp(state, action) {

  // clone and defaults
  var accounts = valuesFor(state.metamask.accounts)
  var account = accounts.length ? valuesFor(state.metamask.accounts)[0].address : null
  var defaultView = {
    name: 'accountDetail',
    detailView: null,
    context: account,
  }

  // confirm seed words
  var seedConfView = {
    name: 'createVaultComplete',
  }
  var seedWords = state.metamask.seedWords

  var appState = extend({
    currentView: seedWords ? seedConfView : defaultView,
    currentDomain: 'example.com',
    transForward: true, // Used to render transition direction
    isLoading: false,   // Used to display loading indicator
    warning: null,      // Used to display error text
  }, state.appState)

  switch (action.type) {

  // intialize

  case actions.SHOW_CREATE_VAULT:
    return extend(appState, {
      currentView: {
        name: 'createVault',
      },
      transForward: true,
      warning: null,
    })

  case actions.SHOW_RESTORE_VAULT:
    return extend(appState, {
      currentView: {
        name: 'restoreVault',
      },
      transForward: true,
    })

  case actions.SHOW_INIT_MENU:
    return extend(appState, {
      currentView: defaultView,
      transForward: false,
    })

  case actions.SHOW_CONFIG_PAGE:
    return extend(appState, {
      currentView: {
        name: 'config',
        context: appState.currentView.context,
      },
      transForward: true,
    })

  case actions.SHOW_INFO_PAGE:
    return extend(appState, {
      currentView: {
        name: 'info',
        context: appState.currentView.context,
      },
      transForward: true,
    })

  case actions.CREATE_NEW_VAULT_IN_PROGRESS:
    return extend(appState, {
      currentView: {
        name: 'createVault',
        inProgress: true,
      },
      transForward: true,
      isLoading: true,
    })

  case actions.SHOW_NEW_VAULT_SEED:
    return extend(appState, {
      currentView: {
        name: 'createVaultComplete',
        context: action.value,
      },
      transForward: true,
      isLoading: false,
    })

  case actions.SHOW_SEND_PAGE:
    return extend(appState, {
      currentView: {
        name: 'sendTransaction',
        context: appState.currentView.context,
      },
      transForward: true,
      warning: null,
    })

  // unlock

  case actions.UNLOCK_METAMASK:
    return extend(appState, {
      transForward: true,
      warning: null,
    })

  case actions.LOCK_METAMASK:
    return extend(appState, {
      currentView: defaultView,
      transForward: false,
      warning: null,
    })

  // accounts

  case actions.SET_SELECTED_ACCOUNT:
    return extend(appState, {
      activeAddress: action.value,
    })

  case actions.GO_HOME:
    return extend(appState, {
      currentView: {
        name: 'accountDetail',
        context: appState.currentView.context,
      },
      accountDetail: {
        accountExport: 'none',
        privateKey: '',
      },
      transForward: false,
    })


  case actions.SHOW_ACCOUNT_DETAIL:
    return extend(appState, {
      isLoading: account ? false : true,
      currentView: {
        name: 'accountDetail',
        context: account,
      },
      accountDetail: {
        accountExport: 'none',
        privateKey: '',
      },
      transForward: true,
    })

  case actions.BACK_TO_ACCOUNT_DETAIL:
    return extend(appState, {
      currentView: {
        name: 'accountDetail',
        context: action.value,
      },
      accountDetail: {
        accountExport: 'none',
        privateKey: '',
      },
      transForward: false,
    })

  case actions.SHOW_ACCOUNTS_PAGE:
    var seedWords = state.metamask.seedWords
    return extend(appState, {
      currentView: {
        name: seedWords ? 'createVaultComplete' : 'accounts',
      },
      transForward: appState.currentView.name == 'locked',
      isLoading: false,
      warning: null,
    })

  case actions.SHOW_CONF_TX_PAGE:
    return extend(appState, {
      currentView: {
        name: 'confTx',
        context: 0,
      },
      transForward: true,
      warning: null,
    })

  case actions.COMPLETED_TX:
    var unconfTxs = Object.keys(state.metamask.unconfTxs).filter(tx => tx !== tx.id)
    if (unconfTxs && unconfTxs.length > 0) {
      return extend(appState, {
        transForward: false,
        currentView: {
          name: 'confTx',
          context: 0,
        },
        warning: null,
      })
    } else {
      return extend(appState, {
        transForward: false,
        currentView: {
          name: 'accounts',
          context: 0,
        },
        transForward: false,
        warning: null,
      })
    }

  case actions.NEXT_TX:
    return extend(appState, {
      transForward: true,
      currentView: {
        name: 'confTx',
        context: ++appState.currentView.context,
        warning: null,
      }
    })

  case actions.PREVIOUS_TX:
    return extend(appState, {
      transForward: false,
      currentView: {
        name: 'confTx',
        context: --appState.currentView.context,
        warning: null,
      }
    })

  case actions.TRANSACTION_ERROR:
    return extend(appState, {
      currentView: {
        name: 'confTx',
        errorMessage: 'There was a problem submitting this transaction.',
      },
    })

  case actions.UNLOCK_FAILED:
    return extend(appState, {
      warning: 'Incorrect password. Try again.'
    })

  case actions.SHOW_LOADING:
    return extend(appState, {
      isLoading: true,
    })

  case actions.HIDE_LOADING:
    return extend(appState, {
      isLoading: false,
    })

  case actions.CLEAR_SEED_WORD_CACHE:
    return extend(appState, {
      transForward: true,
      currentView: {
        name: 'accounts',
      },
      isLoading: false,
    })

  case actions.DISPLAY_WARNING:
    return extend(appState, {
      warning: action.value,
    })

  case actions.HIDE_WARNING:
    return extend(appState, {
      warning: undefined,
    })

  case actions.REQUEST_ACCOUNT_EXPORT:
    return extend(appState, {
      accountDetail: {
        accountExport: 'requested',
      },
    })

  case  actions.EXPORT_ACCOUNT:
    return extend(appState, {
      accountDetail: {
        accountExport: 'completed',
      },
    })

  case  actions.SHOW_PRIVATE_KEY:
    return extend(appState, {
      accountDetail: {
        accountExport: 'completed',
        privateKey: action.value,
      },
    })

  default:
    return appState

  }
}