| | import { useEffect } from 'react' |
| | import { handleClientError } from './use-error-handler' |
| | import { isNextRouterError } from '../../../../client/components/is-next-router-error' |
| | import { MISSING_ROOT_TAGS_ERROR } from '../../../../shared/lib/errors/constants' |
| |
|
| | function readSsrError(): (Error & { digest?: string }) | null { |
| | if (typeof document === 'undefined') { |
| | return null |
| | } |
| |
|
| | const ssrErrorTemplateTag = document.querySelector( |
| | 'template[data-next-error-message]' |
| | ) |
| | if (ssrErrorTemplateTag) { |
| | const message: string = ssrErrorTemplateTag.getAttribute( |
| | 'data-next-error-message' |
| | )! |
| | const stack = ssrErrorTemplateTag.getAttribute('data-next-error-stack') |
| | const digest = ssrErrorTemplateTag.getAttribute('data-next-error-digest') |
| | const error = new Error(message) |
| | if (digest) { |
| | ;(error as any).digest = digest |
| | } |
| | |
| | if (isNextRouterError(error)) { |
| | return null |
| | } |
| | error.stack = stack || '' |
| | return error |
| | } |
| |
|
| | return null |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | export function ReplaySsrOnlyErrors({ |
| | onBlockingError, |
| | }: { |
| | onBlockingError: () => void |
| | }) { |
| | if (process.env.NODE_ENV !== 'production') { |
| | |
| | const ssrError = readSsrError() |
| | |
| | useEffect(() => { |
| | if (ssrError !== null) { |
| | |
| | |
| | |
| | handleClientError(ssrError) |
| |
|
| | |
| | if (ssrError.digest === MISSING_ROOT_TAGS_ERROR) { |
| | onBlockingError() |
| | } |
| | } |
| | }, [ssrError, onBlockingError]) |
| | } |
| |
|
| | return null |
| | } |
| |
|