Skip to content
This repository has been archived by the owner on Jan 26, 2022. It is now read-only.

Commit

Permalink
Fixes brave/brave-browser#4773 - adds BAT token by default to accounts
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanml committed Jun 14, 2019
1 parent acc9e1e commit 1ad2e15
Show file tree
Hide file tree
Showing 12 changed files with 444 additions and 0 deletions.
16 changes: 16 additions & 0 deletions brave/app/scripts/controllers/preferences.js
@@ -0,0 +1,16 @@
const PreferencesController = require('../../../../app/scripts/controllers/preferences')

module.exports = class BravePreferencesController extends PreferencesController {
constructor (opts = {}) {
if (opts.initState === undefined) {
opts['initState'] = {}
}
opts.initState.batTokenAdded = false
super(opts)
}

setBatTokenAdded () {
this.store.updateState({ batTokenAdded: true })
return Promise.resolve(true)
}
}
14 changes: 14 additions & 0 deletions brave/app/scripts/metamask-controller.js
@@ -0,0 +1,14 @@
const MetamaskController = require('../../../app/scripts/metamask-controller')
const nodeify = require('../../../app/scripts/lib/nodeify')

module.exports = class BraveController extends MetamaskController {
constructor (opts) {
super(opts)
}

getApi () {
const api = super.getApi()
api['setBatTokenAdded'] = nodeify(this.preferencesController.setBatTokenAdded, this.preferencesController)
return api
}
}
30 changes: 30 additions & 0 deletions brave/ui/app/components/app/dropdowns/components/menu.js
@@ -0,0 +1,30 @@
const h = require('react-hyperscript')

import { Menu, Item, Divider, CloseArea } from '../../../../../../../ui/app/components/app/dropdowns/components/menu'

Item.prototype.render = function () {
const {
icon,
children,
text,
className = '',
onClick,
isShowing
} = this.props

if (isShowing === false) {
return h('noscript')
}

const itemClassName = `menu__item ${className} ${onClick ? 'menu__item--clickable' : ''}`
const iconComponent = icon ? h('div.menu__item__icon', [icon]) : null
const textComponent = text ? h('div.menu__item__text', text) : null

return children
? h('div', { className: itemClassName, onClick }, children)
: h('div.menu__item', { className: itemClassName, onClick }, [ iconComponent, textComponent ]
.filter(d => Boolean(d))
)
}

module.exports = { Menu, Item, Divider, CloseArea }
74 changes: 74 additions & 0 deletions brave/ui/app/components/app/dropdowns/token-menu-dropdown.js
@@ -0,0 +1,74 @@
const Component = require('react').Component
const PropTypes = require('prop-types')
const h = require('react-hyperscript')
const inherits = require('util').inherits
const connect = require('react-redux').connect
const genAccountLink = require('etherscan-link').createAccountLink
const { Menu, Item, CloseArea } = require('./components/menu')

import actions from '../../../store/actions'

function mapStateToProps(state) {
return {
network: state.metamask.network,
}
}

function mapDispatchToProps(dispatch) {
return {
showHideTokenConfirmationModal: (token) => {
dispatch(actions.showModal({
name: 'HIDE_TOKEN_CONFIRMATION',
token
}))
},
}
}

BraveTokenMenuDropdown.contextTypes = {
t: PropTypes.func,
}

inherits(BraveTokenMenuDropdown, Component)
function BraveTokenMenuDropdown () {
Component.call(this)

this.onClose = this.onClose.bind(this)
}

BraveTokenMenuDropdown.prototype.onClose = function (e) {
e.stopPropagation()
this.props.onClose()
}

BraveTokenMenuDropdown.prototype.render = function() {
const { showHideTokenConfirmationModal } = this.props

return h(Menu, { className: 'token-menu-dropdown', isShowing: true }, [
h(CloseArea, {
onClick: this.onClose,
}),
h(Item, {
onClick: (e) => {
e.stopPropagation()
showHideTokenConfirmationModal(this.props.token)
this.props.onClose()
},
isShowing: (this.props.token.symbol !== 'BAT'),
text: 'Hide Tokens',
}),
h(Item, {
onClick: (e) => {
e.stopPropagation()
const url = genAccountLink(this.props.token.address, this.props.network)
global.platform.openWindow({
url
})
this.props.onClose()
},
text: 'View on Etherscan',
}),
])
}

module.exports = connect(mapStateToProps, mapDispatchToProps)(BraveTokenMenuDropdown)
12 changes: 12 additions & 0 deletions brave/ui/app/ducks/metamask/metamask.js
@@ -0,0 +1,12 @@
const reduceMetamask = require('../../../../../ui/app/ducks/metamask/metamask')

module.exports = function (state, action) {
const newState = reduceMetamask(state, action)
newState.batTokenAdded = newState.batTokenAdded || false

if (action.type === 'SET_BAT_TOKEN_ADDED') {
newState.batTokenAdded = action.value
}

return newState
}
24 changes: 24 additions & 0 deletions brave/ui/app/pages/home/home.component.js
@@ -0,0 +1,24 @@
import Home from '../../../../../ui/app/pages/home/home.component'
import PropTypes from 'prop-types'
import actions from '../../store/actions'
import batToken from '../../store/bat-token'

const BraveHome = class BraveHome extends Home {
constructor (props) {
super(props)
}

componentDidMount () {
super.componentDidMount()

const { batTokenAdded } = this.props

if (!batTokenAdded) {
this.props.dispatch(actions.addTokens(batToken))
}
}
}

BraveHome.propTypes['batTokenAdded'] = PropTypes.bool

module.exports = BraveHome
32 changes: 32 additions & 0 deletions brave/ui/app/pages/home/home.container.js
@@ -0,0 +1,32 @@
import Home from './home.component'
import { compose } from 'recompose'
import { connect } from 'react-redux'
import { withRouter } from 'react-router-dom'
import { unconfirmedTransactionsCountSelector } from '../../../../../ui/app/selectors/confirm-transaction'

const mapStateToProps = state => {
const { metamask, appState } = state
const {
lostAccounts,
seedWords,
suggestedTokens,
providerRequests,
batTokenAdded
} = metamask
const { forgottenPassword } = appState

return {
lostAccounts,
forgottenPassword,
seedWords,
suggestedTokens,
unconfirmedTransactionsCount: unconfirmedTransactionsCountSelector(state),
providerRequests,
batTokenAdded
}
}

export default compose(
withRouter,
connect(mapStateToProps)
)(Home)
1 change: 1 addition & 0 deletions brave/ui/app/pages/home/index.js
@@ -0,0 +1 @@
export { default } from './home.container'
112 changes: 112 additions & 0 deletions brave/ui/app/pages/routes/index.js
@@ -0,0 +1,112 @@
const Routes = require('../../../../../ui/app/pages/routes')

import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { compose } from 'recompose'
import { withRouter } from 'react-router-dom'

import {
getMetaMaskAccounts,
getNetworkIdentifier,
preferencesSelector
} from '../../../../../ui/app/selectors/selectors'
import {
submittedPendingTransactionsSelector
} from '../../../../../ui/app/selectors/transactions'

import actions from '../../store/actions'

function mapStateToProps(state) {
const { appState, metamask } = state
const {
networkDropdownOpen,
sidebar,
alertOpen,
alertMessage,
isLoading,
loadingMessage,
} = appState

const accounts = getMetaMaskAccounts(state)
const { autoLogoutTimeLimit = 0 } = preferencesSelector(state)

const {
identities,
address,
keyrings,
isInitialized,
seedWords,
unapprovedTxs,
lostAccounts,
unapprovedMsgCount,
unapprovedPersonalMsgCount,
unapprovedTypedMessagesCount,
providerRequests,
batTokenAdded
} = metamask
const selected = address || Object.keys(accounts)[0]

return {
// state from plugin
networkDropdownOpen,
sidebar,
alertOpen,
alertMessage,
isLoading,
loadingMessage,
isInitialized,
isUnlocked: state.metamask.isUnlocked,
selectedAddress: state.metamask.selectedAddress,
currentView: state.appState.currentView,
activeAddress: state.appState.activeAddress,
transForward: state.appState.transForward,
isOnboarding: Boolean(seedWords || !isInitialized),
isPopup: state.metamask.isPopup,
seedWords: state.metamask.seedWords,
submittedPendingTransactions: submittedPendingTransactionsSelector(state),
unapprovedTxs,
unapprovedMsgs: state.metamask.unapprovedMsgs,
unapprovedMsgCount,
unapprovedPersonalMsgCount,
unapprovedTypedMessagesCount,
menuOpen: state.appState.menuOpen,
network: state.metamask.network,
provider: state.metamask.provider,
forgottenPassword: state.appState.forgottenPassword,
lostAccounts,
frequentRpcListDetail: state.metamask.frequentRpcListDetail || [],
currentCurrency: state.metamask.currentCurrency,
isMouseUser: state.appState.isMouseUser,
isRevealingSeedWords: state.metamask.isRevealingSeedWords,
Qr: state.appState.Qr,
welcomeScreenSeen: state.metamask.welcomeScreenSeen,
providerId: getNetworkIdentifier(state),
autoLogoutTimeLimit,

identities,
selected,
keyrings,
providerRequests,
batTokenAdded
}
}

function mapDispatchToProps(dispatch) {
return {
dispatch,
hideSidebar: () => dispatch(actions.hideSidebar()),
showNetworkDropdown: () => dispatch(actions.showNetworkDropdown()),
hideNetworkDropdown: () => dispatch(actions.hideNetworkDropdown()),
setCurrentCurrencyToUSD: () => dispatch(actions.setCurrentCurrency('usd')),
toggleAccountMenu: () => dispatch(actions.toggleAccountMenu()),
setMouseUserState: (isMouseUser) => dispatch(actions.setMouseUserState(isMouseUser)),
setLastActiveTime: () => dispatch(actions.setLastActiveTime()),
}
}

Routes.propTypes['batTokenAdded'] = PropTypes.bool

module.exports = compose(
withRouter,
connect(mapStateToProps, mapDispatchToProps)
)(Routes)
40 changes: 40 additions & 0 deletions brave/ui/app/store/actions.js
@@ -0,0 +1,40 @@
const MetaMaskActions = require('../../../../ui/app/store/actions')

MetaMaskActions.addToken = addToken
MetaMaskActions.setBatTokenAdded = setBatTokenAdded
MetaMaskActions.SET_BAT_TOKEN_ADDED = 'SET_BAT_TOKEN_ADDED'

function setBatTokenAdded () {
return (dispatch) => {
background.setBatTokenAdded((err) => {
if (err) {
return dispatch(actions.displayWarning(err.message))
}
})
dispatch({
type: actions.SET_BAT_TOKEN_ADDED,
value: true
})
}
}

function addToken (address, symbol, decimals, image) {
return (dispatch) => {
dispatch(actions.showLoadingIndication())
return new Promise((resolve, reject) => {
background.addToken(address, symbol, decimals, image, (err, tokens) => {
dispatch(actions.hideLoadingIndication())
if (err) {
dispatch(actions.displayWarning(err.message))
reject(err)
} else if (symbol === 'BAT') {
dispatch(actions.setBatTokenAdded())
}
dispatch(actions.updateTokens(tokens))
resolve(tokens)
})
})
}
}

module.exports = MetaMaskActions
10 changes: 10 additions & 0 deletions brave/ui/app/store/bat-token.js
@@ -0,0 +1,10 @@
export default {
'0x0D8775F648430679A709E98d2b0Cb6250d2887EF': {
'name': 'Basic Attention Token',
'logo': 'BAT_icon.svg',
'erc20': true,
'symbol': 'BAT',
'decimals': 18,
'address' :'0x0D8775F648430679A709E98d2b0Cb6250d2887EF'
}
}

0 comments on commit 1ad2e15

Please sign in to comment.