2016-04-14 00:28:44 +02:00
|
|
|
const extend = require('xtend')
|
|
|
|
const actions = require('../actions')
|
2016-05-03 23:32:22 +02:00
|
|
|
const txHelper = require('../../lib/tx-helper')
|
2018-04-12 23:06:59 +02:00
|
|
|
const log = require('loglevel')
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
module.exports = reduceApp
|
|
|
|
|
2017-03-31 22:32:47 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
function reduceApp (state, action) {
|
2017-02-23 23:23:45 +01:00
|
|
|
log.debug('App Reducer got ' + action.type)
|
2016-04-14 00:28:44 +02:00
|
|
|
// clone and defaults
|
2017-01-31 00:08:31 +01:00
|
|
|
const selectedAddress = state.metamask.selectedAddress
|
2017-03-31 21:38:20 +02:00
|
|
|
const hasUnconfActions = checkUnconfActions(state)
|
2016-05-26 01:28:07 +02:00
|
|
|
let name = 'accounts'
|
2017-01-31 00:08:31 +01:00
|
|
|
if (selectedAddress) {
|
2016-05-26 23:32:45 +02:00
|
|
|
name = 'accountDetail'
|
2016-05-26 01:28:07 +02:00
|
|
|
}
|
|
|
|
|
2017-03-31 21:38:20 +02:00
|
|
|
if (hasUnconfActions) {
|
2017-02-24 01:00:43 +01:00
|
|
|
log.debug('pending txs detected, defaulting to conf-tx view.')
|
2016-05-26 23:32:45 +02:00
|
|
|
name = 'confTx'
|
2016-05-26 01:28:07 +02:00
|
|
|
}
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
var defaultView = {
|
2016-05-26 01:28:07 +02:00
|
|
|
name,
|
2016-04-14 00:28:44 +02:00
|
|
|
detailView: null,
|
2017-01-31 00:08:31 +01:00
|
|
|
context: selectedAddress,
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// confirm seed words
|
2016-06-03 02:11:12 +02:00
|
|
|
var seedWords = state.metamask.seedWords
|
2016-04-14 00:28:44 +02:00
|
|
|
var seedConfView = {
|
|
|
|
name: 'createVaultComplete',
|
2016-06-03 02:11:12 +02:00
|
|
|
seedWords,
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
|
2017-03-31 22:20:16 +02:00
|
|
|
// default state
|
2016-04-14 00:28:44 +02:00
|
|
|
var appState = extend({
|
2017-03-31 22:32:47 +02:00
|
|
|
shouldClose: false,
|
2016-05-18 21:30:03 +02:00
|
|
|
menuOpen: false,
|
2017-08-21 03:32:58 +02:00
|
|
|
modal: {
|
|
|
|
open: false,
|
|
|
|
modalState: {
|
|
|
|
name: null,
|
2018-05-29 19:23:06 +02:00
|
|
|
props: {},
|
2017-08-21 03:32:58 +02:00
|
|
|
},
|
2017-09-22 21:57:18 +02:00
|
|
|
previousModalState: {
|
|
|
|
name: null,
|
2017-11-02 13:15:59 +01:00
|
|
|
},
|
2017-08-21 03:32:58 +02:00
|
|
|
},
|
2017-08-02 22:03:36 +02:00
|
|
|
sidebarOpen: false,
|
2018-07-19 08:31:02 +02:00
|
|
|
alertOpen: false,
|
|
|
|
alertMessage: null,
|
2017-08-13 22:15:21 +02:00
|
|
|
networkDropdownOpen: false,
|
2016-10-25 22:24:03 +02:00
|
|
|
currentView: seedWords ? seedConfView : defaultView,
|
2016-05-05 03:08:31 +02:00
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
|
|
|
},
|
2017-08-03 23:48:19 +02:00
|
|
|
// Used to render transition direction
|
|
|
|
transForward: true,
|
|
|
|
// Used to display loading indicator
|
|
|
|
isLoading: false,
|
|
|
|
// Used to display error text
|
|
|
|
warning: null,
|
2018-01-12 20:48:18 +01:00
|
|
|
buyView: {},
|
2018-02-12 18:45:53 +01:00
|
|
|
isMouseUser: false,
|
2018-06-19 17:53:33 +02:00
|
|
|
gasIsLoading: false,
|
2018-08-08 20:34:52 +02:00
|
|
|
networkNonce: null,
|
2016-04-14 00:28:44 +02:00
|
|
|
}, state.appState)
|
|
|
|
|
|
|
|
switch (action.type) {
|
2017-08-13 22:15:21 +02:00
|
|
|
// dropdown methods
|
|
|
|
case actions.NETWORK_DROPDOWN_OPEN:
|
|
|
|
return extend(appState, {
|
|
|
|
networkDropdownOpen: true,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-08-13 22:15:21 +02:00
|
|
|
case actions.NETWORK_DROPDOWN_CLOSE:
|
|
|
|
return extend(appState, {
|
|
|
|
networkDropdownOpen: false,
|
|
|
|
})
|
|
|
|
|
2017-08-02 22:03:36 +02:00
|
|
|
// sidebar methods
|
|
|
|
case actions.SIDEBAR_OPEN:
|
|
|
|
return extend(appState, {
|
|
|
|
sidebarOpen: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SIDEBAR_CLOSE:
|
|
|
|
return extend(appState, {
|
|
|
|
sidebarOpen: false,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2018-07-19 08:31:02 +02:00
|
|
|
// sidebar methods
|
|
|
|
case actions.ALERT_OPEN:
|
|
|
|
return extend(appState, {
|
|
|
|
alertOpen: true,
|
|
|
|
alertMessage: action.value,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.ALERT_CLOSE:
|
|
|
|
return extend(appState, {
|
|
|
|
alertOpen: false,
|
|
|
|
alertMessage: null,
|
|
|
|
})
|
|
|
|
|
2017-08-08 22:37:16 +02:00
|
|
|
// modal methods:
|
|
|
|
case actions.MODAL_OPEN:
|
2018-05-29 19:23:06 +02:00
|
|
|
const { name, ...modalProps } = action.payload
|
|
|
|
|
2017-08-08 22:37:16 +02:00
|
|
|
return extend(appState, {
|
2018-05-29 19:23:06 +02:00
|
|
|
modal: {
|
|
|
|
open: true,
|
|
|
|
modalState: {
|
|
|
|
name: name,
|
|
|
|
props: { ...modalProps },
|
|
|
|
},
|
|
|
|
previousModalState: { ...appState.modal.modalState },
|
|
|
|
},
|
2017-08-08 22:37:16 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.MODAL_CLOSE:
|
|
|
|
return extend(appState, {
|
2017-08-21 03:32:58 +02:00
|
|
|
modal: Object.assign(
|
|
|
|
state.appState.modal,
|
|
|
|
{ open: false },
|
2018-05-29 19:23:06 +02:00
|
|
|
{ modalState: { name: null, props: {} } },
|
2017-11-02 13:15:59 +01:00
|
|
|
{ previousModalState: appState.modal.modalState},
|
2017-08-21 03:32:58 +02:00
|
|
|
),
|
2017-08-08 22:37:16 +02:00
|
|
|
})
|
2016-12-01 04:34:17 +01:00
|
|
|
|
|
|
|
// transition methods
|
|
|
|
case actions.TRANSITION_FORWARD:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.TRANSITION_BACKWARD:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: false,
|
|
|
|
})
|
|
|
|
|
|
|
|
// intialize
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_CREATE_VAULT:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'createVault',
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
warning: null,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_RESTORE_VAULT:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'restoreVault',
|
|
|
|
},
|
|
|
|
transForward: true,
|
2016-12-19 23:54:24 +01:00
|
|
|
forgottenPassword: true,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-12-20 00:46:09 +01:00
|
|
|
case actions.FORGOT_PASSWORD:
|
2018-03-08 16:29:29 +01:00
|
|
|
const newState = extend(appState, {
|
2018-03-03 03:14:05 +01:00
|
|
|
forgottenPassword: action.value,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2018-03-08 16:29:29 +01:00
|
|
|
if (action.value) {
|
|
|
|
newState.currentView = {
|
|
|
|
name: 'restoreVault',
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return newState
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_INIT_MENU:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: defaultView,
|
|
|
|
transForward: false,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_CONFIG_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'config',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: action.value,
|
|
|
|
})
|
2016-06-03 01:52:18 +02:00
|
|
|
|
2017-06-15 05:42:48 +02:00
|
|
|
case actions.SHOW_ADD_TOKEN_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'add-token',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: action.value,
|
|
|
|
})
|
|
|
|
|
2017-01-17 22:47:30 +01:00
|
|
|
case actions.SHOW_IMPORT_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'import-menu',
|
|
|
|
},
|
|
|
|
transForward: true,
|
2017-10-30 20:04:44 +01:00
|
|
|
warning: null,
|
2017-01-17 22:47:30 +01:00
|
|
|
})
|
|
|
|
|
2018-01-10 19:25:38 +01:00
|
|
|
case actions.SHOW_NEW_ACCOUNT_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'new-account-page',
|
|
|
|
context: action.formToSelect,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SET_NEW_ACCOUNT_FORM:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: appState.currentView.name,
|
|
|
|
context: action.formToSelect,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_INFO_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'info',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
})
|
2016-06-03 01:52:18 +02:00
|
|
|
|
2017-09-13 19:28:07 +02:00
|
|
|
case actions.CREATE_NEW_VAULT_IN_PROGRESS:
|
2016-06-21 22:18:32 +02:00
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'createVault',
|
|
|
|
inProgress: true,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
isLoading: true,
|
|
|
|
})
|
2016-06-03 01:52:18 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_NEW_VAULT_SEED:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'createVaultComplete',
|
|
|
|
seedWords: action.value,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
isLoading: false,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-11-04 20:00:56 +01:00
|
|
|
case actions.NEW_ACCOUNT_SCREEN:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'new-account',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_SEND_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'sendTransaction',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
|
2017-09-07 13:24:03 +02:00
|
|
|
case actions.SHOW_SEND_TOKEN_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'sendToken',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
|
2016-10-15 19:48:12 +02:00
|
|
|
case actions.SHOW_NEW_KEYCHAIN:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'newKeychain',
|
2016-10-20 18:50:29 +02:00
|
|
|
context: appState.currentView.context,
|
2016-10-15 19:48:12 +02:00
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
// unlock
|
2016-05-03 23:32:22 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.UNLOCK_METAMASK:
|
2016-04-14 00:28:44 +02:00
|
|
|
return extend(appState, {
|
2016-08-24 02:17:08 +02:00
|
|
|
forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null,
|
2016-06-21 22:18:32 +02:00
|
|
|
detailView: {},
|
|
|
|
transForward: true,
|
|
|
|
isLoading: false,
|
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.LOCK_METAMASK:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: defaultView,
|
2016-04-14 00:28:44 +02:00
|
|
|
transForward: false,
|
2016-06-21 22:18:32 +02:00
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
|
2016-08-24 02:17:08 +02:00
|
|
|
case actions.BACK_TO_INIT_MENU:
|
|
|
|
return extend(appState, {
|
|
|
|
warning: null,
|
|
|
|
transForward: false,
|
|
|
|
forgottenPassword: true,
|
|
|
|
currentView: {
|
|
|
|
name: 'InitMenu',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.BACK_TO_UNLOCK_VIEW:
|
|
|
|
return extend(appState, {
|
|
|
|
warning: null,
|
|
|
|
transForward: true,
|
2016-12-19 23:54:24 +01:00
|
|
|
forgottenPassword: false,
|
2016-08-24 02:17:08 +02:00
|
|
|
currentView: {
|
|
|
|
name: 'UnlockScreen',
|
|
|
|
},
|
|
|
|
})
|
2016-06-21 22:18:32 +02:00
|
|
|
// reveal seed words
|
|
|
|
|
|
|
|
case actions.REVEAL_SEED_CONFIRMATION:
|
|
|
|
return extend(appState, {
|
2016-04-14 00:28:44 +02:00
|
|
|
currentView: {
|
2016-06-21 22:18:32 +02:00
|
|
|
name: 'reveal-seed-conf',
|
2016-04-14 00:28:44 +02:00
|
|
|
},
|
2016-06-21 22:18:32 +02:00
|
|
|
transForward: true,
|
2016-04-14 00:28:44 +02:00
|
|
|
warning: null,
|
|
|
|
})
|
2016-06-21 22:18:32 +02:00
|
|
|
|
|
|
|
// accounts
|
|
|
|
|
|
|
|
case actions.SET_SELECTED_ACCOUNT:
|
2016-04-14 00:28:44 +02:00
|
|
|
return extend(appState, {
|
2016-06-21 22:18:32 +02:00
|
|
|
activeAddress: action.value,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.GO_HOME:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: extend(appState.currentView, {
|
|
|
|
name: 'accountDetail',
|
|
|
|
}),
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
|
|
|
accountExport: 'none',
|
|
|
|
privateKey: '',
|
|
|
|
},
|
2016-04-14 00:28:44 +02:00
|
|
|
transForward: false,
|
2016-04-30 00:53:29 +02:00
|
|
|
warning: null,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHOW_ACCOUNT_DETAIL:
|
|
|
|
return extend(appState, {
|
2016-08-24 02:17:08 +02:00
|
|
|
forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null,
|
2016-04-14 00:28:44 +02:00
|
|
|
currentView: {
|
2016-04-30 00:53:29 +02:00
|
|
|
name: 'accountDetail',
|
2016-06-21 22:56:04 +02:00
|
|
|
context: action.value,
|
2016-04-14 00:28:44 +02:00
|
|
|
},
|
2016-05-05 03:08:31 +02:00
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
2016-06-21 22:18:32 +02:00
|
|
|
accountExport: 'none',
|
|
|
|
privateKey: '',
|
2016-05-05 03:08:31 +02:00
|
|
|
},
|
2016-06-21 22:18:32 +02:00
|
|
|
transForward: false,
|
2016-04-14 00:28:44 +02:00
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.BACK_TO_ACCOUNT_DETAIL:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'accountDetail',
|
|
|
|
context: action.value,
|
|
|
|
},
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
|
|
|
accountExport: 'none',
|
|
|
|
privateKey: '',
|
|
|
|
},
|
|
|
|
transForward: false,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHOW_ACCOUNTS_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: seedWords ? 'createVaultComplete' : 'accounts',
|
|
|
|
seedWords,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
isLoading: false,
|
2016-04-14 00:28:44 +02:00
|
|
|
warning: null,
|
2016-06-21 22:18:32 +02:00
|
|
|
scrollToBottom: false,
|
2016-11-23 22:49:54 +01:00
|
|
|
forgottenPassword: false,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
2016-12-07 23:34:15 +01:00
|
|
|
case actions.SHOW_NOTICE:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
isLoading: false,
|
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.REVEAL_ACCOUNT:
|
|
|
|
return extend(appState, {
|
|
|
|
scrollToBottom: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHOW_CONF_TX_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
2017-02-28 21:00:07 +01:00
|
|
|
name: 'confTx',
|
2018-01-16 02:41:06 +01:00
|
|
|
context: action.id ? indexForPending(state, action.id) : 0,
|
2016-06-21 22:18:32 +02:00
|
|
|
},
|
2016-09-15 19:24:05 +02:00
|
|
|
transForward: action.transForward,
|
2016-05-26 23:32:45 +02:00
|
|
|
warning: null,
|
2017-02-23 23:23:45 +01:00
|
|
|
isLoading: false,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHOW_CONF_MSG_PAGE:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
2017-03-31 21:38:20 +02:00
|
|
|
name: hasUnconfActions ? 'confTx' : 'account-detail',
|
2016-06-21 22:18:32 +02:00
|
|
|
context: 0,
|
|
|
|
},
|
|
|
|
transForward: true,
|
2016-04-14 00:28:44 +02:00
|
|
|
warning: null,
|
2017-02-23 23:23:45 +01:00
|
|
|
isLoading: false,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.COMPLETED_TX:
|
2017-02-24 01:00:43 +01:00
|
|
|
log.debug('reducing COMPLETED_TX for tx ' + action.value)
|
2018-01-16 02:41:06 +01:00
|
|
|
const otherUnconfActions = getUnconfActionList(state)
|
|
|
|
.filter(tx => tx.id !== action.value)
|
|
|
|
const hasOtherUnconfActions = otherUnconfActions.length > 0
|
|
|
|
|
|
|
|
if (hasOtherUnconfActions) {
|
|
|
|
log.debug('reducer detected txs - rendering confTx view')
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: false,
|
|
|
|
currentView: {
|
|
|
|
name: 'confTx',
|
|
|
|
context: 0,
|
|
|
|
},
|
|
|
|
warning: null,
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
log.debug('attempting to close popup')
|
|
|
|
return extend(appState, {
|
|
|
|
// indicate notification should close
|
|
|
|
shouldClose: true,
|
|
|
|
transForward: false,
|
|
|
|
warning: null,
|
|
|
|
currentView: {
|
|
|
|
name: 'accountDetail',
|
|
|
|
context: state.metamask.selectedAddress,
|
|
|
|
},
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
2016-06-21 22:18:32 +02:00
|
|
|
|
|
|
|
case actions.NEXT_TX:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {
|
|
|
|
name: 'confTx',
|
|
|
|
context: ++appState.currentView.context,
|
|
|
|
warning: null,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.VIEW_PENDING_TX:
|
|
|
|
const context = indexForPending(state, action.value)
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {
|
|
|
|
name: 'confTx',
|
|
|
|
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, {
|
2016-11-02 01:00:17 +01:00
|
|
|
warning: action.value || 'Incorrect password. Try again.',
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
2018-01-30 03:44:43 +01:00
|
|
|
case actions.UNLOCK_SUCCEEDED:
|
|
|
|
return extend(appState, {
|
|
|
|
warning: '',
|
|
|
|
})
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.SHOW_LOADING:
|
|
|
|
return extend(appState, {
|
|
|
|
isLoading: true,
|
2017-01-19 01:45:39 +01:00
|
|
|
loadingMessage: action.value,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.HIDE_LOADING:
|
|
|
|
return extend(appState, {
|
|
|
|
isLoading: false,
|
|
|
|
})
|
|
|
|
|
2016-08-10 22:51:14 +02:00
|
|
|
case actions.SHOW_SUB_LOADING_INDICATION:
|
|
|
|
return extend(appState, {
|
|
|
|
isSubLoading: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.HIDE_SUB_LOADING_INDICATION:
|
|
|
|
return extend(appState, {
|
|
|
|
isSubLoading: false,
|
|
|
|
})
|
2016-06-21 22:18:32 +02:00
|
|
|
case actions.CLEAR_SEED_WORD_CACHE:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {},
|
|
|
|
isLoading: false,
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'transactions',
|
|
|
|
accountExport: 'none',
|
|
|
|
privateKey: '',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.DISPLAY_WARNING:
|
|
|
|
return extend(appState, {
|
|
|
|
warning: action.value,
|
2017-03-21 17:15:12 +01:00
|
|
|
isLoading: false,
|
2016-06-21 22:18:32 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
case actions.HIDE_WARNING:
|
|
|
|
return extend(appState, {
|
|
|
|
warning: undefined,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.REQUEST_ACCOUNT_EXPORT:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {
|
|
|
|
name: 'accountDetail',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'export',
|
|
|
|
accountExport: 'requested',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.EXPORT_ACCOUNT:
|
|
|
|
return extend(appState, {
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'export',
|
|
|
|
accountExport: 'completed',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHOW_PRIVATE_KEY:
|
|
|
|
return extend(appState, {
|
|
|
|
accountDetail: {
|
|
|
|
subview: 'export',
|
|
|
|
accountExport: 'completed',
|
|
|
|
privateKey: action.value,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
case actions.BUY_ETH_VIEW:
|
2016-07-21 22:41:10 +02:00
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {
|
2016-08-13 00:41:59 +02:00
|
|
|
name: 'buyEth',
|
2016-09-15 19:24:05 +02:00
|
|
|
context: appState.currentView.name,
|
2016-07-21 22:41:10 +02:00
|
|
|
},
|
2017-04-18 18:21:24 +02:00
|
|
|
identity: state.metamask.identities[action.value],
|
2016-08-13 00:41:59 +02:00
|
|
|
buyView: {
|
2017-04-18 18:21:24 +02:00
|
|
|
subview: 'Coinbase',
|
2017-01-10 21:18:39 +01:00
|
|
|
amount: '15.00',
|
2016-08-13 00:41:59 +02:00
|
|
|
buyAddress: action.value,
|
2016-08-10 22:51:14 +02:00
|
|
|
formView: {
|
|
|
|
coinbase: true,
|
|
|
|
shapeshift: false,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2017-09-19 00:41:25 +02:00
|
|
|
case actions.ONBOARDING_BUY_ETH_VIEW:
|
|
|
|
return extend(appState, {
|
|
|
|
transForward: true,
|
|
|
|
currentView: {
|
|
|
|
name: 'onboardingBuyEth',
|
|
|
|
context: appState.currentView.name,
|
|
|
|
},
|
|
|
|
identity: state.metamask.identities[action.value],
|
|
|
|
})
|
|
|
|
|
2016-08-10 22:51:14 +02:00
|
|
|
case actions.COINBASE_SUBVIEW:
|
|
|
|
return extend(appState, {
|
2016-08-13 00:41:59 +02:00
|
|
|
buyView: {
|
2017-04-18 18:21:24 +02:00
|
|
|
subview: 'Coinbase',
|
2016-08-10 22:51:14 +02:00
|
|
|
formView: {
|
|
|
|
coinbase: true,
|
|
|
|
shapeshift: false,
|
|
|
|
},
|
2016-08-13 00:41:59 +02:00
|
|
|
buyAddress: appState.buyView.buyAddress,
|
|
|
|
amount: appState.buyView.amount,
|
2016-08-10 22:51:14 +02:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.SHAPESHIFT_SUBVIEW:
|
|
|
|
return extend(appState, {
|
2016-08-13 00:41:59 +02:00
|
|
|
buyView: {
|
2017-04-18 18:21:24 +02:00
|
|
|
subview: 'ShapeShift',
|
2016-08-10 22:51:14 +02:00
|
|
|
formView: {
|
|
|
|
coinbase: false,
|
|
|
|
shapeshift: true,
|
|
|
|
marketinfo: action.value.marketinfo,
|
|
|
|
coinOptions: action.value.coinOptions,
|
|
|
|
},
|
2018-01-12 20:48:18 +01:00
|
|
|
buyAddress: action.value.buyAddress || appState.buyView.buyAddress,
|
|
|
|
amount: appState.buyView.amount || 0,
|
2016-08-10 22:51:14 +02:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.PAIR_UPDATE:
|
|
|
|
return extend(appState, {
|
2016-08-13 00:41:59 +02:00
|
|
|
buyView: {
|
2017-04-18 18:21:24 +02:00
|
|
|
subview: 'ShapeShift',
|
2016-08-10 22:51:14 +02:00
|
|
|
formView: {
|
|
|
|
coinbase: false,
|
|
|
|
shapeshift: true,
|
|
|
|
marketinfo: action.value.marketinfo,
|
2016-08-13 00:41:59 +02:00
|
|
|
coinOptions: appState.buyView.formView.coinOptions,
|
2016-08-10 22:51:14 +02:00
|
|
|
},
|
2016-08-13 00:41:59 +02:00
|
|
|
buyAddress: appState.buyView.buyAddress,
|
|
|
|
amount: appState.buyView.amount,
|
2016-08-10 22:51:14 +02:00
|
|
|
warning: null,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
case actions.SHOW_QR:
|
2016-08-10 22:51:14 +02:00
|
|
|
return extend(appState, {
|
2016-08-13 00:41:59 +02:00
|
|
|
qrRequested: true,
|
|
|
|
transForward: true,
|
2016-09-13 02:27:14 +02:00
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
Qr: {
|
|
|
|
message: action.value.message,
|
|
|
|
data: action.value.data,
|
2016-07-21 22:41:10 +02:00
|
|
|
},
|
|
|
|
})
|
2016-08-18 19:40:35 +02:00
|
|
|
|
|
|
|
case actions.SHOW_QR_VIEW:
|
|
|
|
return extend(appState, {
|
|
|
|
currentView: {
|
|
|
|
name: 'qr',
|
|
|
|
context: appState.currentView.context,
|
|
|
|
},
|
|
|
|
transForward: true,
|
|
|
|
Qr: {
|
|
|
|
message: action.value.message,
|
|
|
|
data: action.value.data,
|
|
|
|
},
|
|
|
|
})
|
2018-02-12 18:45:53 +01:00
|
|
|
|
|
|
|
case actions.SET_MOUSE_USER_STATE:
|
|
|
|
return extend(appState, {
|
|
|
|
isMouseUser: action.value,
|
|
|
|
})
|
|
|
|
|
2018-06-19 17:53:33 +02:00
|
|
|
case actions.GAS_LOADING_STARTED:
|
|
|
|
return extend(appState, {
|
|
|
|
gasIsLoading: true,
|
|
|
|
})
|
|
|
|
|
|
|
|
case actions.GAS_LOADING_FINISHED:
|
|
|
|
return extend(appState, {
|
|
|
|
gasIsLoading: false,
|
2018-07-03 00:49:33 +02:00
|
|
|
})
|
2018-06-19 17:53:33 +02:00
|
|
|
|
2018-08-08 20:34:52 +02:00
|
|
|
case actions.SET_NETWORK_NONCE:
|
|
|
|
return extend(appState, {
|
|
|
|
networkNonce: action.value,
|
|
|
|
})
|
|
|
|
|
2016-08-19 00:20:26 +02:00
|
|
|
default:
|
2016-06-21 22:18:32 +02:00
|
|
|
return appState
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
}
|
2016-05-26 01:28:07 +02:00
|
|
|
|
2017-03-31 21:38:20 +02:00
|
|
|
function checkUnconfActions (state) {
|
|
|
|
const unconfActionList = getUnconfActionList(state)
|
|
|
|
const hasUnconfActions = unconfActionList.length > 0
|
|
|
|
return hasUnconfActions
|
|
|
|
}
|
|
|
|
|
|
|
|
function getUnconfActionList (state) {
|
|
|
|
const { unapprovedTxs, unapprovedMsgs,
|
2017-09-29 18:24:08 +02:00
|
|
|
unapprovedPersonalMsgs, unapprovedTypedMessages, network } = state.metamask
|
2017-02-23 23:23:45 +01:00
|
|
|
|
2017-09-29 18:24:08 +02:00
|
|
|
const unconfActionList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, network)
|
2017-03-31 21:38:20 +02:00
|
|
|
return unconfActionList
|
2016-05-26 01:28:07 +02:00
|
|
|
}
|
2016-05-26 23:32:45 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
function indexForPending (state, txId) {
|
2017-03-31 21:38:20 +02:00
|
|
|
const unconfTxList = getUnconfActionList(state)
|
|
|
|
const match = unconfTxList.find((tx) => tx.id === txId)
|
|
|
|
const index = unconfTxList.indexOf(match)
|
|
|
|
return index
|
2016-05-26 23:32:45 +02:00
|
|
|
}
|
2017-09-13 19:28:07 +02:00
|
|
|
|
2018-01-16 02:41:06 +01:00
|
|
|
// function indexForLastPending (state) {
|
|
|
|
// return getUnconfActionList(state).length
|
|
|
|
// }
|