File size: 2,929 Bytes
6111b2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
68
69
70
71
72
"use client";

/**

 * Server Error Page — P-1

 *

 * Per-page error boundary for unrecoverable errors within the

 * dashboard layout. Falls back to global-error.tsx if this fails.

 */

interface ErrorProps {
  error: Error & { digest?: string };
  reset: () => void;
}

export default function Error({ error, reset }: ErrorProps) {
  return (
    <div

      className="flex flex-col items-center justify-center min-h-[60vh] p-6 text-center"

      role="alert"

      aria-live="assertive"

    >

      <div className="text-[64px] mb-4" aria-hidden="true">

        🔧

      </div>

      <h1 className="text-[28px] font-bold mb-2 text-[var(--color-text-main)]">

        Internal Server Error

      </h1>

      <p className="text-[15px] text-[var(--color-text-muted)] max-w-[400px] leading-relaxed mb-2">

        Something went wrong while processing your request. Our team has been notified and is

        working on a fix.

      </p>

      {error?.digest && (

        <p className="text-xs text-[var(--color-text-muted)] mb-6 font-mono">

          Error ID: {error.digest}

        </p>

      )}

      {process.env.NODE_ENV === "development" && error?.message && (

        <pre

          className="p-4 rounded-lg bg-red-500/10 border border-red-500/30 text-red-500 text-xs max-w-[600px] overflow-auto text-left mb-6"

          aria-label="Error details"

        >

          {error.message}

          {error.stack && `\n\n${error.stack}`}

        </pre>

      )}

      <div className="flex gap-3">

        <button

          onClick={reset}

          aria-label="Retry loading the page"

          className="px-6 py-2.5 rounded-lg text-white text-sm font-semibold cursor-pointer transition-all duration-200 motion-reduce:transition-none bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] focus:outline-2 focus:outline-offset-2 focus:outline-[var(--color-accent)]"

        >

          Try Again

        </button>

        <a

          href="/dashboard"

          className="px-6 py-2.5 rounded-lg text-[var(--color-text-main)] text-sm font-semibold cursor-pointer transition-all duration-200 motion-reduce:transition-none border border-[var(--color-border)] hover:bg-[var(--color-bg-alt)] no-underline focus:outline-2 focus:outline-offset-2 focus:outline-[var(--color-accent)]"

          aria-label="Return to dashboard"

        >

          Go to Dashboard

        </a>

        <a

          href="/status"

          className="px-6 py-2.5 rounded-lg text-[var(--color-text-main)] text-sm font-semibold cursor-pointer transition-all duration-200 motion-reduce:transition-none border border-[var(--color-border)] hover:bg-[var(--color-bg-alt)] no-underline focus:outline-2 focus:outline-offset-2 focus:outline-[var(--color-accent)]"

          aria-label="Open system status"

        >

          System Status

        </a>

      </div>

    </div>
  );
}