first-update
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user