Files

95 lines
2.5 KiB
JavaScript

'use client';
import { useState, useEffect, useCallback } from 'react';
/**
* 评估任务详情 Hook
*/
export default function useEvalTaskDetail(projectId, taskId) {
const [task, setTask] = useState(null);
const [results, setResults] = useState([]);
const [stats, setStats] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState('');
// 分页和筛选状态
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(10);
const [filterType, setFilterType] = useState(null);
const [filterCorrect, setFilterCorrect] = useState(null); // null: all, true: correct, false: incorrect
const [total, setTotal] = useState(0);
// 加载任务详情
const loadData = useCallback(async () => {
if (!projectId || !taskId) return;
try {
setLoading(true);
setError('');
// 构建查询参数
const params = new URLSearchParams({
page: page.toString(),
pageSize: pageSize.toString()
});
if (filterType) {
params.append('type', filterType);
}
if (filterCorrect !== null) {
params.append('isCorrect', filterCorrect.toString());
}
const response = await fetch(`/api/projects/${projectId}/eval-tasks/${taskId}?${params.toString()}`);
const result = await response.json();
if (result.code === 0) {
setTask(result.data.task);
setResults(result.data.results || []);
setTotal(result.data.total || 0);
setStats(result.data.stats);
} else {
setError(result.error || '加载失败');
}
} catch (err) {
console.error('加载任务详情失败:', err);
setError('加载失败');
} finally {
setLoading(false);
}
}, [projectId, taskId, page, pageSize, filterType, filterCorrect]);
// 初始加载
useEffect(() => {
loadData();
}, [loadData]);
// 自动刷新进行中的任务 (仅在第一页且无筛选时刷新,避免干扰用户查看历史记录)
useEffect(() => {
if (task?.status !== 0 || page !== 1 || filterType || filterCorrect !== null) return;
const interval = setInterval(loadData, 3000);
return () => clearInterval(interval);
}, [task?.status, page, filterType, filterCorrect, loadData]);
return {
task,
results,
stats,
total,
page,
setPage,
pageSize,
setPageSize,
filterType,
setFilterType,
filterCorrect,
setFilterCorrect,
loading,
error,
setError,
loadData
};
}