78 lines
2.4 KiB
JavaScript
78 lines
2.4 KiB
JavaScript
import { useState, useEffect, useCallback } from 'react';
|
|
import axios from 'axios';
|
|
import { toast } from 'sonner';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
export function useImageDatasetDetail(projectId, datasetId) {
|
|
const { t } = useTranslation();
|
|
const [dataset, setDataset] = useState(null);
|
|
const [loading, setLoading] = useState(false);
|
|
const [saving, setSaving] = useState(false);
|
|
|
|
// 获取详情
|
|
const fetchDetail = useCallback(async () => {
|
|
try {
|
|
setLoading(true);
|
|
const response = await axios.get(`/api/projects/${projectId}/image-datasets/${datasetId}`);
|
|
setDataset(response.data);
|
|
} catch (error) {
|
|
console.error('Failed to fetch dataset detail:', error);
|
|
toast.error(t('imageDatasets.fetchDetailFailed', { defaultValue: '获取详情失败' }));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}, [projectId, datasetId, t]);
|
|
|
|
// 更新数据集
|
|
const updateDataset = useCallback(
|
|
async updates => {
|
|
try {
|
|
setSaving(true);
|
|
const response = await axios.put(`/api/projects/${projectId}/image-datasets/${datasetId}`, updates);
|
|
setDataset(response.data);
|
|
toast.success(t('imageDatasets.updateSuccess', { defaultValue: '更新成功' }));
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Failed to update dataset:', error);
|
|
toast.error(t('imageDatasets.updateFailed', { defaultValue: '更新失败' }));
|
|
throw error;
|
|
} finally {
|
|
setSaving(false);
|
|
}
|
|
},
|
|
[projectId, datasetId, t]
|
|
);
|
|
|
|
// AI 重新识别
|
|
const regenerateAnswer = useCallback(async () => {
|
|
try {
|
|
setSaving(true);
|
|
const response = await axios.post(`/api/projects/${projectId}/image-datasets/${datasetId}/regenerate`);
|
|
setDataset(response.data);
|
|
toast.success(t('imageDatasets.regenerateSuccess', { defaultValue: 'AI 识别成功' }));
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Failed to regenerate answer:', error);
|
|
toast.error(t('imageDatasets.regenerateFailed', { defaultValue: 'AI 识别失败' }));
|
|
throw error;
|
|
} finally {
|
|
setSaving(false);
|
|
}
|
|
}, [projectId, datasetId, t]);
|
|
|
|
useEffect(() => {
|
|
if (projectId && datasetId) {
|
|
fetchDetail();
|
|
}
|
|
}, [projectId, datasetId, fetchDetail]);
|
|
|
|
return {
|
|
dataset,
|
|
loading,
|
|
saving,
|
|
updateDataset,
|
|
regenerateAnswer,
|
|
fetchDetail
|
|
};
|
|
}
|