diff --git a/app/(dashboard)/error.tsx b/app/(dashboard)/error.tsx new file mode 100644 index 0000000..126121a --- /dev/null +++ b/app/(dashboard)/error.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { useEffect } from "react"; +import { Button } from "@/components/ui/button"; +import { AlertTriangle, RefreshCw } from "lucide-react"; + +export default function DashboardError({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + // After a redeployment the old chunk URLs 404 — force a hard reload to pick up new manifest + if (error?.name === "ChunkLoadError") { + window.location.reload(); + } + }, [error]); + + if (error?.name === "ChunkLoadError") { + return null; + } + + return ( +
+ +

Something went wrong

+ {error?.message && ( +

{error.message}

+ )} + +
+ ); +} diff --git a/app/global-error.tsx b/app/global-error.tsx new file mode 100644 index 0000000..ff4a7b3 --- /dev/null +++ b/app/global-error.tsx @@ -0,0 +1,32 @@ +"use client"; + +import { useEffect } from "react"; + +// Root-level error boundary — must include its own / +export default function GlobalError({ + error, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + if (error?.name === "ChunkLoadError") { + window.location.reload(); + } + }, [error]); + + return ( + + + {error?.name === "ChunkLoadError" ? null : ( +
+

Application error

+ {error?.digest && ( +

Digest: {error.digest}

+ )} +
+ )} + + + ); +}