All files / src/app global-error.tsx

0% Statements 0/66
100% Branches 0/0
0% Functions 0/1
0% Lines 0/66

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67                                                                                                                                     
'use client';

import { useEffect } from 'react';
import { ErrorPage } from '@/components/shared/ErrorPage';
import { logError } from '@/lib/errors/error-analytics';
import { classifyError } from '@/lib/errors/error-classifier';
import { getErrorMessage } from '@/lib/errors/error-messages';

/**
 * Global Error Boundary
 *
 * Catches unhandled errors at the application level.
 * Logs with critical severity and provides user-friendly recovery.
 */
export default function GlobalError({
  error,
  reset,
}: {
  error: Error & { digest?: string };
  reset: () => void;
}) {
  useEffect(() => {
    // Log with critical severity for global errors
    logError(error, {
      context: 'global',
      digest: error.digest,
      severity: 'critical',
    });
  }, [error]);

  // Classify the error to determine messaging
  const classified = classifyError(error);
  const messages = getErrorMessage(classified.type);

  // Map error type to ErrorPage variant
  const getVariant = () => {
    switch (classified.type) {
      case 'not_found':
        return 'not-found';
      case 'authentication':
      case 'authorization':
        return 'unauthorized';
      case 'server':
        return 'server';
      default:
        return 'error';
    }
  };

  return (
    <html>
      <body className="bg-white dark:bg-gray-900">
        <ErrorPage
          title={messages.title}
          message={messages.message}
          variant={getVariant()}
          errorCode={error.digest}
          showRetry={classified.isRetryable}
          showHome
          showSupport
          onRetry={reset}
        />
      </body>
    </html>
  );
}