jan/web-app/src/containers/dialogs/LoadModelErrorDialog.tsx
Louis 8d84c3b884
feat: add model load error handling to improve UX (#5802)
* feat: model load error handling

* chore: clean up

* test: add tests

* fix: provider name
2025-07-18 08:25:54 +05:30

81 lines
2.4 KiB
TypeScript

import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog'
import { Button } from '@/components/ui/button'
import { AlertTriangle } from 'lucide-react'
import { useTranslation } from '@/i18n/react-i18next-compat'
import { useModelLoad } from '@/hooks/useModelLoad'
import { toast } from 'sonner'
export default function LoadModelErrorDialog() {
const { t } = useTranslation()
const { modelLoadError, setModelLoadError } = useModelLoad()
const handleCopy = () => {
navigator.clipboard.writeText(modelLoadError ?? '')
toast.success('Copy successful', {
id: 'copy-model',
description: 'Model load error information copied to clipboard',
})
}
const handleDialogOpen = (open: boolean) => {
setModelLoadError(open ? modelLoadError : undefined)
}
return (
<Dialog open={!!modelLoadError} onOpenChange={handleDialogOpen}>
<DialogContent showCloseButton={false}>
<DialogHeader>
<div className="flex items-start gap-3">
<div className="shrink-0">
<AlertTriangle className="size-4" />
</div>
<div>
<DialogTitle>{t('common:error')}</DialogTitle>
<DialogDescription className="mt-1 text-main-view-fg/70">
Failed to load model
</DialogDescription>
</div>
</div>
</DialogHeader>
<div className="bg-main-view-fg/8 p-2 border border-main-view-fg/5 rounded-lg">
<p
className="text-sm text-main-view-fg/70 leading-relaxed max-h-[200px] overflow-y-auto"
ref={(el) => {
if (el) {
el.scrollTop = el.scrollHeight
}
}}
>
{modelLoadError}
</p>
</div>
<DialogFooter className="flex flex-col gap-2 sm:flex-row sm:justify-right">
<Button
variant="link"
onClick={() => handleCopy()}
className="flex-1 text-right sm:flex-none"
>
{t('common:copy')}
</Button>
<Button
variant="link"
onClick={() => handleDialogOpen(false)}
className="flex-1 text-right sm:flex-none"
>
{t('common:cancel')}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}