"use client"; import * as Sentry from "@sentry/nextjs"; import { useEffect, useMemo } from 'react' import { useState } from "react" import { Copy, CheckCircle2, TriangleAlert } from "lucide-react" import Link from 'next/link'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { serviceErrorSchema } from '@/lib/serviceError'; import { SourcebotLogo } from './components/sourcebotLogo'; import { SOURCEBOT_SUPPORT_EMAIL } from "@/lib/constants"; export default function Error({ error, reset }: { error: Error & { digest?: string }, reset: () => void }) { useEffect(() => { Sentry.captureException(error); console.error(error); }, [error]); const { message, errorCode, statusCode } = useMemo(() => { try { const body = JSON.parse(error.message); const { success, data: serviceError } = serviceErrorSchema.safeParse(body); if (success) { return { message: serviceError.message, errorCode: serviceError.errorCode, statusCode: serviceError.statusCode, } } /* eslint-disable no-empty */ } catch {} return { message: error.message, } }, [error]); return (
) } interface ErrorCardProps { message: string errorCode?: string | number statusCode?: string | number onReloadButtonClicked: () => void } function ErrorCard({ message, errorCode, statusCode, onReloadButtonClicked }: ErrorCardProps) { const [copied, setCopied] = useState(null) const copyToClipboard = (text: string, field: string) => { navigator.clipboard.writeText(text) setCopied(field) setTimeout(() => setCopied(null), 2000) } return ( Unexpected Error An unexpected error occurred. Please reload the page and try again. If the issue persists, please contact us.
copyToClipboard(message, "message")} copied={copied === "message"} /> {errorCode && ( copyToClipboard(errorCode.toString(), "errorCode")} copied={copied === "errorCode"} /> )} {statusCode && ( copyToClipboard(statusCode.toString(), "statusCode")} copied={copied === "statusCode"} /> )}
) } interface ErrorFieldProps { label: string value: string | number onCopy: () => void copied: boolean } function ErrorField({ label, value, onCopy, copied }: ErrorFieldProps) { return (
{label}
{value}
) }