import React from 'react'; import type { NextPage } from 'next'; import Link from 'next/link'; import type { Undefinable } from '../utils/typeHelpers'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; interface ErrorProps { statusCode?: number; } const messages = defineMessages({ internalServerError: '{statusCode} - Internal Server Error', serviceUnavailable: '{statusCode} - Service Unavailable', somethingWentWrong: '{statusCode} - Something went wrong', oops: 'Oops', returnHome: 'Return Home', }); const Error: NextPage = ({ statusCode }) => { const intl = useIntl(); const getErrorMessage = (statusCode?: number) => { switch (statusCode) { case 500: return intl.formatMessage(messages.internalServerError, { statusCode: 500, }); case 503: return intl.formatMessage(messages.serviceUnavailable, { statusCode: 503, }); default: return intl.formatMessage(messages.somethingWentWrong, { statusCode: statusCode ?? intl.formatMessage(messages.oops), }); } }; return (
{getErrorMessage(statusCode)}
); }; Error.getInitialProps = async ({ res, err }): Promise => { // Apologies for how gross ternary is but this is just temporary. Honestly, // blame the nextjs docs let statusCode: Undefinable; if (res) { statusCode = res.statusCode; } else { statusCode = err ? err.statusCode : undefined; } return { statusCode }; }; export default Error;