diff options
author | Dan Finlay <dan@danfinlay.com> | 2016-04-14 06:28:44 +0800 |
---|---|---|
committer | Dan Finlay <dan@danfinlay.com> | 2016-04-14 06:28:44 +0800 |
commit | d814a45dffa6a872f6e336cad33ca41ffb102887 (patch) | |
tree | d8cdd0c4b8c6559efaf6846b24f0d6440f3c94f5 /ui/app/app.js | |
parent | 9f1438b85b3dac8f1dd98f7bd6e101035cfce0a5 (diff) | |
download | tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar.gz tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar.bz2 tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar.lz tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar.xz tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.tar.zst tangerine-wallet-browser-d814a45dffa6a872f6e336cad33ca41ffb102887.zip |
Moved UI into repo with its own dependency stack
Diffstat (limited to 'ui/app/app.js')
-rw-r--r-- | ui/app/app.js | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/ui/app/app.js b/ui/app/app.js new file mode 100644 index 000000000..fa375fb7f --- /dev/null +++ b/ui/app/app.js @@ -0,0 +1,242 @@ +const inherits = require('util').inherits +const React = require('react') +const Component = require('react').Component +const PropTypes = require('react').PropTypes +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const extend = require('xtend') +const actions = require('./actions') +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') +// init +const InitializeMenuScreen = require('./first-time/init-menu') +const CreateVaultScreen = require('./first-time/create-vault') +const CreateVaultCompleteScreen = require('./first-time/create-vault-complete') +const RestoreVaultScreen = require('./first-time/restore-vault') +// unlock +const UnlockScreen = require('./unlock') +// accounts +const AccountsScreen = require('./accounts') +const AccountDetailScreen = require('./account-detail') +const SendTransactionScreen = require('./send') +const ConfirmTxScreen = require('./conf-tx') +// other views +const ConfigScreen = require('./config') +const InfoScreen = require('./info') +const LoadingIndicator = require('./loading') + +module.exports = connect(mapStateToProps)(App) + + +inherits(App, Component) +function App() { Component.call(this) } + +function mapStateToProps(state) { + return { + // state from plugin + isInitialized: state.metamask.isInitialized, + isUnlocked: state.metamask.isUnlocked, + currentView: state.appState.currentView, + activeAddress: state.appState.activeAddress, + transForward: state.appState.transForward, + seedWords: state.metamask.seedWords, + } +} + +App.prototype.render = function() { + // const { selectedReddit, posts, isFetching, lastUpdated } = this.props + var state = this.props + var view = state.currentView.name + var transForward = state.transForward + var shouldHaveFooter = true + switch (view) { + case 'restoreVault': + shouldHaveFooter = false; + case 'createVault': + shouldHaveFooter = false; + case 'createVaultComplete': + shouldHaveFooter = false; + } + + return ( + + h('.flex-column.flex-grow.full-height', { + style: { + // Windows was showing a vertical scroll bar: + overflowY: 'hidden', + } + }, + [ + + h(LoadingIndicator), + + // top row + h('.app-header.flex-column.flex-center', { + }, [ + h('h1', 'MetaMask'), + ]), + + // panel content + h('.app-primary.flex-grow' + (transForward ? '.from-right' : '.from-left'), { + style: { + height: '380px', + } + }, [ + h(ReactCSSTransitionGroup, { + transitionName: "main", + transitionEnterTimeout: 300, + transitionLeaveTimeout: 300, + }, [ + this.renderPrimary(), + ]), + ]), + + // footer + h('.app-footer.flex-row.flex-space-around', { + style: { + display: shouldHaveFooter ? 'flex' : 'none', + alignItems: 'center', + height: '56px', + } + }, [ + + // settings icon + h('i.fa.fa-cog.fa-lg' + (view === 'config' ? '.active' : '.cursor-pointer'), { + style: { + opacity: state.isUnlocked ? '1.0' : '0.0', + transition: 'opacity 200ms ease-in', + //transform: `translateX(${state.isUnlocked ? '0px' : '-100px'})`, + }, + onClick: function(ev) { + state.dispatch(actions.showConfigPage()) + }, + }), + + // toggle + onOffToggle({ + toggleMetamaskActive: this.toggleMetamaskActive.bind(this), + isUnlocked: state.isUnlocked, + }), + + // help + h('i.fa.fa-question.fa-lg.cursor-pointer', { + style: { + opacity: state.isUnlocked ? '1.0' : '0.0', + }, + onClick() { state.dispatch(actions.showInfoPage()) } + }), + ]), + ]) + ) +} + +App.prototype.toggleMetamaskActive = function(){ + 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)) + } +} + +App.prototype.renderPrimary = function(state){ + var state = this.props + + // If seed words haven't been dismissed yet, show them still. + /* + if (state.seedWords) { + return h(CreateVaultCompleteScreen, {key: 'createVaultComplete'}) + } + */ + + // show initialize screen + if (!state.isInitialized) { + + // show current view + switch (state.currentView.name) { + + case 'createVault': + return h(CreateVaultScreen, {key: 'createVault'}) + + case 'restoreVault': + return h(RestoreVaultScreen, {key: 'restoreVault'}) + + default: + return h(InitializeMenuScreen, {key: 'menuScreenInit'}) + + } + } + + // show unlock screen + if (!state.isUnlocked) { + return h(UnlockScreen, {key: 'locked'}) + } + + // show current view + switch (state.currentView.name) { + + case 'createVaultComplete': + return h(CreateVaultCompleteScreen, {key: 'created-vault'}) + + case 'accounts': + return h(AccountsScreen, {key: 'accounts'}) + + case 'accountDetail': + return h(AccountDetailScreen, {key: 'account-detail'}) + + case 'sendTransaction': + return h(SendTransactionScreen, {key: 'send-transaction'}) + + case 'confTx': + return h(ConfirmTxScreen, {key: 'confirm-tx'}) + + case 'config': + return h(ConfigScreen, {key: 'config'}) + + case 'info': + return h(InfoScreen, {key: 'info'}) + + case 'createVault': + return h(CreateVaultScreen, {key: 'createVault'}) + + default: + return h(AccountsScreen, {key: 'accounts'}) + } +} + +function onOffToggle(state){ + var buttonSize = '50px'; + var lockWidth = '20px'; + return ( + h('.app-toggle.flex-row.flex-center.lock' + (state.isUnlocked ? '.unlocked' : '.locked'), { + width: buttonSize, + height: buttonSize, + }, [ + h('div', { + onClick: state.toggleMetamaskActive, + style: { + width: lockWidth, + height: '' + parseInt(lockWidth) * 1.5 + 'px', + position: 'relative', + } + }, [ + h('img.lock-top', { + src: 'images/lock-top.png', + style: { + width: lockWidth, + position: 'absolute', + } + }), + h('img', { + src: 'images/lock-base.png', + style: { + width: lockWidth, + position: 'absolute', + } + }), + ]) + ]) + ) +} |