import React from 'react'; import ReactDOMServer from 'react-dom/server'; import IconTimes from '../../components/ui/icon/icon-times'; import { EXTENSION_ERROR_PAGE_TYPES } from '../../../shared/constants/desktop'; import { TypographyVariant, DISPLAY, FLEX_DIRECTION, AlignItems, TEXT_ALIGN, FONT_WEIGHT, } from '../../helpers/constants/design-system'; import { DEFAULT_ROUTE, SETTINGS_ROUTE } from '../../helpers/constants/routes'; import Typography from '../../components/ui/typography'; import Button from '../../components/ui/button'; import Box from '../../components/ui/box'; import { openCustomProtocol } from '../../../shared/lib/deep-linking'; import { MetaMetricsEventCategory } from '../../../shared/constants/metametrics'; export function renderDesktopError({ type, t, isHtmlError, history, disableDesktop, downloadExtension, downloadDesktopApp, restartExtension, openOrDownloadDesktopApp, trackEvent, }) { let content; const DESKTOP_BUTTON_ACTIONS = { DOWNLOAD_METAMASK_DESKTOP: 'Download MetaMask Desktop', OPEN_METAMASK_DESKTOP: 'Open MetaMask Desktop', DISABLE_METAMASK_DESKTOP: 'Disable MetaMask Desktop', UPDATE_METAMASK_DESKTOP: 'Update MetaMask Desktop', RETURN_SETTINGS_PAGE: 'Return to Settings Page', UPDATE_METAMASK_EXTENSION: 'Update MetaMask Extension', RESTART_METAMASK: 'Restart MetaMask', RETURN_METAMASK_HOME: 'Return MetaMask Home', }; const noop = () => { // do nothing }; const returnExtensionHome = () => { history?.push(DEFAULT_ROUTE); }; const navigateSettings = () => { history?.push(SETTINGS_ROUTE); }; const renderHeader = (text) => { return ( <Typography variant={TypographyVariant.H4} fontWeight={FONT_WEIGHT.BOLD} marginTop={6} marginBottom={6} > {text} </Typography> ); }; const renderDescription = (text) => { return ( <Typography variant={TypographyVariant.Paragraph}>{text}</Typography> ); }; const renderCTA = (id, text, onClick, action) => { return ( <Box marginTop={6}> <Button type="primary" onClick={() => { if (onClick) { onClick(); if (typeof trackEvent === 'function') { trackEvent({ category: MetaMetricsEventCategory.Desktop, event: 'Desktop Button Clicked', properties: { button_action: action, }, }); } } else { noop(); } }} id={id} > {text} </Button> </Box> ); }; const openSettingsOrDownloadMMD = () => { openCustomProtocol('metamask-desktop://pair').catch(() => { window.open('https://metamask.io/download.html', '_blank').focus(); }); }; switch (type) { case EXTENSION_ERROR_PAGE_TYPES.NOT_FOUND: content = ( <> {renderHeader(t('desktopNotFoundErrorTitle'))} {renderDescription(t('desktopNotFoundErrorDescription1'))} {renderDescription(t('desktopNotFoundErrorDescription2'))} {renderCTA( 'desktop-error-button-download-mmd', t('desktopNotFoundErrorCTA'), downloadDesktopApp, DESKTOP_BUTTON_ACTIONS.DOWNLOAD_METAMASK_DESKTOP, )} </> ); break; case EXTENSION_ERROR_PAGE_TYPES.CONNECTION_LOST: content = ( <> {renderHeader(t('desktopConnectionLostErrorTitle'))} {renderDescription(t('desktopConnectionLostErrorDescription'))} {renderCTA( 'desktop-error-button-open-or-download-mmd', t('desktopOpenOrDownloadCTA'), openOrDownloadDesktopApp, )} {renderCTA( 'desktop-error-button-disable-mmd', t('desktopDisableErrorCTA'), disableDesktop, DESKTOP_BUTTON_ACTIONS.DISABLE_METAMASK_DESKTOP, )} </> ); break; case EXTENSION_ERROR_PAGE_TYPES.DESKTOP_OUTDATED: content = ( <> {renderHeader(t('desktopOutdatedErrorTitle'))} {renderDescription(t('desktopOutdatedErrorDescription'))} {renderCTA( 'desktop-error-button-update-mmd', t('desktopOutdatedErrorCTA'), downloadDesktopApp, DESKTOP_BUTTON_ACTIONS.UPDATE_METAMASK_DESKTOP, )} </> ); break; case EXTENSION_ERROR_PAGE_TYPES.EXTENSION_OUTDATED: content = ( <> {renderHeader(t('desktopOutdatedExtensionErrorTitle'))} {renderDescription(t('desktopOutdatedExtensionErrorDescription'))} {renderCTA( 'desktop-error-button-update-extension', t('desktopOutdatedExtensionErrorCTA'), downloadExtension, DESKTOP_BUTTON_ACTIONS.UPDATE_METAMASK_EXTENSION, )} </> ); break; case EXTENSION_ERROR_PAGE_TYPES.CRITICAL_ERROR: content = ( <> {renderHeader(t('desktopConnectionCriticalErrorTitle'))} {renderDescription(t('desktopConnectionCriticalErrorDescription'))} {renderCTA( 'desktop-error-button-restart-mm', t('desktopErrorRestartMMCTA'), restartExtension, DESKTOP_BUTTON_ACTIONS.RESTART_METAMASK, )} {renderCTA( 'desktop-error-button-disable-mmd', t('desktopDisableErrorCTA'), disableDesktop, DESKTOP_BUTTON_ACTIONS.DISABLE_METAMASK_DESKTOP, )} </> ); break; ///: BEGIN:ONLY_INCLUDE_IN(desktop) // This route only exists on the Desktop App case EXTENSION_ERROR_PAGE_TYPES.ROUTE_NOT_FOUND: content = ( <> {renderHeader(t('desktopRouteNotFoundErrorTitle'))} {renderDescription(t('desktopRouteNotFoundErrorDescription'))} {renderCTA( 'desktop-error-button-navigate-settings', t('desktopErrorNavigateSettingsCTA'), navigateSettings, DESKTOP_BUTTON_ACTIONS.RETURN_SETTINGS_PAGE, )} </> ); break; ///: END:ONLY_INCLUDE_IN case EXTENSION_ERROR_PAGE_TYPES.PAIRING_KEY_NOT_MATCH: content = ( <> {renderHeader(t('desktopPairedWarningTitle'))} {renderDescription(t('desktopPairedWarningDescription'))} <Button type="link" onClick={() => { openSettingsOrDownloadMMD(); }} className="desktop-pairing-warning__link" > {t('desktopPairedWarningDeepLink')} </Button> {renderCTA( 'desktop-error-button-navigate-settings', t('desktopErrorNavigateSettingsCTA'), navigateSettings, DESKTOP_BUTTON_ACTIONS.RETURN_SETTINGS_PAGE, )} </> ); break; default: content = ( <> {renderHeader(t('desktopUnexpectedErrorTitle'))} {renderDescription(t('desktopUnexpectedErrorDescription'))} {renderCTA( 'desktop-error-button-return-mm-home', t('desktopUnexpectedErrorCTA'), returnExtensionHome, DESKTOP_BUTTON_ACTIONS.RETURN_METAMASK_HOME, )} </> ); break; } const errorContent = ( <Box display={DISPLAY.FLEX} alignItems={AlignItems.center} textAlign={TEXT_ALIGN.CENTER} flexDirection={FLEX_DIRECTION.COLUMN} marginLeft={6} marginRight={6} marginTop={isHtmlError ? 8 : 6} > <IconTimes size={64} color="var(--color-error-default" /> {content} </Box> ); if (isHtmlError) { return ReactDOMServer.renderToStaticMarkup(errorContent); } return errorContent; }