/** * Session状态轮询Hook(Postgres-Only架构) * * 功能: * 1. 智能轮询任务状态(自动串行,防并发) * 2. 状态变化时自动停止轮询 * 3. 组件卸载时自动清理 * * 参考:ASL模块的 useScreeningTask */ import { useQuery } from '@tanstack/react-query'; import * as api from '../../../api/toolC'; interface UseSessionStatusOptions { sessionId: string | null; jobId: string | null; enabled?: boolean; } /** * 使用Session状态Hook * * @param sessionId - Session ID * @param jobId - Job ID * @param enabled - 是否启用轮询 * @returns 状态数据和控制方法 */ export function useSessionStatus({ sessionId, jobId, enabled = true, }: UseSessionStatusOptions) { const { data, isLoading, error, refetch } = useQuery({ queryKey: ['sessionStatus', sessionId, jobId], queryFn: async () => { if (!sessionId || !jobId) { throw new Error('sessionId or jobId is required'); } const response = await api.getSessionStatus(sessionId, jobId); return response.data; }, enabled: enabled && !!sessionId && !!jobId, refetchInterval: (query) => { const status = query.state.data?.status; // ✅ 完成或失败时停止轮询 if (status === 'ready' || status === 'error') { return false; } // ✅ 处理中时每2秒轮询(React Query 自动保证串行) return 2000; }, staleTime: 0, // 始终视为过时,确保轮询生效 retry: 1, // 失败重试1次 }); // 解析状态数据 const statusInfo = data; const status = statusInfo?.status || 'processing'; const progress = statusInfo?.progress || 0; const session = statusInfo?.session; // 判断各种状态 const isProcessing = status === 'processing'; const isReady = status === 'ready'; const isError = status === 'error'; return { // 状态数据 status, progress, session, // 状态标志 isProcessing, isReady, isError, isLoading, // 错误信息 error, // 手动刷新 refetch, }; }