From 43564d1bbac60dbb8abfb27da03381569d84b3d5 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Sun, 22 Feb 2026 21:58:59 +0100 Subject: [PATCH] feat(web): add awesome error pages with glitchtip integration --- apps/web/app/error.tsx | 67 +++++++++++++++++++++++++++++++++++ apps/web/app/global-error.tsx | 59 ++++++++++++++++++++++++++++++ apps/web/app/not-found.tsx | 52 +++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 apps/web/app/error.tsx create mode 100644 apps/web/app/global-error.tsx create mode 100644 apps/web/app/not-found.tsx diff --git a/apps/web/app/error.tsx b/apps/web/app/error.tsx new file mode 100644 index 0000000..b7fd949 --- /dev/null +++ b/apps/web/app/error.tsx @@ -0,0 +1,67 @@ +"use client"; + +import { useEffect } from "react"; +import * as Sentry from "@sentry/nextjs"; +import { Button } from "../src/components/Button"; + +export default function Error({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + // Log the error to Sentry/GlitchTip + Sentry.captureException(error); + console.error("Caught in error.tsx:", error); + }, [error]); + + return ( +
+
+ + Error 500 + +

+ Kritischer Fehler. +

+

+ Ein unerwartetes Problem ist aufgetreten. Unsere Systeme haben den + Vorfall protokolliert. +

+ +
+ + +
+ +
+
+
+ STATUS + + + FAIL + +
+
+ TRACKING + GLITCHTIP_LOGGED +
+ {error.digest && ( +
+ DIGEST + {error.digest} +
+ )} +
+
+
+
+ ); +} diff --git a/apps/web/app/global-error.tsx b/apps/web/app/global-error.tsx new file mode 100644 index 0000000..9d9344a --- /dev/null +++ b/apps/web/app/global-error.tsx @@ -0,0 +1,59 @@ +"use client"; + +import * as Sentry from "@sentry/nextjs"; +import Error from "next/error"; +import { useEffect } from "react"; +import { Inter, Newsreader } from "next/font/google"; +import "./globals.css"; + +const inter = Inter({ subsets: ["latin"], variable: "--font-inter" }); +const newsreader = Newsreader({ + subsets: ["latin"], + variable: "--font-newsreader", + style: "italic", + display: "swap", +}); + +export default function GlobalError({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + Sentry.captureException(error); + }, [error]); + + return ( + + +
+
+ + Root Level Error + +

+ Systemausfall der Hauptebene. +

+

+ Ein kritischer Fehler auf der Root-Layout Ebene hat das Rendering + blockiert. Der Vorfall wurde zur Untersuchung protokolliert. +

+ +
+ +
+
+
+ + + ); +} diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx new file mode 100644 index 0000000..ce9d53a --- /dev/null +++ b/apps/web/app/not-found.tsx @@ -0,0 +1,52 @@ +export const metadata = { + title: "404 - Seite nicht gefunden | Marc Mintel", + description: "Diese Seite konnte leider nicht gefunden werden.", +}; + +import Link from "next/link"; +import { Button } from "../src/components/Button"; + +export default function NotFound() { + return ( +
+
+ + Error 404 + +

+ System-Anomalie. +

+

+ Die angeforderte URL existiert nicht in dieser Zeitleiste. + Möglicherweise wurde die Seite verschoben oder gelöscht. +

+ +
+ + +
+ +
+
+
+ STATUS + 404 NOT_FOUND +
+
+ ACTION + REROUTE_SUGGESTED +
+
+ SYSTEM + ONLINE +
+
+
+
+
+ ); +}