1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-30 16:18:07 +01:00
metamask-extension/ui/app/settings.js

489 lines
14 KiB
JavaScript
Raw Normal View History

2017-10-23 07:40:03 +02:00
const { Component } = require('react')
2017-10-25 18:26:05 +02:00
const PropTypes = require('prop-types')
const h = require('react-hyperscript')
const connect = require('./metamask-connect')
const actions = require('./actions')
2017-10-23 07:40:03 +02:00
const infuraCurrencies = require('./infura-conversion.json')
const validUrl = require('valid-url')
const { exportAsFile } = require('./util')
const TabBar = require('./components/tab-bar')
const SimpleDropdown = require('./components/dropdowns/simple-dropdown')
const ToggleButton = require('react-toggle-button')
const locales = require('../../app/_locales/index.json')
const { OLD_UI_NETWORK_TYPE } = require('../../app/scripts/config').enums
2017-10-23 07:40:03 +02:00
const getInfuraCurrencyOptions = () => {
const sortedCurrencies = infuraCurrencies.objects.sort((a, b) => {
return a.quote.name.toLocaleLowerCase().localeCompare(b.quote.name.toLocaleLowerCase())
})
2017-10-23 07:40:03 +02:00
return sortedCurrencies.map(({ quote: { code, name } }) => {
return {
displayValue: `${code.toUpperCase()} - ${name}`,
key: code,
value: code,
}
})
}
const getLocaleOptions = () => {
return locales.map((locale) => {
return {
displayValue: `${locale.name}`,
key: locale.code,
value: locale.code,
}
})
}
2017-10-23 07:40:03 +02:00
class Settings extends Component {
2017-10-25 18:26:05 +02:00
constructor (props) {
super(props)
const { tab } = props
const activeTab = tab === 'info' ? 'info' : 'settings'
2017-10-23 07:40:03 +02:00
this.state = {
2017-10-25 18:26:05 +02:00
activeTab,
2017-10-23 07:40:03 +02:00
newRpc: '',
}
}
2017-10-23 07:40:03 +02:00
renderTabs () {
2017-10-25 18:26:05 +02:00
const { activeTab } = this.state
2017-10-23 07:40:03 +02:00
return h('div.settings__tabs', [
h(TabBar, {
tabs: [
{ content: this.props.t('settings'), key: 'settings' },
{ content: this.props.t('info'), key: 'info' },
2017-10-23 07:40:03 +02:00
],
2017-10-25 18:26:05 +02:00
defaultTab: activeTab,
2017-10-23 07:40:03 +02:00
tabSelected: key => this.setState({ activeTab: key }),
}),
])
}
2017-11-24 02:33:44 +01:00
renderBlockieOptIn () {
const { metamask: { useBlockie }, setUseBlockie } = this.props
2017-11-24 02:33:44 +01:00
return h('div.settings__content-row', [
h('div.settings__content-item', [
h('span', this.props.t('blockiesIdenticon')),
2017-11-24 02:33:44 +01:00
]),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
h(ToggleButton, {
value: useBlockie,
onToggle: (value) => setUseBlockie(!value),
activeLabel: '',
inactiveLabel: '',
2017-11-24 02:33:44 +01:00
}),
]),
]),
])
}
2017-10-23 07:40:03 +02:00
renderCurrentConversion () {
const { metamask: { currentCurrency, conversionDate }, setCurrentCurrency } = this.props
2017-10-23 07:40:03 +02:00
return h('div.settings__content-row', [
h('div.settings__content-item', [
h('span', this.props.t('currentConversion')),
2017-10-23 07:40:03 +02:00
h('span.settings__content-description', `Updated ${Date(conversionDate)}`),
]),
2017-10-23 07:40:03 +02:00
h('div.settings__content-item', [
h('div.settings__content-item-col', [
h(SimpleDropdown, {
placeholder: this.props.t('selectCurrency'),
2017-10-23 07:40:03 +02:00
options: getInfuraCurrencyOptions(),
selectedOption: currentCurrency,
onSelect: newCurrency => setCurrentCurrency(newCurrency),
}),
]),
]),
])
}
renderCurrentLocale () {
2018-03-16 01:29:45 +01:00
const { updateCurrentLocale, currentLocale } = this.props
2018-03-28 03:21:22 +02:00
const currentLocaleMeta = locales.find(locale => locale.code === currentLocale)
return h('div.settings__content-row', [
h('div.settings__content-item', [
h('span', 'Current Language'),
2018-03-28 03:21:22 +02:00
h('span.settings__content-description', `${currentLocaleMeta.name}`),
]),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
h(SimpleDropdown, {
placeholder: 'Select Locale',
options: getLocaleOptions(),
2018-03-16 01:29:45 +01:00
selectedOption: currentLocale,
onSelect: async (newLocale) => {
2018-03-16 01:29:45 +01:00
updateCurrentLocale(newLocale)
},
}),
]),
]),
])
}
2017-10-23 07:40:03 +02:00
renderCurrentProvider () {
const { metamask: { provider = {} } } = this.props
let title, value, color
switch (provider.type) {
2017-10-23 07:40:03 +02:00
case 'mainnet':
title = this.props.t('currentNetwork')
value = this.props.t('mainnet')
2017-10-23 07:40:03 +02:00
color = '#038789'
break
case 'ropsten':
title = this.props.t('currentNetwork')
value = this.props.t('ropsten')
2017-10-23 07:40:03 +02:00
color = '#e91550'
break
case 'kovan':
title = this.props.t('currentNetwork')
value = this.props.t('kovan')
2017-10-23 07:40:03 +02:00
color = '#690496'
break
case 'rinkeby':
title = this.props.t('currentNetwork')
value = this.props.t('rinkeby')
2017-10-23 07:40:03 +02:00
color = '#ebb33f'
break
default:
title = this.props.t('currentRpc')
2017-10-23 07:40:03 +02:00
value = provider.rpcTarget
}
return h('div.settings__content-row', [
h('div.settings__content-item', title),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
h('div.settings__provider-wrapper', [
h('div.settings__provider-icon', { style: { background: color } }),
h('div', value),
]),
]),
]),
])
2017-10-23 07:40:03 +02:00
}
2016-06-21 22:18:32 +02:00
2017-10-23 07:40:03 +02:00
renderNewRpcUrl () {
return (
h('div.settings__content-row', [
h('div.settings__content-item', [
h('span', this.props.t('newRPC')),
2017-10-23 07:40:03 +02:00
]),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
h('input.settings__input', {
placeholder: this.props.t('newRPC'),
2017-10-23 07:40:03 +02:00
onChange: event => this.setState({ newRpc: event.target.value }),
onKeyPress: event => {
if (event.key === 'Enter') {
this.validateRpc(this.state.newRpc)
}
},
}),
h('div.settings__rpc-save-button', {
onClick: event => {
event.preventDefault()
this.validateRpc(this.state.newRpc)
},
}, this.props.t('save')),
2017-10-23 07:40:03 +02:00
]),
]),
])
)
}
validateRpc (newRpc) {
const { setRpcTarget, displayWarning } = this.props
2017-10-23 07:40:03 +02:00
if (validUrl.isWebUri(newRpc)) {
setRpcTarget(newRpc)
} else {
const appendedRpc = `http://${newRpc}`
if (validUrl.isWebUri(appendedRpc)) {
displayWarning(this.props.t('uriErrorMsg'))
2017-10-23 07:40:03 +02:00
} else {
displayWarning(this.props.t('invalidRPC'))
2017-10-23 07:40:03 +02:00
}
}
}
renderStateLogs () {
return (
h('div.settings__content-row', [
h('div.settings__content-item', [
h('div', this.props.t('stateLogs')),
2017-10-23 07:40:03 +02:00
h(
'div.settings__content-description',
this.props.t('stateLogsDescription')
2017-10-23 07:40:03 +02:00
),
]),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
2018-03-26 07:19:42 +02:00
h('button.btn-primary--lg.settings__button', {
2017-10-23 07:40:03 +02:00
onClick (event) {
window.logStateString((err, result) => {
if (err) {
this.state.dispatch(actions.displayWarning(this.props.t('stateLogError')))
} else {
exportAsFile('MetaMask State Logs.json', result)
}
})
2017-10-23 07:40:03 +02:00
},
}, this.props.t('downloadStateLogs')),
2017-10-23 07:40:03 +02:00
]),
]),
])
)
}
renderSeedWords () {
const { revealSeedConfirmation } = this.props
return (
h('div.settings__content-row', [
h('div.settings__content-item', this.props.t('revealSeedWords')),
2017-10-23 07:40:03 +02:00
h('div.settings__content-item', [
h('div.settings__content-item-col', [
2018-03-26 07:19:42 +02:00
h('button.btn-primary--lg.settings__button--red', {
2017-10-23 07:40:03 +02:00
onClick (event) {
event.preventDefault()
revealSeedConfirmation()
},
}, this.props.t('revealSeedWords')),
2017-10-23 07:40:03 +02:00
]),
]),
])
)
}
renderOldUI () {
const { setFeatureFlagToBeta } = this.props
return (
h('div.settings__content-row', [
h('div.settings__content-item', this.props.t('useOldUI')),
h('div.settings__content-item', [
h('div.settings__content-item-col', [
2018-03-26 07:19:42 +02:00
h('button.btn-primary--lg.settings__button--orange', {
onClick (event) {
event.preventDefault()
setFeatureFlagToBeta()
},
}, this.props.t('useOldUI')),
]),
]),
])
)
}
2018-02-08 18:18:25 +01:00
renderResetAccount () {
const { showResetAccountConfirmationModal } = this.props
return h('div.settings__content-row', [
h('div.settings__content-item', this.props.t('resetAccount')),
2018-02-08 18:18:25 +01:00
h('div.settings__content-item', [
h('div.settings__content-item-col', [
2018-03-26 07:19:42 +02:00
h('button.btn-primary--lg.settings__button--orange', {
2018-02-08 18:18:25 +01:00
onClick (event) {
event.preventDefault()
showResetAccountConfirmationModal()
},
}, this.props.t('resetAccount')),
2018-02-08 18:18:25 +01:00
]),
]),
])
}
2017-10-23 07:40:03 +02:00
renderSettingsContent () {
const { warning, isMascara } = this.props
2017-10-23 07:40:03 +02:00
return (
h('div.settings__content', [
warning && h('div.settings__error', warning),
this.renderCurrentConversion(),
this.renderCurrentLocale(),
// this.renderCurrentProvider(),
2017-10-23 07:40:03 +02:00
this.renderNewRpcUrl(),
this.renderStateLogs(),
this.renderSeedWords(),
!isMascara && this.renderOldUI(),
2018-02-08 18:18:25 +01:00
this.renderResetAccount(),
this.renderBlockieOptIn(),
2017-10-23 07:40:03 +02:00
])
)
}
2017-10-25 18:26:05 +02:00
renderLogo () {
return (
h('div.settings__info-logo-wrapper', [
h('img.settings__info-logo', { src: 'images/info-logo.png' }),
])
)
}
2017-10-23 07:40:03 +02:00
2017-10-25 18:26:05 +02:00
renderInfoLinks () {
return (
h('div.settings__content-item.settings__content-item--without-height', [
h('div.settings__info-link-header', this.props.t('links')),
2017-10-25 18:26:05 +02:00
h('div.settings__info-link-item', [
h('a', {
href: 'https://metamask.io/privacy.html',
target: '_blank',
}, [
h('span.settings__info-link', this.props.t('privacyMsg')),
2017-10-25 18:26:05 +02:00
]),
]),
h('div.settings__info-link-item', [
h('a', {
href: 'https://metamask.io/terms.html',
target: '_blank',
}, [
h('span.settings__info-link', this.props.t('terms')),
2017-10-25 18:26:05 +02:00
]),
]),
h('div.settings__info-link-item', [
h('a', {
href: 'https://metamask.io/attributions.html',
target: '_blank',
}, [
h('span.settings__info-link', this.props.t('attributions')),
2017-10-25 18:26:05 +02:00
]),
]),
h('hr.settings__info-separator'),
h('div.settings__info-link-item', [
h('a', {
href: 'https://support.metamask.io',
target: '_blank',
}, [
h('span.settings__info-link', this.props.t('supportCenter')),
2017-10-25 18:26:05 +02:00
]),
]),
h('div.settings__info-link-item', [
h('a', {
href: 'https://metamask.io/',
target: '_blank',
}, [
h('span.settings__info-link', this.props.t('visitWebSite')),
2017-10-25 18:26:05 +02:00
]),
]),
h('div.settings__info-link-item', [
h('a', {
target: '_blank',
href: 'mailto:help@metamask.io?subject=Feedback',
}, [
h('span.settings__info-link', this.props.t('emailUs')),
2017-10-25 18:26:05 +02:00
]),
]),
])
)
}
renderInfoContent () {
const version = global.platform.getVersion()
2017-10-25 18:26:05 +02:00
return (
h('div.settings__content', [
h('div.settings__content-row', [
h('div.settings__content-item.settings__content-item--without-height', [
this.renderLogo(),
h('div.settings__info-item', [
h('div.settings__info-version-header', 'MetaMask Version'),
2018-01-23 01:09:23 +01:00
h('div.settings__info-version-number', `${version}`),
2017-10-25 18:26:05 +02:00
]),
h('div.settings__info-item', [
h(
'div.settings__info-about',
this.props.t('builtInCalifornia')
2017-10-25 18:26:05 +02:00
),
]),
]),
this.renderInfoLinks(),
]),
])
)
2017-10-23 07:40:03 +02:00
}
render () {
const { goHome } = this.props
const { activeTab } = this.state
return (
h('.main-container.settings', {}, [
h('.settings__header', [
h('div.settings__close-button', {
onClick: goHome,
}),
this.renderTabs(),
]),
activeTab === 'settings'
? this.renderSettingsContent()
: this.renderInfoContent(),
])
)
}
}
2017-10-25 18:26:05 +02:00
Settings.propTypes = {
tab: PropTypes.string,
metamask: PropTypes.object,
setUseBlockie: PropTypes.func,
2017-10-25 18:26:05 +02:00
setCurrentCurrency: PropTypes.func,
setRpcTarget: PropTypes.func,
displayWarning: PropTypes.func,
revealSeedConfirmation: PropTypes.func,
setFeatureFlagToBeta: PropTypes.func,
2018-02-08 18:18:25 +01:00
showResetAccountConfirmationModal: PropTypes.func,
2017-10-25 18:26:05 +02:00
warning: PropTypes.string,
goHome: PropTypes.func,
isMascara: PropTypes.bool,
2018-03-19 20:23:06 +01:00
updateCurrentLocale: PropTypes.func,
2018-03-28 03:21:22 +02:00
currentLocale: PropTypes.string,
2018-03-22 03:18:10 +01:00
t: PropTypes.func,
2017-10-25 18:26:05 +02:00
}
2017-10-23 07:40:03 +02:00
const mapStateToProps = state => {
return {
metamask: state.metamask,
warning: state.appState.warning,
isMascara: state.metamask.isMascara,
2018-03-16 01:29:45 +01:00
currentLocale: state.metamask.currentLocale,
}
}
2017-10-23 07:40:03 +02:00
const mapDispatchToProps = dispatch => {
return {
goHome: () => dispatch(actions.goHome()),
setCurrentCurrency: currency => dispatch(actions.setCurrentCurrency(currency)),
setRpcTarget: newRpc => dispatch(actions.setRpcTarget(newRpc)),
displayWarning: warning => dispatch(actions.displayWarning(warning)),
revealSeedConfirmation: () => dispatch(actions.revealSeedConfirmation()),
setUseBlockie: value => dispatch(actions.setUseBlockie(value)),
2018-03-16 01:29:45 +01:00
updateCurrentLocale: key => dispatch(actions.updateCurrentLocale(key)),
setFeatureFlagToBeta: () => {
return dispatch(actions.setFeatureFlag('betaUI', false, 'OLD_UI_NOTIFICATION_MODAL'))
.then(() => dispatch(actions.setNetworkEndpoints(OLD_UI_NETWORK_TYPE)))
},
2018-02-08 18:18:25 +01:00
showResetAccountConfirmationModal: () => {
return dispatch(actions.showModal({ name: 'CONFIRM_RESET_ACCOUNT' }))
},
2017-10-23 07:40:03 +02:00
}
}
2017-10-23 07:40:03 +02:00
module.exports = connect(mapStateToProps, mapDispatchToProps)(Settings)