173 lines
5.6 KiB
JavaScript
173 lines
5.6 KiB
JavaScript
'use client';
|
|
|
|
import { useState, useEffect, useCallback } from 'react';
|
|
import { useRouter } from 'next/navigation';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { toast } from 'sonner';
|
|
import axios from 'axios';
|
|
|
|
export default function useImageDatasetDetails(projectId, datasetId) {
|
|
const router = useRouter();
|
|
const { t } = useTranslation();
|
|
|
|
const [currentDataset, setCurrentDataset] = useState(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const [confirming, setConfirming] = useState(false);
|
|
const [unconfirming, setUnconfirming] = useState(false);
|
|
const [saving, setSaving] = useState(false);
|
|
const [datasetsAllCount, setDatasetsAllCount] = useState(0);
|
|
const [datasetsConfirmCount, setDatasetsConfirmCount] = useState(0);
|
|
|
|
// 获取数据集列表信息
|
|
const fetchDatasetsList = useCallback(async () => {
|
|
try {
|
|
// 获取所有数据集以正确统计已确认数量
|
|
const response = await axios.get(`/api/projects/${projectId}/image-datasets?page=1&pageSize=10000`);
|
|
const data = response.data;
|
|
setDatasetsAllCount(data.total || 0);
|
|
setDatasetsConfirmCount(data.data?.filter(d => d.confirmed).length || 0);
|
|
} catch (error) {
|
|
console.error('Failed to fetch datasets list:', error);
|
|
}
|
|
}, [projectId]);
|
|
|
|
// 获取当前数据集详情
|
|
const fetchDatasetDetail = useCallback(async () => {
|
|
try {
|
|
setLoading(true);
|
|
const response = await axios.get(`/api/projects/${projectId}/image-datasets/${datasetId}`);
|
|
setCurrentDataset(response.data);
|
|
} catch (error) {
|
|
console.error('Failed to fetch dataset detail:', error);
|
|
toast.error(t('imageDatasets.fetchDetailFailed', '获取详情失败'));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [projectId, datasetId, t]);
|
|
|
|
useEffect(() => {
|
|
if (projectId && datasetId) {
|
|
fetchDatasetDetail();
|
|
fetchDatasetsList();
|
|
}
|
|
}, [projectId, datasetId, fetchDatasetDetail, fetchDatasetsList]);
|
|
|
|
// 更新数据集
|
|
const updateDataset = useCallback(
|
|
async updates => {
|
|
try {
|
|
setSaving(true);
|
|
await axios.put(`/api/projects/${projectId}/image-datasets/${datasetId}`, updates);
|
|
toast.success(t('imageDatasets.updateSuccess', '更新成功'));
|
|
// 刷新数据
|
|
await fetchDatasetDetail();
|
|
await fetchDatasetsList();
|
|
} catch (error) {
|
|
console.error('Failed to update dataset:', error);
|
|
toast.error(t('imageDatasets.updateFailed', '更新失败'));
|
|
} finally {
|
|
setSaving(false);
|
|
}
|
|
},
|
|
[projectId, datasetId, t, fetchDatasetDetail, fetchDatasetsList]
|
|
);
|
|
|
|
// 翻页导航
|
|
const handleNavigate = useCallback(
|
|
async (direction, skipCurrentId = null) => {
|
|
try {
|
|
// 获取所有数据集(不分页),使用一个足够大的 pageSize
|
|
const response = await axios.get(`/api/projects/${projectId}/image-datasets?page=1&pageSize=10000`);
|
|
const datasets = response.data.data || [];
|
|
|
|
if (datasets.length === 0) {
|
|
router.push(`/projects/${projectId}/image-datasets`);
|
|
return;
|
|
}
|
|
|
|
// 确定当前索引
|
|
let currentIndex = -1;
|
|
const searchId = skipCurrentId || datasetId;
|
|
const currentDatasetId = String(searchId);
|
|
|
|
// 查找当前数据集的索引
|
|
currentIndex = datasets.findIndex(d => String(d.id) === currentDatasetId);
|
|
|
|
// 如果找不到(删除场景或其他原因),从第一个开始
|
|
if (currentIndex === -1) {
|
|
currentIndex = 0;
|
|
}
|
|
|
|
// 计算下一个索引
|
|
let nextIndex;
|
|
if (direction === 'prev') {
|
|
nextIndex = currentIndex > 0 ? currentIndex - 1 : datasets.length - 1;
|
|
} else {
|
|
nextIndex = currentIndex < datasets.length - 1 ? currentIndex + 1 : 0;
|
|
}
|
|
|
|
const nextDataset = datasets[nextIndex];
|
|
if (nextDataset) {
|
|
router.push(`/projects/${projectId}/image-datasets/${nextDataset.id}`);
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to navigate:', error);
|
|
toast.error(t('common.navigationFailed', '导航失败'));
|
|
}
|
|
},
|
|
[projectId, datasetId, router, t]
|
|
);
|
|
|
|
// 确认保留
|
|
const handleConfirm = useCallback(async () => {
|
|
setConfirming(true);
|
|
try {
|
|
await updateDataset({ confirmed: true });
|
|
// 确认后导航到下一条
|
|
await handleNavigate('next');
|
|
} finally {
|
|
setConfirming(false);
|
|
}
|
|
}, [updateDataset, handleNavigate]);
|
|
|
|
// 取消确认
|
|
const handleUnconfirm = useCallback(async () => {
|
|
setUnconfirming(true);
|
|
try {
|
|
await updateDataset({ confirmed: false });
|
|
} finally {
|
|
setUnconfirming(false);
|
|
}
|
|
}, [updateDataset]);
|
|
|
|
// 删除数据集
|
|
const handleDelete = useCallback(async () => {
|
|
if (confirm(t('imageDatasets.deleteConfirm', '确定要删除这个数据集吗?'))) {
|
|
try {
|
|
await axios.delete(`/api/projects/${projectId}/image-datasets/${datasetId}`);
|
|
toast.success(t('imageDatasets.deleteSuccess', '删除成功'));
|
|
// 导航到下一条,传递 datasetId 以便 handleNavigate 知道是删除场景
|
|
await handleNavigate('next', datasetId);
|
|
} catch (error) {
|
|
console.error('Failed to delete dataset:', error);
|
|
toast.error(t('imageDatasets.deleteFailed', '删除失败'));
|
|
}
|
|
}
|
|
}, [projectId, datasetId, handleNavigate, t]);
|
|
|
|
return {
|
|
currentDataset,
|
|
loading,
|
|
saving,
|
|
confirming,
|
|
unconfirming,
|
|
datasetsAllCount,
|
|
datasetsConfirmCount,
|
|
updateDataset,
|
|
handleNavigate,
|
|
handleConfirm,
|
|
handleUnconfirm,
|
|
handleDelete
|
|
};
|
|
}
|