next.js/test/e2e/app-dir/catch-error/pages/pages-router.tsx
pages-router.tsx61 lines1.4 KB
import { useState } from 'react'
import { unstable_catchError, type ErrorInfo } from 'next/error'

function ErrorFallback(
  { clearError }: { clearError: () => void },
  { error, reset, unstable_retry }: ErrorInfo
) {
  const [retryError, setRetryError] = useState<string | null>(null)

  return (
    <>
      <p id="pages-error-message">{(error as Error).message}</p>
      <button
        id="pages-reset"
        onClick={() => {
          clearError()
          reset()
        }}
      >
        Reset
      </button>
      <button
        id="pages-retry"
        onClick={() => {
          try {
            unstable_retry()
          } catch (error) {
            setRetryError((error as Error).message)
          }
        }}
      >
        Retry
      </button>
      {retryError ? <p id="pages-retry-error">{retryError}</p> : null}
    </>
  )
}

const ErrorBoundary = unstable_catchError(ErrorFallback)

function ErrorThrower({ shouldThrow }: { shouldThrow: boolean }) {
  if (shouldThrow) {
    throw new Error('this is a pages test')
  }

  return null
}

export default function Page() {
  const [shouldThrow, setShouldThrow] = useState(false)

  return (
    <ErrorBoundary clearError={() => setShouldThrow(false)}>
      <button id="pages-trigger" onClick={() => setShouldThrow(true)}>
        Trigger Error!
      </button>
      <ErrorThrower shouldThrow={shouldThrow} />
    </ErrorBoundary>
  )
}
Quest for Codev2.0.0
/
SIGN IN