"use client" import { cn } from "@mdxui/primitives/lib/utils" import { Button } from "@mdxui/primitives/button" import { Textarea } from "@mdxui/primitives/textarea" import { Label } from "@mdxui/primitives/label" import { Badge } from "@mdxui/primitives/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@mdxui/primitives/select" import { useState } from "react" import type { Severity, ErrorReportData, ErrorReportUser, ErrorDetails, ErrorReportMetadata } from "./types" const severityOptions: Array<{ value: Severity; label: string; variant: 'secondary' | 'outline' | 'warning' | 'destructive' }> = [ { value: 'low', label: 'Low', variant: 'secondary' }, { value: 'medium', label: 'Medium', variant: 'outline' }, { value: 'high', label: 'High', variant: 'warning' }, { value: 'critical', label: 'Critical', variant: 'destructive' }, ] interface ErrorReportContentProps { showSeverity?: boolean errorDetails?: ErrorDetails user?: ErrorReportUser context?: Record captureMetadata?: boolean onSubmit?: (data: ErrorReportData) => Promise | void apiEndpoint?: string submitLabel?: string onSuccess: () => void onError: (error: string) => void } function captureCurrentMetadata(): ErrorReportMetadata { return { url: window.location.href, timestamp: new Date().toISOString(), viewport: { width: window.innerWidth, height: window.innerHeight }, userAgent: navigator.userAgent, } } export function ErrorReportContent({ showSeverity = true, errorDetails, user, context, captureMetadata = true, onSubmit, apiEndpoint, submitLabel = "Submit Report", onSuccess, onError, }: ErrorReportContentProps) { const [description, setDescription] = useState("") const [severity, setSeverity] = useState("medium") const [isSubmitting, setIsSubmitting] = useState(false) const [errors, setErrors] = useState>({}) const validate = (): boolean => { const newErrors: Record = {} if (description.trim().length < 10) { newErrors.description = "Description must be at least 10 characters" } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = async () => { if (!validate()) return setIsSubmitting(true) const data: ErrorReportData = { description: description.trim(), severity, errorDetails, user, context, metadata: captureMetadata ? captureCurrentMetadata() : undefined, } try { if (onSubmit) { await onSubmit(data) } else if (apiEndpoint) { const response = await fetch(apiEndpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }) if (!response.ok) { throw new Error(`Failed to submit: ${response.statusText}`) } } onSuccess() } catch (err) { onError(err instanceof Error ? err.message : "Failed to submit report") } finally { setIsSubmitting(false) } } const isValid = description.trim().length >= 10 return (
{/* Description textarea */}