aboutsummaryrefslogtreecommitdiffstats
path: root/ui/responsive/app/components
diff options
context:
space:
mode:
Diffstat (limited to 'ui/responsive/app/components')
-rw-r--r--ui/responsive/app/components/account-dropdowns.js217
-rw-r--r--ui/responsive/app/components/dropdown.js44
2 files changed, 244 insertions, 17 deletions
diff --git a/ui/responsive/app/components/account-dropdowns.js b/ui/responsive/app/components/account-dropdowns.js
new file mode 100644
index 000000000..cbb97b2cb
--- /dev/null
+++ b/ui/responsive/app/components/account-dropdowns.js
@@ -0,0 +1,217 @@
+const Component = require('react').Component
+const PropTypes = require('react').PropTypes
+const h = require('react-hyperscript')
+const actions = require('../actions')
+const genAccountLink = require('../../lib/account-link.js')
+const connect = require('react-redux').connect
+const Dropdown = require('./dropdown').Dropdown
+const DropdownMenuItem = require('./dropdown').DropdownMenuItem
+const Identicon = require('./identicon')
+const ethUtil = require('ethereumjs-util')
+const copyToClipboard = require('copy-to-clipboard')
+
+class AccountDropdowns extends Component {
+ constructor (props) {
+ super(props)
+ this.state = {
+ overflowMenuActive: false,
+ switchingMenuActive: false,
+ }
+ }
+
+ getAccounts () {
+ const { identities, selected } = this.props
+
+ return Object.keys(identities).map((key) => {
+ const identity = identities[key]
+ const isSelected = identity.address === selected
+
+ return h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => {
+ this.props.actions.showAccountDetail(identity.address)
+ },
+ },
+ [
+ h(
+ Identicon,
+ {
+ address: identity.address,
+ diameter: 16,
+ },
+ ),
+ h('span', { style: { marginLeft: '10px' } }, identity.name || ''),
+ h('span', { style: { marginLeft: '10px' } }, isSelected ? h('.check', '✓') : null),
+ ]
+ )
+ })
+ }
+
+ render () {
+ const { style, actions } = this.props
+ const { switchingMenuActive, overflowMenuActive } = this.state
+
+ return h(
+ 'span',
+ {
+ style: style,
+ },
+ [
+ h(
+ 'i.fa.fa-angle-down',
+ {
+ style: {},
+ onClick: (event) => {
+ event.stopPropagation()
+ this.setState({
+ switchingMenuActive: !switchingMenuActive,
+ overflowMenuActive: false,
+ })
+ },
+ },
+ [
+ h(
+ Dropdown,
+ {
+ style: {
+ marginLeft: '-140px',
+ minWidth: '180px',
+ },
+ isOpen: switchingMenuActive,
+ onClickOutside: () => { this.setState({ switchingMenuActive: false}) },
+ },
+ [
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => actions.showConfigPage(),
+ },
+ 'Account Settings',
+ ),
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => {
+ const { selected, network } = this.props
+ const url = genAccountLink(selected, network)
+ global.platform.openWindow({ url })
+ },
+ },
+ 'View account on Etherscan',
+ ),
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => {
+ const { selected } = this.props
+ const checkSumAddress = selected && ethUtil.toChecksumAddress(selected)
+ copyToClipboard(checkSumAddress)
+ },
+ },
+ 'Copy Address to clipboard',
+ ),
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => {
+ actions.requestAccountExport()
+ },
+ },
+ 'Export Private Key',
+ ),
+ ]
+ ),
+ ],
+ ),
+ h(
+ 'i.fa.fa-ellipsis-h',
+ {
+ style: { 'marginLeft': '10px'},
+ onClick: (event) => {
+ event.stopPropagation()
+ this.setState({
+ overflowMenuActive: !overflowMenuActive,
+ switchingMenuActive: false,
+ })
+ },
+ },
+ [
+ h(
+ Dropdown,
+ {
+ style: {
+ marginLeft: '-155px',
+ minWidth: '180px',
+ },
+ isOpen: overflowMenuActive,
+ onClickOutside: () => { this.setState({ overflowMenuActive: false}) },
+ },
+ [
+ ...this.getAccounts(),
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => actions.addNewAccount(),
+ },
+ [
+ h(
+ Identicon,
+ {
+ diameter: 16,
+ },
+ ),
+ h('span', { style: { marginLeft: '10px' } }, 'Create Account'),
+ ],
+ ),
+ h(
+ DropdownMenuItem,
+ {
+ closeMenu: () => {},
+ onClick: () => actions.showImportPage(),
+ },
+ [
+ h(
+ Identicon,
+ {
+ diameter: 16,
+ },
+ ),
+ h('span', { style: { marginLeft: '10px' } }, 'Import Account'),
+ ]
+ ),
+ ]
+ ),
+ ]
+ ),
+ ]
+ )
+ }
+}
+
+AccountDropdowns.propTypes = {
+ identities: PropTypes.objectOf(PropTypes.object),
+ selected: PropTypes.string,
+}
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ actions: {
+ showConfigPage: () => dispatch(actions.showConfigPage()),
+ requestAccountExport: () => dispatch(actions.requestExportAccount()),
+ showAccountDetail: (address) => dispatch(actions.showAccountDetail(address)),
+ addNewAccount: () => dispatch(actions.addNewAccount()),
+ showImportPage: () => dispatch(actions.showImportPage()),
+ },
+ }
+}
+
+module.exports = {
+ AccountDropdowns: connect(null, mapDispatchToProps)(AccountDropdowns),
+}
diff --git a/ui/responsive/app/components/dropdown.js b/ui/responsive/app/components/dropdown.js
index 6e09cd133..e77b4c40c 100644
--- a/ui/responsive/app/components/dropdown.js
+++ b/ui/responsive/app/components/dropdown.js
@@ -1,11 +1,13 @@
-const Component = require('react').Component;
-const PropTypes = require('react').PropTypes;
-const h = require('react-hyperscript');
-const MenuDroppo = require('menu-droppo');
+const Component = require('react').Component
+const PropTypes = require('react').PropTypes
+const h = require('react-hyperscript')
+const MenuDroppo = require('menu-droppo')
+
+const noop = () => {}
class Dropdown extends Component {
- render() {
- const { isOpen, onClickOutside, style, children } = this.props;
+ render () {
+ const { isOpen, onClickOutside, style, children } = this.props
return h(
MenuDroppo,
@@ -30,27 +32,34 @@ class Dropdown extends Component {
`
),
...children,
- ],
- );
+ ]
+ )
}
}
+Dropdown.defaultProps = {
+ isOpen: false,
+ onClick: noop,
+}
+
Dropdown.propTypes = {
- isOpen: PropTypes.func.isRequired,
+ isOpen: PropTypes.bool.isRequired,
onClick: PropTypes.func.isRequired,
children: PropTypes.node,
- style: PropTypes.object.isRequired,
+ style: PropTypes.object.isRequired,
}
class DropdownMenuItem extends Component {
- render() {
- const { onClick, closeMenu, children } = this.props;
+ render () {
+ const { onClick, closeMenu, children } = this.props
return h(
'li.dropdown-menu-item',
{
- onClick,
- closeMenu,
+ onClick: () => {
+ onClick()
+ closeMenu()
+ },
style: {
listStyle: 'none',
padding: '8px 0px 8px 0px',
@@ -60,10 +69,11 @@ class DropdownMenuItem extends Component {
cursor: 'pointer',
display: 'flex',
justifyContent: 'flex-start',
+ alignItems: 'center',
},
},
children
- );
+ )
}
}
@@ -71,9 +81,9 @@ DropdownMenuItem.propTypes = {
closeMenu: PropTypes.func.isRequired,
onClick: PropTypes.func.isRequired,
children: PropTypes.node,
-};
+}
module.exports = {
Dropdown,
DropdownMenuItem,
-}; \ No newline at end of file
+}