import { Box, Button, Text } from '@chakra-ui/react'; import React from 'react'; import { route } from 'nextjs-routes'; import getErrorCauseStatusCode from 'lib/errors/getErrorCauseStatusCode'; import getErrorObjStatusCode from 'lib/errors/getErrorObjStatusCode'; import getResourceErrorPayload from 'lib/errors/getResourceErrorPayload'; import AppErrorIcon from './AppErrorIcon'; import AppErrorTitle from './AppErrorTitle'; import AppErrorBlockConsensus from './custom/AppErrorBlockConsensus'; import AppErrorInvalidTxHash from './custom/AppErrorInvalidTxHash'; import AppErrorTooManyRequests from './custom/AppErrorTooManyRequests'; interface Props { className?: string; error: Error | undefined; } const ERROR_TEXTS: Record = { '404': { title: 'Page not found', text: 'This page is no longer explorable! If you are lost, use the search bar to find what you are looking for.', }, '422': { title: 'Request cannot be processed', text: 'Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info.', }, '500': { title: 'Oops! Something went wrong', text: 'An unexpected error has occurred. Try reloading the page, or come back soon and try again.', }, }; const AppError = ({ error, className }: Props) => { const content = (() => { const resourceErrorPayload = getResourceErrorPayload(error); const messageInPayload = resourceErrorPayload && typeof resourceErrorPayload === 'object' && 'message' in resourceErrorPayload && typeof resourceErrorPayload.message === 'string' ? resourceErrorPayload.message : undefined; const isInvalidTxHash = error?.message?.includes('Invalid tx hash'); const isBlockConsensus = messageInPayload?.includes('Block lost consensus'); if (isInvalidTxHash) { return ; } if (isBlockConsensus) { const hash = resourceErrorPayload && typeof resourceErrorPayload === 'object' && 'hash' in resourceErrorPayload && typeof resourceErrorPayload.hash === 'string' ? resourceErrorPayload.hash : undefined; return ; } const statusCode = getErrorCauseStatusCode(error) || getErrorObjStatusCode(error); switch (statusCode) { case 429: { return ; } default: { const { title, text } = ERROR_TEXTS[String(statusCode)] ?? ERROR_TEXTS[500]; return ( <> { text } ); } } })(); return ( { content } ); }; export default React.memo(AppError);