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 (
@@ -97,7 +113,7 @@ export default function ProcessingPage() {

- {t('processing.noBatchMessage', { defaultValue: '尚未選擇任何批次。請先上傳檔案以建立批次。' })} + {t('processing.noBatchMessage', { defaultValue: '尚未選擇任何任務。請先上傳檔案以建立任務。' })}

@@ -162,63 +179,58 @@ export default function ProcessingPage() {
{t('processing.status')} - {batchStatus?.batch.progress_percentage || 0}% + {taskDetail ? getProgressPercentage(taskDetail.status) : 0}%
- + - {/* Stats */} - {batchStatus && ( -
-
-
-
- -
-
-

已完成

-

- {batchStatus.files.filter((f) => f.status === 'completed').length} -

-
-
-
+ {/* Task Info */} + {taskDetail && ( +
- +
-

處理中

-

- {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}

-
+ )} +
+ )} + + {/* Error message */} + {taskDetail?.error_message && ( +
+
+ +
+

處理失敗

+

{taskDetail.error_message}

@@ -255,7 +267,7 @@ export default function ProcessingPage() { size="lg" > - {t('common.next')} + 查看任務歷史 )}
@@ -263,64 +275,45 @@ export default function ProcessingPage() { - {/* File List */} - {batchStatus && ( + {/* Task Details Card */} + {taskDetail && (
- 檔案處理狀態 + 任務詳情
-
- {batchStatus.files.map((file) => ( -
-
-
- {file.status === 'completed' ? ( - - ) : file.status === 'processing' ? ( - - ) : file.status === 'failed' ? ( - - ) : ( - - )} -
-
-

- {file.filename} -

-
- {file.processing_time && ( -

- - 處理時間: {file.processing_time.toFixed(2)}s -

- )} - {file.error && ( -

- - {file.error} -

- )} -
-
-
- {getStatusBadge(file.status)} +
+
+ 任務狀態 + {getStatusBadge(taskDetail.status)} +
+
+ 建立時間 + + {new Date(taskDetail.created_at).toLocaleString('zh-TW')} + +
+ {taskDetail.updated_at && ( +
+ 更新時間 + + {new Date(taskDetail.updated_at).toLocaleString('zh-TW')} +
- ))} + )} + {taskDetail.completed_at && ( +
+ 完成時間 + + {new Date(taskDetail.completed_at).toLocaleString('zh-TW')} + +
+ )}