91 lines
2.7 KiB
JavaScript
91 lines
2.7 KiB
JavaScript
|
|
import { useState, useEffect, useCallback, useMemo } from 'react';
|
||
|
|
import axios from 'axios';
|
||
|
|
import { toast } from 'sonner';
|
||
|
|
import { useTranslation } from 'react-i18next';
|
||
|
|
|
||
|
|
export function useImageDatasets(projectId, filters = {}) {
|
||
|
|
const { t } = useTranslation();
|
||
|
|
const [datasets, setDatasets] = useState({ data: [], total: 0 });
|
||
|
|
const [loading, setLoading] = useState(false);
|
||
|
|
const [page, setPage] = useState(1);
|
||
|
|
const pageSize = 20;
|
||
|
|
|
||
|
|
// 使用 useMemo 稳定 filters 对象引用
|
||
|
|
const stableFilters = useMemo(
|
||
|
|
() => ({
|
||
|
|
search: filters.search || '',
|
||
|
|
confirmed: filters.confirmed,
|
||
|
|
minScore: filters.minScore,
|
||
|
|
maxScore: filters.maxScore
|
||
|
|
}),
|
||
|
|
[filters.search, filters.confirmed, filters.minScore, filters.maxScore]
|
||
|
|
);
|
||
|
|
|
||
|
|
// 获取数据集列表
|
||
|
|
const fetchDatasets = useCallback(async () => {
|
||
|
|
try {
|
||
|
|
setLoading(true);
|
||
|
|
let url = `/api/projects/${projectId}/image-datasets?page=${page}&pageSize=${pageSize}`;
|
||
|
|
|
||
|
|
// 搜索条件
|
||
|
|
if (stableFilters.search) {
|
||
|
|
url += `&search=${encodeURIComponent(stableFilters.search)}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 确认状态筛选
|
||
|
|
if (stableFilters.confirmed !== undefined) {
|
||
|
|
url += `&confirmed=${stableFilters.confirmed}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 评分筛选
|
||
|
|
if (stableFilters.minScore !== undefined || stableFilters.maxScore !== undefined) {
|
||
|
|
if (stableFilters.minScore !== undefined) {
|
||
|
|
url += `&minScore=${stableFilters.minScore}`;
|
||
|
|
}
|
||
|
|
if (stableFilters.maxScore !== undefined) {
|
||
|
|
url += `&maxScore=${stableFilters.maxScore}`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const response = await axios.get(url);
|
||
|
|
setDatasets(response.data);
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Failed to fetch datasets:', error);
|
||
|
|
toast.error(t('imageDatasets.fetchFailed', { defaultValue: '获取数据集失败' }));
|
||
|
|
} finally {
|
||
|
|
setLoading(false);
|
||
|
|
}
|
||
|
|
}, [projectId, page, pageSize, stableFilters, t]);
|
||
|
|
|
||
|
|
// 删除数据集
|
||
|
|
const deleteDataset = useCallback(
|
||
|
|
async datasetId => {
|
||
|
|
try {
|
||
|
|
await axios.delete(`/api/projects/${projectId}/image-datasets/${datasetId}`);
|
||
|
|
toast.success(t('imageDatasets.deleteSuccess', { defaultValue: '删除成功' }));
|
||
|
|
fetchDatasets();
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Failed to delete dataset:', error);
|
||
|
|
toast.error(t('imageDatasets.deleteFailed', { defaultValue: '删除失败' }));
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId, fetchDatasets, t]
|
||
|
|
);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
if (projectId) {
|
||
|
|
fetchDatasets();
|
||
|
|
}
|
||
|
|
}, [projectId, page, stableFilters, fetchDatasets]);
|
||
|
|
|
||
|
|
return {
|
||
|
|
datasets,
|
||
|
|
loading,
|
||
|
|
page,
|
||
|
|
setPage,
|
||
|
|
pageSize,
|
||
|
|
fetchDatasets,
|
||
|
|
deleteDataset
|
||
|
|
};
|
||
|
|
}
|