mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
* Style Send Header * Move Send to-row to send view and restyle * Add "Recents" group to select recipient view * Rename SendToRow to AddRecipient * Basic UI and Layout * New ENSInput component * wip - fuzzy search for input * small refactor * Add Dialog * contact list initial * initial error on invalid address * clean up edit * Click to open modal * Create AddToAddressBookModal component * Modal styling and layout * modal i18n * Add to Addressbook * ens wip * ens wip * ENS Resolution * Reset input * Send to explicit address * Happy Path Complete * Add back error checking * Reset send-to when emptying input * Add back warning object * Fix linter * Fix unit test #1 - fix import paths * Remove dead tests * One more to go * Fix all unit tests * add unit test for reducers and actions * test rendering AddRecipient * Add tests for dialog boxes in AddRecipient * Add test for validating * Fix linter * Fix e2e tests * Token send e2e fix * Style View Contact * Style edit-contact * Fix e2e * Fix from-import-beta-ui e2e spec * Make section header say "add recipient” by default * Auto-focus add recipient input * Update placeholder text * Update input title font size * Auto advance to next step if user paste a valid address * Ellipsify address when recipient is selected * Fix app header background color on desktop * Give each form row a margin of 16px * Use .container/.component naming pattern for ens-input * Auto-focus on input when add to addressbook modal is opened; Save on Enter * Fix and add unit test * Fix selectors name in e2e tests * Correct e2e test token amount for address-book-send changes * Adds e2e test for editing a transaction * Delete test/integration/lib/send-new-ui.js * Add tests for amount max button and high value error on send screen to test/e2e/metamask-ui.spec.js * lint and revert to address as object keys * add chainId based on current network to address book entry * fix test * only display contacts for the current network * Improve ENS message when not found on current network * Add error to indicate when network does not support ENS * bump gaba * address book, resolve comments * Move contact-list to its own component * De-duplicate getaddressbook selector and refactor name selection logic in contact-list-tab/ * Use contact-list component in contact-list-tab.component (i.e. in settings) * Improve/fix settings headers for popup and browser views * Lint fixes related to address book updates * Add 'My accounts' page to settings address book * Update add new contact button in settings to match floating circular design * Improve styles of view contact page * Improve styles and labels of the add-contact.component * Further lint fixes related to address book updates * Update unit tests as per address book updates * Ensure that contact list groups are sorted alphabetically * Refactor settings component to use a container for connection to redux; allow display of addressbook name in settings header * Decouple ens-input.component from send context * Add ens resolution to add contact screen in settings * Switching networks when an ens address is shown on send form removes the ens address. * Resolve send screen search for ensAddress to matching address book entry if it exists * Show resolved ens icon and address if exists (settings: add-contact.component) * Make the displayed and copied address in view-contact.component the checksummed address * Default alias state prop in AddToAddressBookModal to empty string * Use keyCode to detect enter key in AddToAddressBookModal * Ensure add-contact component properly updates after QR code detection * Fix display of all recents after clicking 'Load More' in contact list * Fix send screen contact searching after network switching * Code cleanup related to address book changes * Update unit tests for address book changes * Update ENS name not found on network message * Add ens registration error message * Cancel on edit mode takes user back to view screen * Adds support for memo to settings contact list view and edit screens * Modify designs of edit and view contact in popup environment * Update settings content list UX to show split columns in fullscreen and proper internal navigation * Correct background address book API usages in UI
240 lines
6.5 KiB
JavaScript
240 lines
6.5 KiB
JavaScript
import React, { PureComponent } from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import { Switch, Route, matchPath, withRouter } from 'react-router-dom'
|
|
import TabBar from '../../components/app/tab-bar'
|
|
import c from 'classnames'
|
|
import SettingsTab from './settings-tab'
|
|
import NetworksTab from './networks-tab'
|
|
import AdvancedTab from './advanced-tab'
|
|
import InfoTab from './info-tab'
|
|
import SecurityTab from './security-tab'
|
|
import ContactListTab from './contact-list-tab'
|
|
import {
|
|
DEFAULT_ROUTE,
|
|
ADVANCED_ROUTE,
|
|
SECURITY_ROUTE,
|
|
GENERAL_ROUTE,
|
|
ABOUT_US_ROUTE,
|
|
SETTINGS_ROUTE,
|
|
NETWORKS_ROUTE,
|
|
CONTACT_LIST_ROUTE,
|
|
CONTACT_ADD_ROUTE,
|
|
CONTACT_EDIT_ROUTE,
|
|
CONTACT_VIEW_ROUTE,
|
|
CONTACT_MY_ACCOUNTS_ROUTE,
|
|
CONTACT_MY_ACCOUNTS_VIEW_ROUTE,
|
|
CONTACT_MY_ACCOUNTS_EDIT_ROUTE,
|
|
} from '../../helpers/constants/routes'
|
|
|
|
class SettingsPage extends PureComponent {
|
|
static propTypes = {
|
|
addressName: PropTypes.string,
|
|
backRoute: PropTypes.string,
|
|
currentPath: PropTypes.string,
|
|
history: PropTypes.object,
|
|
isAddressEntryPage: PropTypes.bool,
|
|
isPopupView: PropTypes.bool,
|
|
location: PropTypes.object,
|
|
pathnameI18nKey: PropTypes.string,
|
|
initialBreadCrumbRoute: PropTypes.string,
|
|
breadCrumbTextKey: PropTypes.string,
|
|
initialBreadCrumbKey: PropTypes.string,
|
|
t: PropTypes.func,
|
|
}
|
|
|
|
static contextTypes = {
|
|
t: PropTypes.func,
|
|
}
|
|
|
|
render () {
|
|
const { history, backRoute, currentPath } = this.props
|
|
|
|
return (
|
|
<div
|
|
className={c('main-container settings-page', {
|
|
'settings-page--selected': currentPath !== SETTINGS_ROUTE,
|
|
})}
|
|
>
|
|
<div className="settings-page__header">
|
|
{
|
|
currentPath !== SETTINGS_ROUTE && currentPath !== NETWORKS_ROUTE && (
|
|
<div
|
|
className="settings-page__back-button"
|
|
onClick={() => history.push(backRoute)}
|
|
/>
|
|
)
|
|
}
|
|
{ this.renderTitle() }
|
|
<div
|
|
className="settings-page__close-button"
|
|
onClick={() => history.push(DEFAULT_ROUTE)}
|
|
/>
|
|
</div>
|
|
<div className="settings-page__content">
|
|
<div className="settings-page__content__tabs">
|
|
{ this.renderTabs() }
|
|
</div>
|
|
<div className="settings-page__content__modules">
|
|
{ this.renderSubHeader() }
|
|
{ this.renderContent() }
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
renderTitle () {
|
|
const { t } = this.context
|
|
const { isPopupView, pathnameI18nKey, addressName } = this.props
|
|
|
|
let titleText
|
|
|
|
if (isPopupView && addressName) {
|
|
titleText = addressName
|
|
} else if (pathnameI18nKey && isPopupView) {
|
|
titleText = t(pathnameI18nKey)
|
|
} else {
|
|
titleText = t('settings')
|
|
}
|
|
|
|
return (
|
|
<div className="settings-page__header__title">
|
|
{titleText}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
renderSubHeader () {
|
|
const { t } = this.context
|
|
const {
|
|
currentPath,
|
|
isPopupView,
|
|
isAddressEntryPage,
|
|
pathnameI18nKey,
|
|
addressName,
|
|
initialBreadCrumbRoute,
|
|
breadCrumbTextKey,
|
|
history,
|
|
initialBreadCrumbKey,
|
|
} = this.props
|
|
|
|
let subheaderText
|
|
|
|
if (isPopupView && isAddressEntryPage) {
|
|
subheaderText = t('settings')
|
|
} else if (initialBreadCrumbKey) {
|
|
subheaderText = t(initialBreadCrumbKey)
|
|
} else {
|
|
subheaderText = t(pathnameI18nKey || 'general')
|
|
}
|
|
|
|
return currentPath !== NETWORKS_ROUTE && (
|
|
<div className="settings-page__subheader">
|
|
<div
|
|
className={c({ 'settings-page__subheader--link': initialBreadCrumbRoute })}
|
|
onClick={() => initialBreadCrumbRoute && history.push(initialBreadCrumbRoute)}
|
|
>{subheaderText}</div>
|
|
{breadCrumbTextKey && <div><span>{'> '}</span>{t(breadCrumbTextKey)}</div>}
|
|
{isAddressEntryPage && <div><span>{' > '}</span>{addressName}</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
renderTabs () {
|
|
const { history, currentPath } = this.props
|
|
const { t } = this.context
|
|
|
|
return (
|
|
<TabBar
|
|
tabs={[
|
|
{ content: t('general'), description: t('generalSettingsDescription'), key: GENERAL_ROUTE },
|
|
{ content: t('advanced'), description: t('advancedSettingsDescription'), key: ADVANCED_ROUTE },
|
|
{ content: t('contactList'), description: t('contactListDescription'), key: CONTACT_LIST_ROUTE },
|
|
{ content: t('securityAndPrivacy'), description: t('securitySettingsDescription'), key: SECURITY_ROUTE },
|
|
{ content: t('networks'), description: t('networkSettingsDescription'), key: NETWORKS_ROUTE },
|
|
{ content: t('about'), description: t('aboutSettingsDescription'), key: ABOUT_US_ROUTE },
|
|
]}
|
|
isActive={key => {
|
|
if (key === GENERAL_ROUTE && currentPath === SETTINGS_ROUTE) {
|
|
return true
|
|
}
|
|
return matchPath(currentPath, { path: key, exact: true })
|
|
}}
|
|
onSelect={key => history.push(key)}
|
|
/>
|
|
)
|
|
}
|
|
|
|
renderContent () {
|
|
return (
|
|
<Switch>
|
|
<Route
|
|
exact
|
|
path={GENERAL_ROUTE}
|
|
component={SettingsTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={ABOUT_US_ROUTE}
|
|
component={InfoTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={ADVANCED_ROUTE}
|
|
component={AdvancedTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={NETWORKS_ROUTE}
|
|
component={NetworksTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={SECURITY_ROUTE}
|
|
component={SecurityTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={CONTACT_LIST_ROUTE}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={CONTACT_ADD_ROUTE}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={CONTACT_MY_ACCOUNTS_ROUTE}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={`${CONTACT_EDIT_ROUTE}/:id`}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={`${CONTACT_VIEW_ROUTE}/:id`}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={`${CONTACT_MY_ACCOUNTS_VIEW_ROUTE}/:id`}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
exact
|
|
path={`${CONTACT_MY_ACCOUNTS_EDIT_ROUTE}/:id`}
|
|
component={ContactListTab}
|
|
/>
|
|
<Route
|
|
component={SettingsTab}
|
|
/>
|
|
</Switch>
|
|
)
|
|
}
|
|
}
|
|
|
|
export default withRouter(SettingsPage)
|