2016-04-14 00:28:44 +02:00
|
|
|
const inherits = require('util').inherits
|
|
|
|
const Component = require('react').Component
|
|
|
|
const connect = require('react-redux').connect
|
|
|
|
const h = require('react-hyperscript')
|
|
|
|
const actions = require('./actions')
|
2018-01-10 01:45:39 +01:00
|
|
|
const classnames = require('classnames')
|
2018-03-07 00:32:35 +01:00
|
|
|
const t = require('../i18n')
|
2018-01-10 01:45:39 +01:00
|
|
|
|
2017-08-18 13:11:26 +02:00
|
|
|
// mascara
|
|
|
|
const MascaraFirstTime = require('../../mascara/src/app/first-time').default
|
2017-08-30 10:30:55 +02:00
|
|
|
const MascaraBuyEtherScreen = require('../../mascara/src/app/first-time/buy-ether-screen').default
|
2016-04-14 00:28:44 +02:00
|
|
|
// init
|
2018-02-16 23:51:16 +01:00
|
|
|
const OldUIInitializeMenuScreen = require('./first-time/init-menu')
|
2018-02-16 10:45:09 +01:00
|
|
|
const InitializeMenuScreen = MascaraFirstTime
|
2016-10-20 20:33:18 +02:00
|
|
|
const NewKeyChainScreen = require('./new-keychain')
|
2016-04-14 00:28:44 +02:00
|
|
|
// accounts
|
2017-07-31 05:42:12 +02:00
|
|
|
const MainContainer = require('./main-container')
|
2017-10-13 22:19:22 +02:00
|
|
|
const SendTransactionScreen2 = require('./components/send/send-v2-container')
|
2016-04-14 00:28:44 +02:00
|
|
|
const ConfirmTxScreen = require('./conf-tx')
|
2016-12-07 23:34:15 +01:00
|
|
|
// notice
|
2016-12-21 00:54:59 +01:00
|
|
|
const NoticeScreen = require('./components/notice')
|
2016-12-22 23:09:10 +01:00
|
|
|
const generateLostAccountsNotice = require('../lib/lost-accounts-notice')
|
2017-08-02 23:17:58 +02:00
|
|
|
|
|
|
|
// slideout menu
|
|
|
|
const WalletView = require('./components/wallet-view')
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
// other views
|
2017-10-23 07:40:03 +02:00
|
|
|
const Settings = require('./settings')
|
2017-06-15 05:42:48 +02:00
|
|
|
const AddTokenScreen = require('./add-token')
|
2017-01-17 22:58:54 +01:00
|
|
|
const Import = require('./accounts/import')
|
2018-01-10 19:25:38 +01:00
|
|
|
const NewAccount = require('./accounts/new-account')
|
2017-06-15 04:15:50 +02:00
|
|
|
const Loading = require('./components/loading')
|
2016-06-02 01:30:14 +02:00
|
|
|
const NetworkIndicator = require('./components/network')
|
2017-10-13 00:46:09 +02:00
|
|
|
const Identicon = require('./components/identicon')
|
2016-08-13 00:41:59 +02:00
|
|
|
const BuyView = require('./components/buy-button-subview')
|
2016-10-31 19:35:09 +01:00
|
|
|
const HDCreateVaultComplete = require('./keychains/hd/create-vault-complete')
|
2016-11-01 19:25:38 +01:00
|
|
|
const HDRestoreVaultScreen = require('./keychains/hd/restore-vault')
|
2016-11-02 06:19:04 +01:00
|
|
|
const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation')
|
2017-08-03 02:49:04 +02:00
|
|
|
const ReactCSSTransitionGroup = require('react-addons-css-transition-group')
|
2017-08-13 22:15:21 +02:00
|
|
|
const NetworkDropdown = require('./components/dropdowns/network-dropdown')
|
2017-10-13 08:10:58 +02:00
|
|
|
const AccountMenu = require('./components/account-menu')
|
2017-11-02 03:30:33 +01:00
|
|
|
const QrView = require('./components/qr-code')
|
2016-10-31 19:35:09 +01:00
|
|
|
|
2017-08-13 19:24:51 +02:00
|
|
|
// Global Modals
|
2017-08-21 03:32:58 +02:00
|
|
|
const Modal = require('./components/modals/index').Modal
|
2016-10-31 19:35:09 +01:00
|
|
|
|
2017-08-07 04:03:38 +02:00
|
|
|
module.exports = connect(mapStateToProps, mapDispatchToProps)(App)
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
inherits(App, Component)
|
2016-06-21 22:18:32 +02:00
|
|
|
function App () { Component.call(this) }
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
function mapStateToProps (state) {
|
2017-08-04 02:17:00 +02:00
|
|
|
const {
|
|
|
|
identities,
|
|
|
|
accounts,
|
|
|
|
address,
|
2017-08-10 02:40:01 +02:00
|
|
|
keyrings,
|
2017-08-18 13:11:26 +02:00
|
|
|
isInitialized,
|
|
|
|
noActiveNotices,
|
2017-09-19 00:41:25 +02:00
|
|
|
seedWords,
|
2017-08-04 02:17:00 +02:00
|
|
|
} = state.metamask
|
2017-08-04 04:17:46 +02:00
|
|
|
const selected = address || Object.keys(accounts)[0]
|
2017-08-04 02:17:00 +02:00
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
return {
|
|
|
|
// state from plugin
|
2017-08-13 22:15:21 +02:00
|
|
|
networkDropdownOpen: state.appState.networkDropdownOpen,
|
2017-08-02 22:32:02 +02:00
|
|
|
sidebarOpen: state.appState.sidebarOpen,
|
2016-09-16 05:51:41 +02:00
|
|
|
isLoading: state.appState.isLoading,
|
2017-01-19 01:45:39 +01:00
|
|
|
loadingMessage: state.appState.loadingMessage,
|
2016-12-07 23:34:15 +01:00
|
|
|
noActiveNotices: state.metamask.noActiveNotices,
|
2016-04-14 00:28:44 +02:00
|
|
|
isInitialized: state.metamask.isInitialized,
|
|
|
|
isUnlocked: state.metamask.isUnlocked,
|
2017-10-13 00:46:09 +02:00
|
|
|
selectedAddress: state.metamask.selectedAddress,
|
2016-04-14 00:28:44 +02:00
|
|
|
currentView: state.appState.currentView,
|
|
|
|
activeAddress: state.appState.activeAddress,
|
|
|
|
transForward: state.appState.transForward,
|
2017-08-18 13:11:26 +02:00
|
|
|
isMascara: state.metamask.isMascara,
|
|
|
|
isOnboarding: Boolean(!noActiveNotices || seedWords || !isInitialized),
|
2018-02-16 10:45:09 +01:00
|
|
|
isPopup: state.metamask.isPopup,
|
2016-04-14 00:28:44 +02:00
|
|
|
seedWords: state.metamask.seedWords,
|
2017-01-28 01:11:59 +01:00
|
|
|
unapprovedTxs: state.metamask.unapprovedTxs,
|
|
|
|
unapprovedMsgs: state.metamask.unapprovedMsgs,
|
2016-05-18 21:30:03 +02:00
|
|
|
menuOpen: state.appState.menuOpen,
|
2016-06-02 01:30:14 +02:00
|
|
|
network: state.metamask.network,
|
2016-06-29 03:06:10 +02:00
|
|
|
provider: state.metamask.provider,
|
2018-02-08 01:38:55 +01:00
|
|
|
forgottenPassword: state.metamask.forgottenPassword,
|
2016-12-20 22:53:14 +01:00
|
|
|
lastUnreadNotice: state.metamask.lastUnreadNotice,
|
|
|
|
lostAccounts: state.metamask.lostAccounts,
|
2017-02-23 00:32:01 +01:00
|
|
|
frequentRpcList: state.metamask.frequentRpcList || [],
|
2017-10-19 04:09:26 +02:00
|
|
|
currentCurrency: state.metamask.currentCurrency,
|
2018-02-16 10:45:09 +01:00
|
|
|
isMouseUser: state.appState.isMouseUser,
|
|
|
|
betaUI: state.metamask.featureFlags.betaUI,
|
2018-03-03 03:14:05 +01:00
|
|
|
isRevealingSeedWords: state.metamask.isRevealingSeedWords,
|
2018-03-05 18:03:46 +01:00
|
|
|
Qr: state.appState.Qr,
|
2017-08-04 02:17:00 +02:00
|
|
|
|
|
|
|
// state needed to get account dropdown temporarily rendering from app bar
|
|
|
|
identities,
|
|
|
|
selected,
|
2017-08-10 02:40:01 +02:00
|
|
|
keyrings,
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-13 22:15:21 +02:00
|
|
|
function mapDispatchToProps (dispatch, ownProps) {
|
2017-08-07 04:03:38 +02:00
|
|
|
return {
|
2017-08-31 13:08:11 +02:00
|
|
|
dispatch,
|
|
|
|
hideSidebar: () => dispatch(actions.hideSidebar()),
|
|
|
|
showNetworkDropdown: () => dispatch(actions.showNetworkDropdown()),
|
|
|
|
hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()),
|
2017-09-29 01:13:53 +02:00
|
|
|
setCurrentCurrencyToUSD: () => dispatch(actions.setCurrentCurrency('usd')),
|
2017-10-16 07:28:25 +02:00
|
|
|
toggleAccountMenu: () => dispatch(actions.toggleAccountMenu()),
|
2018-02-12 18:45:53 +01:00
|
|
|
setMouseUserState: (isMouseUser) => dispatch(actions.setMouseUserState(isMouseUser)),
|
2017-08-07 04:03:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-29 01:13:53 +02:00
|
|
|
App.prototype.componentWillMount = function () {
|
2017-10-19 04:09:26 +02:00
|
|
|
if (!this.props.currentCurrency) {
|
|
|
|
this.props.setCurrentCurrencyToUSD()
|
|
|
|
}
|
2017-09-29 01:13:53 +02:00
|
|
|
}
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
App.prototype.render = function () {
|
2016-06-04 02:49:54 +02:00
|
|
|
var props = this.props
|
2018-02-12 18:45:53 +01:00
|
|
|
const {
|
|
|
|
isLoading,
|
|
|
|
loadingMessage,
|
|
|
|
network,
|
|
|
|
isMouseUser,
|
|
|
|
setMouseUserState,
|
|
|
|
} = props
|
2017-07-03 22:51:39 +02:00
|
|
|
const isLoadingNetwork = network === 'loading' && props.currentView.name !== 'config'
|
2017-06-15 04:36:37 +02:00
|
|
|
const loadMessage = loadingMessage || isLoadingNetwork ?
|
2017-07-04 00:12:24 +02:00
|
|
|
`Connecting to ${this.getNetworkName()}` : null
|
2017-02-23 23:23:45 +01:00
|
|
|
log.debug('Main ui render function')
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
return (
|
2017-07-26 03:22:31 +02:00
|
|
|
h('.flex-column.full-height', {
|
2018-02-12 18:45:53 +01:00
|
|
|
className: classnames({ 'mouse-user-styles': isMouseUser }),
|
2016-04-14 00:28:44 +02:00
|
|
|
style: {
|
2017-12-08 17:06:32 +01:00
|
|
|
overflowX: 'hidden',
|
2016-07-01 08:50:20 +02:00
|
|
|
position: 'relative',
|
2017-07-25 02:04:13 +02:00
|
|
|
alignItems: 'center',
|
2016-06-21 22:18:32 +02:00
|
|
|
},
|
2018-02-12 18:45:53 +01:00
|
|
|
tabIndex: '0',
|
|
|
|
onClick: () => setMouseUserState(true),
|
|
|
|
onKeyDown: (e) => {
|
|
|
|
if (e.keyCode === 9) {
|
|
|
|
setMouseUserState(false)
|
|
|
|
}
|
|
|
|
},
|
2016-05-14 03:07:47 +02:00
|
|
|
}, [
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
// global modal
|
|
|
|
h(Modal, {}, []),
|
2017-08-08 22:37:41 +02:00
|
|
|
|
2016-05-13 23:56:29 +02:00
|
|
|
// app bar
|
2016-05-14 03:07:47 +02:00
|
|
|
this.renderAppBar(),
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
// sidebar
|
|
|
|
this.renderSidebar(),
|
2017-06-15 04:15:50 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
// network dropdown
|
|
|
|
h(NetworkDropdown, {
|
|
|
|
provider: this.props.provider,
|
|
|
|
frequentRpcList: this.props.frequentRpcList,
|
|
|
|
}, []),
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
h(AccountMenu),
|
2017-10-13 08:10:58 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
(isLoading || isLoadingNetwork) && h(Loading, {
|
|
|
|
loadingMessage: loadMessage,
|
|
|
|
}),
|
2017-11-02 13:15:59 +01:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
// this.renderLoadingIndicator({ isLoading, isLoadingNetwork, loadMessage }),
|
2017-06-15 04:15:50 +02:00
|
|
|
|
2017-12-08 17:06:32 +01:00
|
|
|
// content
|
|
|
|
this.renderPrimary(),
|
2016-04-14 00:28:44 +02:00
|
|
|
])
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2017-08-29 16:50:48 +02:00
|
|
|
App.prototype.renderGlobalModal = function () {
|
2017-08-08 22:37:41 +02:00
|
|
|
return h(Modal, {
|
2017-08-29 16:50:48 +02:00
|
|
|
ref: 'modalRef',
|
2017-08-09 02:11:25 +02:00
|
|
|
}, [
|
2017-08-29 16:50:48 +02:00
|
|
|
// h(BuyOptions, {}, []),
|
2017-08-09 02:11:25 +02:00
|
|
|
])
|
2017-08-08 22:37:41 +02:00
|
|
|
}
|
|
|
|
|
2017-08-29 16:50:48 +02:00
|
|
|
App.prototype.renderSidebar = function () {
|
2017-08-03 02:49:04 +02:00
|
|
|
|
|
|
|
return h('div', {
|
|
|
|
}, [
|
|
|
|
h('style', `
|
|
|
|
.sidebar-enter {
|
2017-08-03 04:26:46 +02:00
|
|
|
transition: transform 300ms ease-in-out;
|
2017-08-03 02:49:04 +02:00
|
|
|
transform: translateX(-100%);
|
|
|
|
}
|
|
|
|
.sidebar-enter.sidebar-enter-active {
|
2017-08-03 04:26:46 +02:00
|
|
|
transition: transform 300ms ease-in-out;
|
2017-08-03 02:49:04 +02:00
|
|
|
transform: translateX(0%);
|
|
|
|
}
|
|
|
|
.sidebar-leave {
|
2017-08-03 04:26:46 +02:00
|
|
|
transition: transform 200ms ease-out;
|
2017-08-03 02:49:04 +02:00
|
|
|
transform: translateX(0%);
|
|
|
|
}
|
|
|
|
.sidebar-leave.sidebar-leave-active {
|
2017-08-03 04:26:46 +02:00
|
|
|
transition: transform 200ms ease-out;
|
2017-08-03 02:49:04 +02:00
|
|
|
transform: translateX(-100%);
|
|
|
|
}
|
|
|
|
`),
|
2017-08-02 23:17:58 +02:00
|
|
|
|
2017-08-03 02:49:04 +02:00
|
|
|
h(ReactCSSTransitionGroup, {
|
|
|
|
transitionName: 'sidebar',
|
2017-08-03 04:26:46 +02:00
|
|
|
transitionEnterTimeout: 300,
|
|
|
|
transitionLeaveTimeout: 200,
|
2017-08-03 02:49:04 +02:00
|
|
|
}, [
|
2017-08-09 03:44:20 +02:00
|
|
|
// A second instance of Walletview is used for non-mobile viewports
|
2017-08-03 02:49:04 +02:00
|
|
|
this.props.sidebarOpen ? h(WalletView, {
|
|
|
|
responsiveDisplayClassname: '.sidebar',
|
2017-08-03 08:14:53 +02:00
|
|
|
style: {},
|
2017-08-03 02:49:04 +02:00
|
|
|
}) : undefined,
|
2017-08-02 23:17:58 +02:00
|
|
|
|
2017-08-03 02:50:27 +02:00
|
|
|
]),
|
|
|
|
|
|
|
|
// overlay
|
|
|
|
// TODO: add onClick for overlay to close sidebar
|
2017-08-03 08:14:53 +02:00
|
|
|
this.props.sidebarOpen ? h('div.sidebar-overlay', {
|
2017-08-07 04:03:38 +02:00
|
|
|
style: {},
|
|
|
|
onClick: () => {
|
|
|
|
this.props.hideSidebar()
|
|
|
|
},
|
2017-08-03 02:50:27 +02:00
|
|
|
}, []) : undefined,
|
2017-08-02 23:17:58 +02:00
|
|
|
])
|
|
|
|
}
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
App.prototype.renderAppBar = function () {
|
2017-10-24 10:07:51 +02:00
|
|
|
const {
|
|
|
|
isUnlocked,
|
|
|
|
network,
|
|
|
|
provider,
|
|
|
|
networkDropdownOpen,
|
|
|
|
showNetworkDropdown,
|
|
|
|
hideNetworkDropdown,
|
|
|
|
currentView,
|
2018-02-27 18:13:22 +01:00
|
|
|
isInitialized,
|
|
|
|
betaUI,
|
|
|
|
isPopup,
|
2017-10-24 10:07:51 +02:00
|
|
|
} = this.props
|
|
|
|
|
2016-08-17 02:32:54 +02:00
|
|
|
if (window.METAMASK_UI_TYPE === 'notification') {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
2016-06-04 02:49:54 +02:00
|
|
|
const props = this.props
|
2017-08-18 13:11:26 +02:00
|
|
|
const {isMascara, isOnboarding} = props
|
|
|
|
|
2017-08-30 10:30:55 +02:00
|
|
|
// Do not render header if user is in mascara onboarding
|
2017-08-18 13:11:26 +02:00
|
|
|
if (isMascara && isOnboarding) {
|
|
|
|
return null
|
|
|
|
}
|
2016-05-14 03:07:47 +02:00
|
|
|
|
2017-08-30 10:30:55 +02:00
|
|
|
// Do not render header if user is in mascara buy ether
|
|
|
|
if (isMascara && props.currentView.name === 'buyEth') {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
2016-05-14 03:07:47 +02:00
|
|
|
return (
|
|
|
|
|
2017-07-26 03:22:31 +02:00
|
|
|
h('.full-width', {
|
2017-08-29 16:50:48 +02:00
|
|
|
style: {},
|
2017-07-25 02:04:13 +02:00
|
|
|
}, [
|
2016-05-14 03:07:47 +02:00
|
|
|
|
2016-05-18 23:36:35 +02:00
|
|
|
h('.app-header.flex-row.flex-space-between', {
|
2018-01-10 01:45:39 +01:00
|
|
|
className: classnames({
|
|
|
|
'app-header--initialized': !isOnboarding,
|
|
|
|
}),
|
2017-02-16 00:35:56 +01:00
|
|
|
}, [
|
2017-08-31 02:02:13 +02:00
|
|
|
h('div.app-header-contents', {}, [
|
|
|
|
h('div.left-menu-wrapper', {
|
2017-08-04 03:35:10 +02:00
|
|
|
onClick: () => {
|
2017-10-25 09:34:12 +02:00
|
|
|
props.dispatch(actions.backToAccountDetail(props.activeAddress))
|
2016-06-23 23:39:50 +02:00
|
|
|
},
|
2017-08-31 02:02:13 +02:00
|
|
|
}, [
|
|
|
|
// mini logo
|
2017-10-25 09:34:12 +02:00
|
|
|
h('img.metafox-icon', {
|
2018-01-11 06:09:09 +01:00
|
|
|
height: 42,
|
|
|
|
width: 42,
|
|
|
|
src: '/images/metamask-fox.svg',
|
2017-08-31 02:02:13 +02:00
|
|
|
}),
|
|
|
|
|
|
|
|
// metamask name
|
2018-03-06 18:14:57 +01:00
|
|
|
h('.flex-row', [
|
2018-03-07 01:15:45 +01:00
|
|
|
h('h1', t('appName')),
|
|
|
|
h('div.beta-label', t('beta')),
|
2018-03-06 18:14:57 +01:00
|
|
|
]),
|
2017-08-31 02:02:13 +02:00
|
|
|
]),
|
|
|
|
|
2017-10-13 00:46:09 +02:00
|
|
|
h('div.header__right-actions', [
|
|
|
|
h('div.network-component-wrapper', {
|
|
|
|
style: {},
|
|
|
|
}, [
|
|
|
|
// Network Indicator
|
|
|
|
h(NetworkIndicator, {
|
2017-10-24 10:07:51 +02:00
|
|
|
network,
|
|
|
|
provider,
|
|
|
|
disabled: currentView.name === 'confTx',
|
2017-10-13 00:46:09 +02:00
|
|
|
onClick: (event) => {
|
|
|
|
event.preventDefault()
|
|
|
|
event.stopPropagation()
|
2017-10-24 10:07:51 +02:00
|
|
|
return networkDropdownOpen === false
|
|
|
|
? showNetworkDropdown()
|
|
|
|
: hideNetworkDropdown()
|
2017-10-13 00:46:09 +02:00
|
|
|
},
|
|
|
|
}),
|
|
|
|
|
|
|
|
]),
|
|
|
|
|
2017-10-24 10:07:51 +02:00
|
|
|
isUnlocked && h('div.account-menu__icon', { onClick: this.props.toggleAccountMenu }, [
|
2017-10-16 07:28:25 +02:00
|
|
|
h(Identicon, {
|
|
|
|
address: this.props.selectedAddress,
|
|
|
|
diameter: 32,
|
|
|
|
}),
|
|
|
|
]),
|
2017-08-31 02:02:13 +02:00
|
|
|
]),
|
2016-06-23 23:39:50 +02:00
|
|
|
]),
|
2016-05-18 23:36:35 +02:00
|
|
|
]),
|
2017-07-29 22:31:53 +02:00
|
|
|
|
2018-02-27 18:13:22 +01:00
|
|
|
!isInitialized && !isPopup && betaUI && h('h2.alpha-warning',
|
|
|
|
'Please be aware that this version is still under development'),
|
|
|
|
|
2016-05-18 23:36:35 +02:00
|
|
|
])
|
2016-05-14 03:07:47 +02:00
|
|
|
)
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
|
2017-09-19 00:41:25 +02:00
|
|
|
App.prototype.renderLoadingIndicator = function ({ isLoading, isLoadingNetwork, loadMessage }) {
|
|
|
|
const { isMascara } = this.props
|
2017-08-21 13:56:09 +02:00
|
|
|
|
|
|
|
return isMascara
|
|
|
|
? null
|
|
|
|
: h(Loading, {
|
|
|
|
isLoading: isLoading || isLoadingNetwork,
|
|
|
|
loadingMessage: loadMessage,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2016-08-26 20:30:07 +02:00
|
|
|
App.prototype.renderBackButton = function (style, justArrow = false) {
|
|
|
|
var props = this.props
|
|
|
|
return (
|
|
|
|
h('.flex-row', {
|
|
|
|
key: 'leftArrow',
|
|
|
|
style: style,
|
|
|
|
onClick: () => props.dispatch(actions.goBackToInitView()),
|
|
|
|
}, [
|
|
|
|
h('i.fa.fa-arrow-left.cursor-pointer'),
|
|
|
|
justArrow ? null : h('div.cursor-pointer', {
|
|
|
|
style: {
|
|
|
|
marginLeft: '3px',
|
|
|
|
},
|
|
|
|
onClick: () => props.dispatch(actions.goBackToInitView()),
|
|
|
|
}, 'BACK'),
|
|
|
|
])
|
|
|
|
)
|
|
|
|
}
|
2016-11-01 23:00:28 +01:00
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
App.prototype.renderPrimary = function () {
|
2017-02-23 23:23:45 +01:00
|
|
|
log.debug('rendering primary')
|
2016-05-19 02:32:26 +02:00
|
|
|
var props = this.props
|
2018-03-03 03:14:05 +01:00
|
|
|
const {
|
|
|
|
isMascara,
|
|
|
|
isOnboarding,
|
|
|
|
betaUI,
|
|
|
|
isRevealingSeedWords,
|
2018-03-05 18:03:46 +01:00
|
|
|
Qr,
|
2018-03-03 03:14:05 +01:00
|
|
|
} = props
|
|
|
|
const isMascaraOnboarding = isMascara && isOnboarding
|
|
|
|
const isBetaUIOnboarding = betaUI && isOnboarding && !props.isPopup && !isRevealingSeedWords
|
2017-08-18 13:11:26 +02:00
|
|
|
|
2018-03-03 03:14:05 +01:00
|
|
|
if (isMascaraOnboarding || isBetaUIOnboarding) {
|
2017-08-30 11:05:45 +02:00
|
|
|
return h(MascaraFirstTime)
|
|
|
|
}
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-02-10 03:17:50 +01:00
|
|
|
// notices
|
2017-02-20 21:59:12 +01:00
|
|
|
if (!props.noActiveNotices) {
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering notice screen for unread notices.')
|
2017-02-10 03:17:50 +01:00
|
|
|
return h(NoticeScreen, {
|
|
|
|
notice: props.lastUnreadNotice,
|
|
|
|
key: 'NoticeScreen',
|
|
|
|
onConfirm: () => props.dispatch(actions.markNoticeRead(props.lastUnreadNotice)),
|
|
|
|
})
|
|
|
|
} else if (props.lostAccounts && props.lostAccounts.length > 0) {
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering notice screen for lost accounts view.')
|
2017-02-10 03:17:50 +01:00
|
|
|
return h(NoticeScreen, {
|
|
|
|
notice: generateLostAccountsNotice(props.lostAccounts),
|
|
|
|
key: 'LostAccountsNotice',
|
|
|
|
onConfirm: () => props.dispatch(actions.markAccountsFound()),
|
|
|
|
})
|
2016-06-17 01:55:32 +02:00
|
|
|
}
|
|
|
|
|
2018-02-08 01:38:55 +01:00
|
|
|
if (props.isInitialized && props.forgottenPassword) {
|
|
|
|
log.debug('rendering restore vault screen')
|
|
|
|
return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'})
|
2018-03-03 03:14:05 +01:00
|
|
|
} else if (!props.isInitialized && !props.isUnlocked && !isRevealingSeedWords) {
|
2018-02-08 01:38:55 +01:00
|
|
|
log.debug('rendering menu screen')
|
2018-02-16 23:51:16 +01:00
|
|
|
return props.isPopup
|
|
|
|
? h(OldUIInitializeMenuScreen, {key: 'menuScreenInit'})
|
|
|
|
: h(InitializeMenuScreen, {key: 'menuScreenInit'})
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// show unlock screen
|
2016-05-19 02:32:26 +02:00
|
|
|
if (!props.isUnlocked) {
|
2017-08-03 08:54:21 +02:00
|
|
|
return h(MainContainer, {
|
|
|
|
currentViewName: props.currentView.name,
|
|
|
|
isUnlocked: props.isUnlocked,
|
|
|
|
})
|
2016-04-14 00:28:44 +02:00
|
|
|
}
|
|
|
|
|
2018-01-02 20:29:26 +01:00
|
|
|
// show seed words screen
|
2018-01-02 20:07:48 +01:00
|
|
|
if (props.seedWords) {
|
|
|
|
log.debug('rendering seed words')
|
|
|
|
return h(HDCreateVaultComplete, {key: 'HDCreateVaultComplete'})
|
|
|
|
}
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
// show current view
|
2016-05-19 02:32:26 +02:00
|
|
|
switch (props.currentView.name) {
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
case 'accountDetail':
|
2017-07-31 05:42:12 +02:00
|
|
|
log.debug('rendering main container')
|
|
|
|
return h(MainContainer, {key: 'account-detail'})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
case 'sendTransaction':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering send tx screen')
|
2017-10-13 08:10:58 +02:00
|
|
|
|
2017-10-19 04:23:57 +02:00
|
|
|
// Going to leave this here until we are ready to delete SendTransactionScreen v1
|
|
|
|
// const SendComponentToRender = checkFeatureToggle('send-v2')
|
|
|
|
// ? SendTransactionScreen2
|
|
|
|
// : SendTransactionScreen
|
2017-10-05 17:44:45 +02:00
|
|
|
|
2017-10-19 04:23:57 +02:00
|
|
|
return h(SendTransactionScreen2, {key: 'send-transaction'})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-09-07 13:24:03 +02:00
|
|
|
case 'sendToken':
|
|
|
|
log.debug('rendering send token screen')
|
2017-10-13 22:19:22 +02:00
|
|
|
|
2017-10-19 04:23:57 +02:00
|
|
|
// Going to leave this here until we are ready to delete SendTransactionScreen v1
|
|
|
|
// const SendTokenComponentToRender = checkFeatureToggle('send-v2')
|
|
|
|
// ? SendTransactionScreen2
|
|
|
|
// : SendTokenScreen
|
2017-10-13 22:19:22 +02:00
|
|
|
|
2017-10-19 04:23:57 +02:00
|
|
|
return h(SendTransactionScreen2, {key: 'sendToken'})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-10-15 19:48:12 +02:00
|
|
|
case 'newKeychain':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering new keychain screen')
|
2016-10-15 19:48:12 +02:00
|
|
|
return h(NewKeyChainScreen, {key: 'new-keychain'})
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
case 'confTx':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering confirm tx screen')
|
2016-04-14 00:28:44 +02:00
|
|
|
return h(ConfirmTxScreen, {key: 'confirm-tx'})
|
|
|
|
|
2017-06-15 05:42:48 +02:00
|
|
|
case 'add-token':
|
|
|
|
log.debug('rendering add-token screen from unlock screen.')
|
|
|
|
return h(AddTokenScreen, {key: 'add-token'})
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
case 'config':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering config screen')
|
2017-10-23 07:40:03 +02:00
|
|
|
return h(Settings, {key: 'config'})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2017-01-17 22:47:30 +01:00
|
|
|
case 'import-menu':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering import screen')
|
2017-01-17 22:47:30 +01:00
|
|
|
return h(Import, {key: 'import-menu'})
|
|
|
|
|
2018-01-10 19:25:38 +01:00
|
|
|
case 'new-account-page':
|
|
|
|
log.debug('rendering new account screen')
|
|
|
|
return h(NewAccount, {key: 'new-account'})
|
|
|
|
|
2016-06-03 01:52:18 +02:00
|
|
|
case 'reveal-seed-conf':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering reveal seed confirmation screen')
|
2016-06-03 01:52:18 +02:00
|
|
|
return h(RevealSeedConfirmation, {key: 'reveal-seed-conf'})
|
|
|
|
|
2016-04-14 00:28:44 +02:00
|
|
|
case 'info':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering info screen')
|
2017-10-25 18:26:05 +02:00
|
|
|
return h(Settings, {key: 'info', tab: 'info'})
|
2016-04-14 00:28:44 +02:00
|
|
|
|
2016-08-13 00:41:59 +02:00
|
|
|
case 'buyEth':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering buy ether screen')
|
2017-09-19 00:41:25 +02:00
|
|
|
return h(BuyView, {key: 'buyEthView'})
|
|
|
|
|
|
|
|
case 'onboardingBuyEth':
|
|
|
|
log.debug('rendering onboarding buy ether screen')
|
|
|
|
return h(MascaraBuyEtherScreen, {key: 'buyEthView'})
|
2016-10-13 01:31:15 +02:00
|
|
|
|
2016-08-18 19:40:35 +02:00
|
|
|
case 'qr':
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering show qr screen')
|
2016-08-18 19:40:35 +02:00
|
|
|
return h('div', {
|
|
|
|
style: {
|
|
|
|
position: 'absolute',
|
|
|
|
height: '100%',
|
|
|
|
top: '0px',
|
|
|
|
left: '0px',
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', {
|
|
|
|
onClick: () => props.dispatch(actions.backToAccountDetail(props.activeAddress)),
|
|
|
|
style: {
|
|
|
|
marginLeft: '10px',
|
|
|
|
marginTop: '50px',
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
h('div', {
|
|
|
|
style: {
|
|
|
|
position: 'absolute',
|
|
|
|
left: '44px',
|
|
|
|
width: '285px',
|
|
|
|
},
|
|
|
|
}, [
|
2018-03-05 18:03:46 +01:00
|
|
|
h(QrView, {key: 'qr', Qr}),
|
2016-08-18 19:40:35 +02:00
|
|
|
]),
|
|
|
|
])
|
2016-04-14 00:28:44 +02:00
|
|
|
|
|
|
|
default:
|
2017-02-20 21:59:44 +01:00
|
|
|
log.debug('rendering default, account detail screen')
|
2017-07-31 05:42:12 +02:00
|
|
|
return h(MainContainer, {key: 'account-detail'})
|
2016-06-21 22:18:32 +02:00
|
|
|
}
|
2016-05-04 00:04:15 +02:00
|
|
|
}
|
|
|
|
|
2016-06-21 22:18:32 +02:00
|
|
|
App.prototype.toggleMetamaskActive = function () {
|
2016-05-14 03:07:47 +02:00
|
|
|
if (!this.props.isUnlocked) {
|
|
|
|
// currently inactive: redirect to password box
|
|
|
|
var passwordBox = document.querySelector('input[type=password]')
|
|
|
|
if (!passwordBox) return
|
|
|
|
passwordBox.focus()
|
|
|
|
} else {
|
|
|
|
// currently active: deactivate
|
|
|
|
this.props.dispatch(actions.lockMetamask(false))
|
|
|
|
}
|
|
|
|
}
|
2016-06-29 02:57:53 +02:00
|
|
|
|
2017-07-04 00:12:24 +02:00
|
|
|
App.prototype.getNetworkName = function () {
|
|
|
|
const { provider } = this.props
|
|
|
|
const providerName = provider.type
|
|
|
|
|
|
|
|
let name
|
|
|
|
|
|
|
|
if (providerName === 'mainnet') {
|
|
|
|
name = 'Main Ethereum Network'
|
|
|
|
} else if (providerName === 'ropsten') {
|
|
|
|
name = 'Ropsten Test Network'
|
|
|
|
} else if (providerName === 'kovan') {
|
|
|
|
name = 'Kovan Test Network'
|
|
|
|
} else if (providerName === 'rinkeby') {
|
|
|
|
name = 'Rinkeby Test Network'
|
|
|
|
} else {
|
|
|
|
name = 'Unknown Private Network'
|
|
|
|
}
|
|
|
|
|
|
|
|
return name
|
|
|
|
}
|