'use client'; import { useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { useTranslation } from 'react-i18next'; import { httpClient } from '@/app/infra/http/HttpClient'; import { useAsyncTask, AsyncTaskStatus } from '@/hooks/useAsyncTask'; import { toast } from 'sonner'; import { Loader2 } from 'lucide-react'; interface KBMigrationDialogProps { open: boolean; onOpenChange: (open: boolean) => void; internalKbCount: number; externalKbCount: number; onMigrationComplete: () => void; } export default function KBMigrationDialog({ open, onOpenChange, internalKbCount, externalKbCount, onMigrationComplete, }: KBMigrationDialogProps) { const { t } = useTranslation(); const [dismissing, setDismissing] = useState(false); const asyncTask = useAsyncTask({ onSuccess: () => { toast.success(t('knowledge.migration.success')); onOpenChange(false); onMigrationComplete(); }, onError: (error) => { toast.error(`${t('knowledge.migration.error')}${error}`); }, }); const handleMigration = async (installPlugin: boolean) => { try { const resp = await httpClient.executeRagMigration(installPlugin); asyncTask.startTask(resp.task_id); } catch { toast.error(t('knowledge.migration.error')); } }; const handleDismiss = async () => { setDismissing(true); try { await httpClient.dismissRagMigration(); onOpenChange(false); } catch { toast.error(t('knowledge.migration.dismissError')); } finally { setDismissing(false); } }; const isRunning = asyncTask.status === AsyncTaskStatus.RUNNING; const isError = asyncTask.status === AsyncTaskStatus.ERROR; const totalCount = internalKbCount + externalKbCount; return ( { if (!isRunning) onOpenChange(v); }} > {t('knowledge.migration.title')} {t('knowledge.migration.description')}
{!isRunning && !isError && (

{t('knowledge.migration.detected', { total: totalCount, internal: internalKbCount, external: externalKbCount, })}

)} {isRunning && (

{t('knowledge.migration.running')}

)} {isError && (

{t('knowledge.migration.error')}

{asyncTask.error && (

{asyncTask.error}

)}
)}
{!isRunning && !isError && ( <>

{t('knowledge.migration.dataOnlyHint')}

)} {isError && ( )} {!isRunning && ( )}
); }