diff --git a/shared/constants/network.js b/shared/constants/network.js index 8036f36d4..178532c47 100644 --- a/shared/constants/network.js +++ b/shared/constants/network.js @@ -166,6 +166,7 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP = { [AVALANCHE_CHAIN_ID]: AVAX_TOKEN_IMAGE_URL, [BSC_CHAIN_ID]: BNB_TOKEN_IMAGE_URL, [POLYGON_CHAIN_ID]: MATIC_TOKEN_IMAGE_URL, + [ROPSTEN_CHAIN_ID]: TEST_ETH_TOKEN_IMAGE_URL, }; export const CHAIN_ID_TO_NETWORK_ID_MAP = Object.values( diff --git a/ui/components/app/metamask-template-renderer/safe-component-list.js b/ui/components/app/metamask-template-renderer/safe-component-list.js index 5e57b954f..29ded06ac 100644 --- a/ui/components/app/metamask-template-renderer/safe-component-list.js +++ b/ui/components/app/metamask-template-renderer/safe-component-list.js @@ -8,6 +8,7 @@ import Box from '../../ui/box'; import MetaMaskTranslation from '../metamask-translation'; import NetworkDisplay from '../network-display'; import TextArea from '../../ui/textarea/textarea'; +import ConfirmationNetworkSwitch from '../../../pages/confirmation/components/confirmation-network-switch'; export const safeComponentList = { MetaMaskTranslation, @@ -25,4 +26,5 @@ export const safeComponentList = { Box, NetworkDisplay, TextArea, + ConfirmationNetworkSwitch, }; diff --git a/ui/components/ui/icon-border/icon-border.scss b/ui/components/ui/icon-border/icon-border.scss index 21911ab87..7d78aa8cb 100644 --- a/ui/components/ui/icon-border/icon-border.scss +++ b/ui/components/ui/icon-border/icon-border.scss @@ -1,6 +1,6 @@ .icon-border { border-radius: 50%; - border: 1px solid var(--color-background-alternative); + border: 1px solid var(--color-border-muted); background: var(--color-background-alternative); display: flex; justify-content: center; diff --git a/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.js b/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.js new file mode 100644 index 000000000..2165331ec --- /dev/null +++ b/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.js @@ -0,0 +1,111 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { useSelector } from 'react-redux'; +import Box from '../../../../components/ui/box'; +import SiteIcon from '../../../../components/ui/site-icon'; +import Typography from '../../../../components/ui/typography/typography'; +import { + COLORS, + TYPOGRAPHY, + FONT_WEIGHT, + DISPLAY, + JUSTIFY_CONTENT, + BLOCK_SIZES, + ALIGN_ITEMS, + TEXT_ALIGN, +} from '../../../../helpers/constants/design-system'; +import { + CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP, + NETWORK_TO_NAME_MAP, +} from '../../../../../shared/constants/network'; + +export default function ConfirmationNetworkSwitch({ newNetwork }) { + const currentNetwork = useSelector((state) => ({ + nickname: state.metamask.provider.nickname, + type: state.metamask.provider.type, + chainId: state.metamask.provider.chainId, + })); + + return ( + + + {currentNetwork.chainId in CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP ? ( + + ) : ( +
+ +
+ )} + + {currentNetwork.nickname || NETWORK_TO_NAME_MAP[currentNetwork.type]} + +
+ + +
+ + + {newNetwork.chainId in CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP ? ( + + ) : ( +
+ +
+ )} + + {newNetwork.name} + +
+ + ); +} + +ConfirmationNetworkSwitch.propTypes = { + newNetwork: PropTypes.shape({ + chainId: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + }), +}; diff --git a/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js b/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js new file mode 100644 index 000000000..46bd2842c --- /dev/null +++ b/ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.stories.js @@ -0,0 +1,22 @@ +import React from 'react'; +import ConfirmationNetworkSwitch from '.'; + +export default { + title: 'Components/Pages/Confirmation/Components/ConfirmationNetworkSwitch', // ui/pages/confirmation/components/confirmation-network-switch/confirmation-network-switch.js + id: __filename, + argTypes: { + newNetwork: { + controls: 'object', + }, + }, + args: { + newNetwork: { + chainId: 'chainId', + name: 'Binance Smart Chain Mainnet', + }, + }, +}; + +export const DefaultStory = (args) => ; + +DefaultStory.storyName = 'Default'; diff --git a/ui/pages/confirmation/components/confirmation-network-switch/index.js b/ui/pages/confirmation/components/confirmation-network-switch/index.js new file mode 100644 index 000000000..e6e188c71 --- /dev/null +++ b/ui/pages/confirmation/components/confirmation-network-switch/index.js @@ -0,0 +1 @@ +export { default } from './confirmation-network-switch'; diff --git a/ui/pages/confirmation/components/confirmation-network-switch/index.scss b/ui/pages/confirmation/components/confirmation-network-switch/index.scss new file mode 100644 index 000000000..21c014ea6 --- /dev/null +++ b/ui/pages/confirmation/components/confirmation-network-switch/index.scss @@ -0,0 +1,52 @@ +.confirmation-network-switch { + &__center-icon { + position: relative; + height: 64px; + } + + &__icon { + width: 64px; + } + + &__check { + width: 32px; + height: 32px; + color: var(--color-primary-inverse); + background-color: var(--color-primary-default); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + filter: drop-shadow(0 1px 5px rgba(0, 0, 0, 0.25)); + + &::before { + content: ''; + position: absolute; + left: 35%; + top: 25%; + } + } + + [dir='rtl'] &__arrow { + transform: rotate(180deg); + } + + &__dashed-line { + width: 130px; + border-bottom: 1px solid var(--color-border-muted); + border-style: dashed; + } + + &__unknown-icon { + color: var(--color-icon-muted); + border-radius: 50%; + border: 1px solid var(--color-border-muted); + background-color: var(--color-background-alternative); + display: inline-flex; + align-items: center; + justify-content: center; + height: 64px; + width: 64px; + } +} diff --git a/ui/pages/confirmation/confirmation.js b/ui/pages/confirmation/confirmation.js index 7f750dd7a..1d09457c5 100644 --- a/ui/pages/confirmation/confirmation.js +++ b/ui/pages/confirmation/confirmation.js @@ -10,15 +10,21 @@ import { useHistory } from 'react-router-dom'; import { isEqual } from 'lodash'; import { produce } from 'immer'; import Box from '../../components/ui/box'; +import Chip from '../../components/ui/chip'; import MetaMaskTemplateRenderer from '../../components/app/metamask-template-renderer'; +import SiteIcon from '../../components/ui/site-icon'; import { DEFAULT_ROUTE } from '../../helpers/constants/routes'; +import { + COLORS, + FLEX_DIRECTION, + SIZES, +} from '../../helpers/constants/design-system'; +import { stripHttpsScheme } from '../../helpers/utils/util'; import { useI18nContext } from '../../hooks/useI18nContext'; import { useOriginMetadata } from '../../hooks/useOriginMetadata'; import { getUnapprovedTemplatedConfirmations } from '../../selectors'; import NetworkDisplay from '../../components/app/network-display/network-display'; -import { COLORS, SIZES } from '../../helpers/constants/design-system'; import Callout from '../../components/ui/callout'; -import SiteOrigin from '../../components/ui/site-origin'; import ConfirmationFooter from './components/confirmation-footer'; import { getTemplateValues, getTemplateAlerts } from './templates'; @@ -191,11 +197,20 @@ export default function ConfirmationPage() { /> ) : null} - - + + diff --git a/ui/pages/confirmation/confirmation.scss b/ui/pages/confirmation/confirmation.scss index 6c930ec4c..ed488f96e 100644 --- a/ui/pages/confirmation/confirmation.scss +++ b/ui/pages/confirmation/confirmation.scss @@ -1,4 +1,5 @@ @import 'components/confirmation-footer/confirmation-footer'; +@import 'components/confirmation-network-switch/index'; @import 'templates/flask/snap-confirm/index'; .confirmation-page { diff --git a/ui/pages/confirmation/templates/switch-ethereum-chain.js b/ui/pages/confirmation/templates/switch-ethereum-chain.js index 3b09fd00e..fb8d2df02 100644 --- a/ui/pages/confirmation/templates/switch-ethereum-chain.js +++ b/ui/pages/confirmation/templates/switch-ethereum-chain.js @@ -1,6 +1,6 @@ import { ethErrors } from 'eth-rpc-errors'; -import { NETWORK_TYPE_RPC } from '../../../../shared/constants/network'; import { + COLORS, JUSTIFY_CONTENT, SEVERITIES, TYPOGRAPHY, @@ -34,9 +34,10 @@ function getValues(pendingApproval, t, actions) { props: { variant: TYPOGRAPHY.H3, align: 'center', - fontWeight: 'bold', + fontWeight: 'normal', boxProps: { - margin: [0, 0, 4], + margin: [0, 0, 2], + padding: [0, 4, 0, 4], }, }, }, @@ -46,9 +47,10 @@ function getValues(pendingApproval, t, actions) { children: t('switchEthereumChainConfirmationDescription'), props: { variant: TYPOGRAPHY.H7, + color: COLORS.TEXT_ALTERNATIVE, align: 'center', boxProps: { - margin: [0, 0, 4], + padding: [0, 4, 0, 4], }, }, }, @@ -59,14 +61,12 @@ function getValues(pendingApproval, t, actions) { justifyContent: JUSTIFY_CONTENT.CENTER, }, children: { - element: 'NetworkDisplay', + element: 'ConfirmationNetworkSwitch', key: 'network-being-switched', props: { - colored: false, - outline: true, - targetNetwork: { - type: pendingApproval.requestData.type || NETWORK_TYPE_RPC, - nickname: pendingApproval.requestData.nickname, + newNetwork: { + chainId: pendingApproval.requestData.chainId, + name: pendingApproval.requestData.nickname, }, }, }, diff --git a/ui/pages/permissions-connect/redirect/index.scss b/ui/pages/permissions-connect/redirect/index.scss index 57bb9611f..9fbb6f121 100644 --- a/ui/pages/permissions-connect/redirect/index.scss +++ b/ui/pages/permissions-connect/redirect/index.scss @@ -13,19 +13,6 @@ &__icons { display: flex; position: relative; - max-width: 300px; - width: 100%; - - &::before { - content: ''; - position: absolute; - width: 90%; - left: 5%; - top: 50%; - border: 1px solid var(--color-border-muted); - border-style: dashed; - z-index: -1; - } } .icon-border { @@ -33,18 +20,38 @@ flex: 0 0 64px; } - &__line { + &__center-icon { position: relative; - display: flex; - align-items: center; - justify-content: center; + height: 64px; + } + + &__icon { + width: 64px; } &__check { - color: var(--color-success-default); + width: 32px; + height: 32px; + color: var(--color-success-inverse); + background-color: var(--color-success-default); border-radius: 50%; - background-color: var(--color-background-default); - margin-left: 40px; - margin-right: 40px; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + filter: drop-shadow(0 1px 5px rgba(0, 0, 0, 0.25)); + + &::before { + content: ''; + position: absolute; + left: 18%; + top: 25%; + } + } + + &__dashed-line { + width: 130px; + border-bottom: 1px solid var(--color-border-muted); + border-style: dashed; } } diff --git a/ui/pages/permissions-connect/redirect/permission-redirect.stories.js b/ui/pages/permissions-connect/redirect/permission-redirect.stories.js deleted file mode 100644 index 331c05ea3..000000000 --- a/ui/pages/permissions-connect/redirect/permission-redirect.stories.js +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; -import PermissionsRedirect from './permissions-redirect.component'; - -export default { - title: 'Pages/PermissionsRedirect', - id: __filename, -}; - -export const PermissionRedirectComponent = () => { - return ( - - ); -}; diff --git a/ui/pages/permissions-connect/redirect/permissions-redirect.component.js b/ui/pages/permissions-connect/redirect/permissions-redirect.component.js index 6f478e813..6076888f7 100644 --- a/ui/pages/permissions-connect/redirect/permissions-redirect.component.js +++ b/ui/pages/permissions-connect/redirect/permissions-redirect.component.js @@ -1,8 +1,14 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import SiteIcon from '../../../components/ui/site-icon'; +import Box from '../../../components/ui/box'; import Typography from '../../../components/ui/typography/typography'; -import { TYPOGRAPHY } from '../../../helpers/constants/design-system'; +import { + TYPOGRAPHY, + DISPLAY, + JUSTIFY_CONTENT, + ALIGN_ITEMS, +} from '../../../helpers/constants/design-system'; import { I18nContext } from '../../../contexts/i18n'; export default function PermissionsRedirect({ subjectMetadata }) { @@ -21,9 +27,15 @@ export default function PermissionsRedirect({ subjectMetadata }) { size={64} className="permissions-redirect__site-icon" /> -
- -
+ + +
+