2026-03-12 01:28:39 -07:00
|
|
|
"use client";
|
|
|
|
|
|
2026-03-26 16:19:43 +02:00
|
|
|
import "./globals.css";
|
2026-03-21 13:20:13 +05:30
|
|
|
import posthog from "posthog-js";
|
2026-04-14 21:26:00 -07:00
|
|
|
import { useEffect, useMemo } from "react";
|
2026-03-26 16:19:43 +02:00
|
|
|
import { Button } from "@/components/ui/button";
|
|
|
|
|
|
2026-04-14 21:26:00 -07:00
|
|
|
const ISSUES_URL = "https://github.com/MODSetter/SurfSense/issues/new";
|
|
|
|
|
|
|
|
|
|
function buildBasicIssueUrl(error: Error & { digest?: string }) {
|
|
|
|
|
const params = new URLSearchParams();
|
|
|
|
|
const lines = [
|
|
|
|
|
"## Bug Report",
|
|
|
|
|
"",
|
|
|
|
|
"**Describe what happened:**",
|
|
|
|
|
"",
|
|
|
|
|
"",
|
|
|
|
|
"## Diagnostics (auto-filled)",
|
|
|
|
|
"",
|
|
|
|
|
`- **Error:** ${error.message}`,
|
|
|
|
|
...(error.digest ? [`- **Digest:** \`${error.digest}\``] : []),
|
|
|
|
|
`- **Timestamp:** ${new Date().toISOString()}`,
|
|
|
|
|
`- **Page:** \`${typeof window !== "undefined" ? window.location.pathname : "unknown"}\``,
|
|
|
|
|
`- **User Agent:** \`${typeof navigator !== "undefined" ? navigator.userAgent : "unknown"}\``,
|
|
|
|
|
];
|
|
|
|
|
params.set("body", lines.join("\n"));
|
|
|
|
|
params.set("labels", "bug");
|
|
|
|
|
return `${ISSUES_URL}?${params.toString()}`;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-12 01:28:39 -07:00
|
|
|
export default function GlobalError({
|
2026-03-27 03:17:05 -07:00
|
|
|
error,
|
|
|
|
|
reset,
|
2026-03-12 01:28:39 -07:00
|
|
|
}: {
|
2026-03-27 03:17:05 -07:00
|
|
|
error: Error & { digest?: string };
|
|
|
|
|
reset: () => void;
|
2026-03-12 01:28:39 -07:00
|
|
|
}) {
|
2026-03-27 03:17:05 -07:00
|
|
|
useEffect(() => {
|
|
|
|
|
posthog.captureException(error);
|
|
|
|
|
}, [error]);
|
2026-03-12 01:28:39 -07:00
|
|
|
|
2026-04-14 21:26:00 -07:00
|
|
|
const issueUrl = useMemo(() => buildBasicIssueUrl(error), [error]);
|
|
|
|
|
|
2026-03-27 03:17:05 -07:00
|
|
|
return (
|
|
|
|
|
<html lang="en">
|
|
|
|
|
<body>
|
2026-04-14 21:26:00 -07:00
|
|
|
<div className="flex min-h-screen flex-col items-center justify-center gap-4 p-4 text-center">
|
2026-03-27 03:17:05 -07:00
|
|
|
<h2 className="text-xl font-semibold">Something went wrong</h2>
|
2026-04-14 21:26:00 -07:00
|
|
|
<p className="text-sm text-muted-foreground max-w-md">
|
|
|
|
|
An unexpected error occurred. Please try again, or report this issue if it persists.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
{error.digest && (
|
|
|
|
|
<p className="text-xs text-muted-foreground font-mono">Digest: {error.digest}</p>
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
<div className="flex gap-2">
|
|
|
|
|
<Button onClick={reset}>Try again</Button>
|
|
|
|
|
<a
|
|
|
|
|
href={issueUrl}
|
|
|
|
|
target="_blank"
|
|
|
|
|
rel="noopener noreferrer"
|
|
|
|
|
className="inline-flex items-center gap-1.5 rounded-md border border-input bg-background px-4 py-2 text-sm font-medium hover:bg-accent hover:text-accent-foreground transition-colors"
|
|
|
|
|
>
|
|
|
|
|
Report Issue
|
|
|
|
|
</a>
|
|
|
|
|
</div>
|
2026-03-27 03:17:05 -07:00
|
|
|
</div>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
);
|
2026-03-12 01:28:39 -07:00
|
|
|
}
|