92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useState, useCallback } from 'react';
|
||
|
|
import { useTranslation } from 'react-i18next';
|
||
|
|
import { selectedModelInfoAtom } from '@/lib/store';
|
||
|
|
import { useAtomValue } from 'jotai/index';
|
||
|
|
import { toast } from 'sonner';
|
||
|
|
import i18n from '@/lib/i18n';
|
||
|
|
import axios from 'axios';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 文件处理的自定义Hook
|
||
|
|
* @param {string} projectId - 项目ID
|
||
|
|
* @returns {Object} - 文件处理状态和操作方法
|
||
|
|
*/
|
||
|
|
export default function useFileProcessing(projectId) {
|
||
|
|
const { t } = useTranslation();
|
||
|
|
const [fileProcessing, setFileProcessing] = useState(false);
|
||
|
|
const [progress, setProgress] = useState({
|
||
|
|
total: 0,
|
||
|
|
completed: 0,
|
||
|
|
percentage: 0,
|
||
|
|
questionCount: 0
|
||
|
|
});
|
||
|
|
const model = useAtomValue(selectedModelInfoAtom);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 重置进度状态
|
||
|
|
*/
|
||
|
|
const resetProgress = useCallback(() => {
|
||
|
|
setTimeout(() => {
|
||
|
|
setProgress({
|
||
|
|
total: 0,
|
||
|
|
completed: 0,
|
||
|
|
percentage: 0,
|
||
|
|
questionCount: 0
|
||
|
|
});
|
||
|
|
}, 1000); // 延迟重置,让用户看到完成的进度
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 处理文件
|
||
|
|
* @param {Array} files - 文件列表
|
||
|
|
* @param {string} pdfStrategy - PDF处理策略
|
||
|
|
* @param {string} selectedViosnModel - 选定的视觉模型
|
||
|
|
*/
|
||
|
|
const handleFileProcessing = useCallback(
|
||
|
|
async (files, pdfStrategy, selectedViosnModel, domainTreeAction) => {
|
||
|
|
try {
|
||
|
|
const currentLanguage = i18n.language === 'zh-CN' ? '中文' : 'en';
|
||
|
|
|
||
|
|
//获取到视觉策略要使用的模型
|
||
|
|
const availableModels = JSON.parse(localStorage.getItem('modelConfigList'));
|
||
|
|
const vsionModel = availableModels.find(m => m.id === selectedViosnModel);
|
||
|
|
|
||
|
|
const response = await axios.post(`/api/projects/${projectId}/tasks`, {
|
||
|
|
taskType: 'file-processing',
|
||
|
|
modelInfo: model,
|
||
|
|
language: currentLanguage,
|
||
|
|
detail: '文件处理任务',
|
||
|
|
note: {
|
||
|
|
vsionModel,
|
||
|
|
projectId,
|
||
|
|
fileList: files,
|
||
|
|
strategy: pdfStrategy,
|
||
|
|
domainTreeAction
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
if (response.data?.code !== 0) {
|
||
|
|
throw new Error(t('textSplit.pdfProcessingFailed') + (response.data?.error || ''));
|
||
|
|
}
|
||
|
|
|
||
|
|
//提示后台任务进行中
|
||
|
|
toast.success(t('textSplit.pdfProcessingToast'));
|
||
|
|
} catch (error) {
|
||
|
|
toast.error(t('textSplit.pdfProcessingFailed') + error.message || '');
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId, t, resetProgress, model]
|
||
|
|
);
|
||
|
|
|
||
|
|
return {
|
||
|
|
fileProcessing,
|
||
|
|
progress,
|
||
|
|
setFileProcessing,
|
||
|
|
setProgress,
|
||
|
|
handleFileProcessing,
|
||
|
|
resetProgress
|
||
|
|
};
|
||
|
|
}
|