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 (
{/* Шапка */}
{{
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) => (
))}
)}
);
}