117 lines
3.1 KiB
JavaScript
117 lines
3.1 KiB
JavaScript
'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
|
||
};
|
||
}
|