Files

117 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2026-03-17 14:36:31 +08:00
'use client';
import { useState, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import i18n from '@/lib/i18n';
import request from '@/lib/util/request';
import { toast } from 'sonner';
export default function useDataCleaning(projectId) {
const { t } = useTranslation();
const [processing, setProcessing] = useState(false);
const [progress, setProgress] = useState({
total: 0,
completed: 0,
percentage: 0,
cleanedCount: 0
});
const resetProgress = useCallback(() => {
setTimeout(() => {
setProgress({
total: 0,
completed: 0,
percentage: 0,
cleanedCount: 0
});
}, 500);
}, []);
const handleDataCleaning = useCallback(
async (chunkIds, selectedModelInfo, fetchChunks) => {
try {
if (!chunkIds || chunkIds.length === 0) return;
if (!selectedModelInfo) {
throw new Error(t('textSplit.selectModelFirst'));
}
setProcessing(true);
if (chunkIds.length === 1) {
const chunkId = chunkIds[0];
const currentLanguage = i18n.language === 'zh-CN' ? '中文' : 'en';
const response = await request(`/api/projects/${projectId}/chunks/${chunkId}/clean`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: selectedModelInfo,
language: currentLanguage
})
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || t('textSplit.dataCleaningFailed', { chunkId }));
}
const data = await response.json();
toast.success(
t('textSplit.dataCleaningSuccess', {
originalLength: data.originalLength,
cleanedLength: data.cleanedLength
})
);
if (fetchChunks) fetchChunks();
return;
}
const response = await request(`/api/projects/${projectId}/tasks`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
taskType: 'data-cleaning',
modelInfo: selectedModelInfo,
language: i18n.language,
detail: '批量数据清洗任务',
note: { chunkIds }
})
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || t('tasks.createFailed'));
}
const data = await response.json();
if (data?.code !== 0) {
throw new Error(data?.message || t('tasks.createFailed'));
}
toast.success(`${t('tasks.createSuccess')}${t('tasks.title')}查看进度`);
} catch (error) {
toast.error(error.message);
} finally {
setProcessing(false);
resetProgress();
}
},
[projectId, t, resetProgress]
);
return {
processing,
progress,
setProgress,
setProcessing,
handleDataCleaning,
resetProgress
};
}