diff --git a/frontend/src/pages/ProcessingPage.tsx b/frontend/src/pages/ProcessingPage.tsx index 0a24012..572947f 100644 --- a/frontend/src/pages/ProcessingPage.tsx +++ b/frontend/src/pages/ProcessingPage.tsx @@ -8,18 +8,21 @@ import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { useToast } from '@/components/ui/toast' import { useUploadStore } from '@/store/uploadStore' -import { apiClient } from '@/services/api' +import { apiClientV2 } from '@/services/apiV2' import { Play, CheckCircle, FileText, AlertCircle, Clock, Activity, Loader2 } from 'lucide-react' export default function ProcessingPage() { const { t } = useTranslation() const navigate = useNavigate() const { toast } = useToast() - const { batchId, files } = useUploadStore() + const { batchId } = useUploadStore() + + // In V2, batchId is actually a task_id (string) + const taskId = batchId ? String(batchId) : null // Start OCR processing const processOCRMutation = useMutation({ - mutationFn: () => apiClient.processOCR({ batch_id: batchId! }), + mutationFn: () => apiClientV2.startTask(taskId!), onSuccess: () => { toast({ title: '開始處理', @@ -36,16 +39,16 @@ export default function ProcessingPage() { }, }) - // Poll batch status - const { data: batchStatus } = useQuery({ - queryKey: ['batchStatus', batchId], - queryFn: () => apiClient.getBatchStatus(batchId!), - enabled: !!batchId, + // Poll task status + const { data: taskDetail } = useQuery({ + queryKey: ['taskDetail', taskId], + queryFn: () => apiClientV2.getTask(taskId!), + enabled: !!taskId, refetchInterval: (query) => { const data = query.state.data if (!data) return 2000 // Stop polling if completed or failed - if (data.batch.status === 'completed' || data.batch.status === 'failed') { + if (data.status === 'completed' || data.status === 'failed') { return false } return 2000 // Poll every 2 seconds @@ -54,19 +57,19 @@ export default function ProcessingPage() { // Auto-redirect when completed useEffect(() => { - if (batchStatus?.batch.status === 'completed') { + if (taskDetail?.status === 'completed') { setTimeout(() => { - navigate('/results') + navigate('/tasks') }, 1000) } - }, [batchStatus?.batch.status, navigate]) + }, [taskDetail?.status, navigate]) const handleStartProcessing = () => { processOCRMutation.mutate() } const handleViewResults = () => { - navigate('/results') + navigate('/tasks') } const getStatusBadge = (status: string) => { @@ -82,8 +85,21 @@ export default function ProcessingPage() { } } - // Show helpful message when no batch is selected - if (!batchId) { + const getProgressPercentage = (status: string) => { + switch (status) { + case 'completed': + return 100 + case 'processing': + return 50 + case 'failed': + return 100 + default: + return 0 + } + } + + // Show helpful message when no task is selected + if (!taskId) { return (
- {t('processing.noBatchMessage', { defaultValue: '尚未選擇任何批次。請先上傳檔案以建立批次。' })} + {t('processing.noBatchMessage', { defaultValue: '尚未選擇任何任務。請先上傳檔案以建立任務。' })}
已完成
-- {batchStatus.files.filter((f) => f.status === 'completed').length} -
-處理中
-- {batchStatus.files.filter((f) => f.status === 'processing').length} +
檔案名稱
++ {taskDetail.filename || '未知檔案'}
失敗
-- {batchStatus.files.filter((f) => f.status === 'failed').length} -
+ {taskDetail.processing_time_ms && ( +處理時間
++ {(taskDetail.processing_time_ms / 1000).toFixed(2)}s +
+總計
-{batchStatus.files.length}
-處理失敗
+{taskDetail.error_message}
- {file.filename} -
-
-
-