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 useQuestionGeneration(projectId) {
|
||
const { t } = useTranslation();
|
||
const [processing, setProcessing] = useState(false);
|
||
const [progress, setProgress] = useState({
|
||
total: 0,
|
||
completed: 0,
|
||
percentage: 0,
|
||
questionCount: 0
|
||
});
|
||
|
||
const resetProgress = useCallback(() => {
|
||
setTimeout(() => {
|
||
setProgress({
|
||
total: 0,
|
||
completed: 0,
|
||
percentage: 0,
|
||
questionCount: 0
|
||
});
|
||
}, 500);
|
||
}, []);
|
||
|
||
const handleGenerateQuestions = 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}/questions`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({
|
||
model: selectedModelInfo,
|
||
language: currentLanguage,
|
||
enableGaExpansion: true
|
||
})
|
||
});
|
||
|
||
if (!response.ok) {
|
||
const errorData = await response.json();
|
||
throw new Error(errorData.error || t('textSplit.generateQuestionsFailed', { chunkId }));
|
||
}
|
||
|
||
const data = await response.json();
|
||
toast.success(
|
||
t('textSplit.questionsGeneratedSuccess', {
|
||
total: data.total
|
||
})
|
||
);
|
||
|
||
if (fetchChunks) fetchChunks();
|
||
return;
|
||
}
|
||
|
||
const response = await request(`/api/projects/${projectId}/tasks`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify({
|
||
taskType: 'question-generation',
|
||
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,
|
||
handleGenerateQuestions,
|
||
resetProgress
|
||
};
|
||
}
|