| 9e346cc | | | 1 | "use client"; |
| 9e346cc | | | 2 | |
| 9e346cc | | | 3 | import { useEffect } from "react"; |
| 9e346cc | | | 4 | |
| 9e346cc | | | 5 | export default function ErrorBoundary({ |
| 9e346cc | | | 6 | error, |
| 9e346cc | | | 7 | reset, |
| 9e346cc | | | 8 | }: { |
| 9e346cc | | | 9 | error: Error & { digest?: string }; |
| 9e346cc | | | 10 | reset: () => void; |
| 9e346cc | | | 11 | }) { |
| 9e346cc | | | 12 | useEffect(() => { |
| 9e346cc | | | 13 | fetch("/api/dev-errors", { |
| 9e346cc | | | 14 | method: "POST", |
| 9e346cc | | | 15 | headers: { "Content-Type": "application/json" }, |
| 9e346cc | | | 16 | body: JSON.stringify({ |
| 9e346cc | | | 17 | type: "react-error", |
| 9e346cc | | | 18 | message: error.message, |
| 9e346cc | | | 19 | stack: error.stack, |
| 9e346cc | | | 20 | digest: error.digest, |
| 9e346cc | | | 21 | url: window.location.href, |
| 9e346cc | | | 22 | }), |
| 9e346cc | | | 23 | }).catch(() => {}); |
| 9e346cc | | | 24 | }, [error]); |
| 9e346cc | | | 25 | |
| 9e346cc | | | 26 | return ( |
| 9e346cc | | | 27 | <div className="max-w-3xl mx-auto px-4 py-16"> |
| 9e346cc | | | 28 | <h1 className="text-lg" style={{ color: "var(--text-secondary)" }}> |
| 9e346cc | | | 29 | Something went wrong |
| 9e346cc | | | 30 | </h1> |
| 9e346cc | | | 31 | <p |
| 9e346cc | | | 32 | className="text-sm mt-1 mb-4" |
| 9e346cc | | | 33 | style={{ color: "var(--text-muted)" }} |
| 9e346cc | | | 34 | > |
| 9e346cc | | | 35 | {error.message} |
| 9e346cc | | | 36 | </p> |
| 9e346cc | | | 37 | <button |
| 9e346cc | | | 38 | onClick={reset} |
| 9e346cc | | | 39 | className="text-sm px-3 py-1.5" |
| 9e346cc | | | 40 | style={{ |
| 9e346cc | | | 41 | color: "var(--accent)", |
| 9e346cc | | | 42 | border: "1px solid var(--border-subtle)", |
| 9e346cc | | | 43 | }} |
| 9e346cc | | | 44 | > |
| 9e346cc | | | 45 | Try again |
| 9e346cc | | | 46 | </button> |
| 9e346cc | | | 47 | </div> |
| 9e346cc | | | 48 | ); |
| 9e346cc | | | 49 | } |