import { useParams, Navigate } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { Loader2, ArrowLeft } from 'lucide-react'; import { Link } from 'react-router-dom'; import { StatusBadge } from '../components/StatusBadge'; import { SourceCard } from '../components/SourceCard'; import { PlagiarismReport } from '../components/PlagiarismReport'; import { GostCitation } from '../components/GostCitation'; import { tasksApi } from '../api/client'; import { useAuthStore } from '../store/auth'; import { useTaskWebSocket } from '../hooks/useTaskPolling'; import type { Task as TaskType, SearchResultData, PlagiarismResultData, GostResultData } from '../types'; export function Task() { const { taskId } = useParams<{ taskId: string }>(); const { isAuthenticated } = useAuthStore(); if (!isAuthenticated) return ; if (!taskId) return ; const { data: task, isLoading } = useQuery({ queryKey: ['task', taskId], queryFn: () => tasksApi.get(taskId).then((r) => r.data as TaskType), refetchInterval: (query) => { const status = query.state.data?.status; return (status === 'done' || status === 'failed') ? false : 3000; }, }); useTaskWebSocket(taskId, !!task && task.status !== 'done' && task.status !== 'failed'); if (isLoading) { return (
); } if (!task) { return ; } return (
{/* Шапка */}

{{ search: 'Поиск источников', plagiarism: 'Проверка плагиата', gost: 'ГОСТ библиография', summarize: 'Краткое изложение', }[task.type] || task.type}

{task.public_id}
{/* В процессе */} {(task.status === 'queued' || task.status === 'processing') && (

{task.status === 'queued' ? 'Задача в очереди...' : 'Выполняется...'}

{task.queue_position && (

Позиция: {task.queue_position}

)}

Вы получите email когда задача завершится

)} {/* Ошибка */} {task.status === 'failed' && (

Задача завершилась с ошибкой

{task.error}

)} {/* Результаты поиска */} {task.status === 'done' && task.type === 'search' && task.result && (

Найдено {(task.result as SearchResultData).total} источников

{(task.result as SearchResultData).sources.map((source) => ( ))}
)} {/* Отчёт о плагиате */} {task.status === 'done' && task.type === 'plagiarism' && task.result && (

Результат проверки плагиата

)} {/* ГОСТ библиография */} {task.status === 'done' && task.type === 'gost' && task.result && (

Список литературы (ГОСТ {(task.result as GostResultData).style}-2003)

{(task.result as GostResultData).bibliography.map((entry) => ( ))}
)}
); }