From d814a45dffa6a872f6e336cad33ca41ffb102887 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 13 Apr 2016 15:28:44 -0700 Subject: Moved UI into repo with its own dependency stack --- ui/app/reducers/app.js | 281 ++++++++++++++++++++++++++++++++++++++++++ ui/app/reducers/identities.js | 18 +++ ui/app/reducers/metamask.js | 73 +++++++++++ 3 files changed, 372 insertions(+) create mode 100644 ui/app/reducers/app.js create mode 100644 ui/app/reducers/identities.js create mode 100644 ui/app/reducers/metamask.js (limited to 'ui/app/reducers') diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js new file mode 100644 index 000000000..582583185 --- /dev/null +++ b/ui/app/reducers/app.js @@ -0,0 +1,281 @@ +const extend = require('xtend') +const actions = require('../actions') + +module.exports = reduceApp + +function reduceApp(state, action) { + + // clone and defaults + var defaultView = { + name: 'accounts', + detailView: null, + } + + // 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', + }, + transForward: true, + }) + + case actions.SHOW_INFO_PAGE: + return extend(appState, { + currentView: { + name: 'info', + }, + 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.SHOW_ACCOUNT_DETAIL: + return extend(appState, { + currentView: { + name: 'accountDetail', + context: action.value, + }, + 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 + + } +} diff --git a/ui/app/reducers/identities.js b/ui/app/reducers/identities.js new file mode 100644 index 000000000..95ecd23f9 --- /dev/null +++ b/ui/app/reducers/identities.js @@ -0,0 +1,18 @@ +const extend = require('xtend') +const actions = require('../actions') + +module.exports = reduceIdentities + +function reduceIdentities(state, action) { + + // clone + defaults + var idState = extend({ + + }, state.identities) + + switch (action.type) { + default: + return idState + } + +} diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js new file mode 100644 index 000000000..43bb3f761 --- /dev/null +++ b/ui/app/reducers/metamask.js @@ -0,0 +1,73 @@ +const extend = require('xtend') +const actions = require('../actions') + +module.exports = reduceMetamask + +function reduceMetamask(state, action) { + + // clone + defaults + var metamaskState = extend({ + isInitialized: false, + isUnlocked: false, + currentDomain: 'example.com', + rpcTarget: 'https://rawtestrpc.metamask.io/', + identities: {}, + unconfTxs: {}, + }, state.metamask) + + switch (action.type) { + + case actions.SHOW_ACCOUNTS_PAGE: + var state = extend(metamaskState) + delete state.seedWords + return state + + case actions.UPDATE_METAMASK_STATE: + return extend(metamaskState, action.value) + + case actions.UNLOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + }) + + case actions.LOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: false, + }) + + case actions.SET_RPC_TARGET: + return extend(metamaskState, { + rpcTarget: action.value, + }) + + case actions.COMPLETED_TX: + var stringId = String(action.id) + var newState = extend(metamaskState, { + unconfTxs: {} + }) + for (var id in metamaskState.unconfTxs) { + if (id !== stringId) { + newState.unconfTxs[id] = metamaskState.unconfTxs[id] + } + } + return newState + + case actions.CLEAR_SEED_WORD_CACHE: + var newState = extend(metamaskState, { + isInitialized: true, + }) + delete newState.seedWords + return newState + + case actions.CREATE_NEW_VAULT_IN_PROGRESS: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + }) + + default: + return metamaskState + + } +} -- cgit v1.2.3