import React, { useState, useEffect } from 'react'; import { X, Box, Loader2, Trash2 } from 'lucide-react'; import { importService, ImportTask } from '../../services/importService'; import { useLanguage } from '../../contexts/LanguageContext'; import { knowledgeGroupService } from '../../services/knowledgeGroupService'; import { KnowledgeGroup } from '../../types'; import { useToast } from '../../contexts/ToastContext'; import ConfirmDialog from '../ConfirmDialog'; interface ImportTasksDrawerProps { isOpen: boolean; onClose: () => void; authToken: string; } export const ImportTasksDrawer: React.FC = ({ isOpen, onClose, authToken, }) => { const { t } = useLanguage(); const { showError } = useToast(); const [importTasks, setImportTasks] = useState([]); const [groups, setGroups] = useState([]); const [isLoading, setIsLoading] = useState(false); const [taskToDelete, setTaskToDelete] = useState(null); const fetchData = async () => { if (!authToken) return; try { setIsLoading(true); const [tasksResult, groupsData] = await Promise.all([ importService.getAll(authToken), knowledgeGroupService.getGroups() ]); setImportTasks(tasksResult.items); // Flatten the groups tree so we can easily find names by ID const flat: KnowledgeGroup[] = []; const walk = (items: KnowledgeGroup[]) => { for (const g of items) { flat.push(g); if (g.children?.length) walk(g.children); } }; if (groupsData) walk(groupsData); setGroups(flat); } catch (error) { console.error('Failed to fetch data:', error); } finally { setIsLoading(false); } }; const handleDelete = async (taskId: string) => { setTaskToDelete(taskId); }; const confirmDelete = async () => { if (!taskToDelete) return; try { await importService.delete(authToken, taskToDelete); fetchData(); } catch (error) { console.error('Failed to delete task:', error); showError(t('deleteTaskFailed')); } finally { setTaskToDelete(null); } }; useEffect(() => { if (isOpen) { fetchData(); } }, [isOpen, authToken]); if (!isOpen) return null; return (
{/* Header */}

{t('importTasksTitle')}

{/* Body */}
{isLoading ? (
) : importTasks.length === 0 ? (
{t('noTasksFound')}
) : (
{importTasks.map(task => ( ))}
{t('sourcePath')} {t('targetGroup')} {t('status')} {t('scheduledAt')} {t('createdAt')} {t('actions')}
{task.sourcePath} {groups.find((g: any) => g.id === task.targetGroupId)?.name || task.targetGroupName || task.sourcePath.split(/[\\/]/).pop() || task.targetGroupId || '-'} {(() => { let colorClass = 'bg-amber-100 text-amber-700'; if (task.status === 'COMPLETED') colorClass = 'bg-emerald-100 text-emerald-700'; else if (task.status === 'FAILED') colorClass = 'bg-red-100 text-red-700'; else if (task.status === 'PROCESSING') colorClass = 'bg-blue-100 text-blue-700'; return ( {task.status} ); })()} {task.status === 'FAILED' && task.logs && (
{task.logs}
)}
{task.scheduledAt ? new Date(task.scheduledAt).toLocaleString() : '-'} {new Date(task.createdAt).toLocaleString()}
)}
setTaskToDelete(null)} />
); };