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 ( {text} ); }; const renderDescription = (text) => { return ( {text} ); }; const renderCTA = (id, text, onClick, action) => { return ( ); }; 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'))} {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 = ( {content} ); if (isHtmlError) { return ReactDOMServer.renderToStaticMarkup(errorContent); } return errorContent; }