import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import availableCurrencies from '../../../helpers/constants/available-conversions.json'; import { TYPOGRAPHY, COLORS } from '../../../helpers/constants/design-system'; import Dropdown from '../../../components/ui/dropdown'; import ToggleButton from '../../../components/ui/toggle-button'; import locales from '../../../../app/_locales/index.json'; import Jazzicon from '../../../components/ui/jazzicon'; import BlockieIdenticon from '../../../components/ui/identicon/blockieIdenticon'; import Typography from '../../../components/ui/typography'; import { EVENT } from '../../../../shared/constants/metametrics'; import { getNumberOfSettingsInSection, handleSettingsRefs, } from '../../../helpers/utils/settings-search'; import { THEME_TYPE } from './settings-tab.constant'; const sortedCurrencies = availableCurrencies.sort((a, b) => { return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()); }); const currencyOptions = sortedCurrencies.map(({ code, name }) => { return { name: `${code.toUpperCase()} - ${name}`, value: code, }; }); const localeOptions = locales.map((locale) => { return { name: `${locale.name}`, value: locale.code, }; }); export default class SettingsTab extends PureComponent { static contextTypes = { t: PropTypes.func, metricsEvent: PropTypes.func, trackEvent: PropTypes.func, }; static propTypes = { setUseBlockie: PropTypes.func, setCurrentCurrency: PropTypes.func, warning: PropTypes.string, updateCurrentLocale: PropTypes.func, currentLocale: PropTypes.string, useBlockie: PropTypes.bool, currentCurrency: PropTypes.string, nativeCurrency: PropTypes.string, useNativeCurrencyAsPrimaryCurrency: PropTypes.bool, setUseNativeCurrencyAsPrimaryCurrencyPreference: PropTypes.func, hideZeroBalanceTokens: PropTypes.bool, setHideZeroBalanceTokens: PropTypes.func, lastFetchedConversionDate: PropTypes.number, selectedAddress: PropTypes.string, tokenList: PropTypes.object, theme: PropTypes.string, setTheme: PropTypes.func, }; settingsRefs = Array( getNumberOfSettingsInSection(this.context.t, this.context.t('general')), ) .fill(undefined) .map(() => { return React.createRef(); }); componentDidUpdate() { const { t } = this.context; handleSettingsRefs(t, t('general'), this.settingsRefs); } componentDidMount() { const { t } = this.context; handleSettingsRefs(t, t('general'), this.settingsRefs); } renderCurrentConversion() { const { t } = this.context; const { currentCurrency, setCurrentCurrency, lastFetchedConversionDate } = this.props; return (
{t('currencyConversion')} {lastFetchedConversionDate ? t('updatedWithDate', [ new Date(lastFetchedConversionDate * 1000).toString(), ]) : t('noConversionDateAvailable')}
setCurrentCurrency(newCurrency)} />
); } renderCurrentLocale() { const { t } = this.context; const { updateCurrentLocale, currentLocale } = this.props; const currentLocaleMeta = locales.find( (locale) => locale.code === currentLocale, ); const currentLocaleName = currentLocaleMeta ? currentLocaleMeta.name : ''; return (
{t('currentLanguage')} {currentLocaleName}
updateCurrentLocale(newLocale)} />
); } renderHideZeroBalanceTokensOptIn() { const { t } = this.context; const { hideZeroBalanceTokens, setHideZeroBalanceTokens } = this.props; return (
{t('hideZeroBalanceTokens')}
setHideZeroBalanceTokens(!value)} offLabel={t('off')} onLabel={t('on')} />
); } renderBlockieOptIn() { const { t } = this.context; const { useBlockie, setUseBlockie, selectedAddress, tokenList } = this.props; const getIconStyles = () => ({ display: 'block', borderRadius: '16px', width: '32px', height: '32px', }); return (
{t('accountIdenticon')} {t('jazzAndBlockies')}
); } renderUsePrimaryCurrencyOptions() { const { t } = this.context; const { nativeCurrency, setUseNativeCurrencyAsPrimaryCurrencyPreference, useNativeCurrencyAsPrimaryCurrency, } = this.props; return (
{t('primaryCurrencySetting')}
{t('primaryCurrencySettingDescription')}
setUseNativeCurrencyAsPrimaryCurrencyPreference(true) } checked={Boolean(useNativeCurrencyAsPrimaryCurrency)} />
setUseNativeCurrencyAsPrimaryCurrencyPreference(false) } checked={!useNativeCurrencyAsPrimaryCurrency} />
); } renderTheme() { const { t } = this.context; const { theme, setTheme } = this.props; const themesOptions = [ { name: t('lightTheme'), value: THEME_TYPE.LIGHT, }, { name: t('darkTheme'), value: THEME_TYPE.DARK, }, { name: t('osTheme'), value: THEME_TYPE.OS, }, ]; const onChange = (newTheme) => { this.context.trackEvent({ category: EVENT.CATEGORIES.SETTINGS, event: 'Theme Changed', properties: { theme_selected: newTheme, }, }); setTheme(newTheme); }; return (
{this.context.t('theme')}
{this.context.t('themeDescription')}
); } render() { const { warning } = this.props; return (
{warning ?
{warning}
: null} {this.renderCurrentConversion()} {this.renderUsePrimaryCurrencyOptions()} {this.renderCurrentLocale()} {this.renderTheme()} {this.renderBlockieOptIn()} {this.renderHideZeroBalanceTokensOptIn()}
); } }