"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';
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}
)
}