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