import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { AlertTriangle, ChevronDown, ChevronRight } from 'lucide-react' import { IconCopy, IconCopyCheck } from '@tabler/icons-react' import { useTranslation } from '@/i18n/react-i18next-compat' import { useModelLoad } from '@/hooks/useModelLoad' import { toast } from 'sonner' import { useState } from 'react' export default function LoadModelErrorDialog() { const { t } = useTranslation() const { modelLoadError, setModelLoadError } = useModelLoad() const [isCopying, setIsCopying] = useState(false) const [isDetailExpanded, setIsDetailExpanded] = useState(true) const getErrorDetail = (error: string | object | undefined) => { if (!error || typeof error !== 'object') return null if ('details' in error) { return (error as { details?: string }).details } return null } const hasErrorDetail = (error: string | object | undefined) => { return Boolean(getErrorDetail(error)) } const formatErrorForCopy = (error: string | object | undefined) => { if (!error) return '' if (typeof error === 'string') return error if (typeof error === 'object' && 'code' in error && 'message' in error) { const errorObj = error as { code?: string message: string details?: string } let copyText = errorObj.code ? `${errorObj.code}: ${errorObj.message}` : errorObj.message if (errorObj.details) { copyText += `\n\nDetails:\n${errorObj.details}` } return copyText } if (typeof error === 'object') { const errorObj = error as { code?: string message: string details?: string } return errorObj.message } return JSON.stringify(error) } const handleCopy = async () => { setIsCopying(true) try { await navigator.clipboard.writeText(formatErrorForCopy(modelLoadError)) toast.success('Copy successful', { id: 'copy-model', description: 'Model load error information copied to clipboard', }) } catch { toast.error('Failed to copy', { id: 'copy-model-error', description: 'Failed to copy error information to clipboard', }) } finally { setTimeout(() => setIsCopying(false), 2000) } } const handleDialogOpen = (open: boolean) => { setModelLoadError(open ? modelLoadError : undefined) } return (
{t('common:error')} Something went wrong
{typeof modelLoadError === 'object' && modelLoadError && 'code' in modelLoadError && 'message' in modelLoadError ? (
{(modelLoadError as { code?: string }).code && (

{(modelLoadError as { code: string }).code}

)}

{(modelLoadError as { message: string }).message}

) : (

{String(modelLoadError)}

)} {hasErrorDetail(modelLoadError) && (
setIsDetailExpanded(!isDetailExpanded)} className="flex items-center gap-1 text-sm text-main-view-fg/60 hover:text-main-view-fg/80 transition-colors cursor-pointer" role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() setIsDetailExpanded(!isDetailExpanded) } }} > {isDetailExpanded ? ( ) : ( )} Details
{isDetailExpanded && (
{ if (el) { el.scrollTop = el.scrollHeight } }} > {getErrorDetail(modelLoadError)}
)}
)}
) }