import { message } from 'antd'; import { useCallback, useEffect, useState } from 'react'; import { updateDocumentWithSettings } from '~/api/dify-dataset/api/documentApi'; import { fetchSegments } from '~/api/dify-dataset/api/segmentApi'; import type { Segment } from '~/api/dify-dataset/type'; import type { Document } from '~/api/dify-dataset/type/documentTypes'; import type { DocumentDetailSegmentationSettings } from '~/types/dify-dataset-manager/document-detail'; import { DEFAULT_DOCUMENT_DETAIL_SETTINGS } from '~/types/dify-dataset-manager/document-detail'; /** * 文档详情状态管理 Hook */ export function useDocumentDetail(datasetId: string, document: Document | null) { // 分段设置状态 const [settings, setSettings] = useState(DEFAULT_DOCUMENT_DETAIL_SETTINGS); // 预览状态 const [previewSegments, setPreviewSegments] = useState([]); const [previewLoading, setPreviewLoading] = useState(false); const [showPreview, setShowPreview] = useState(false); // 保存状态 const [saving, setSaving] = useState(false); // 当文档变化时重置设置 useEffect(() => { if (document) { // 可以从文档中读取已有的设置,这里使用默认值 setSettings(DEFAULT_DOCUMENT_DETAIL_SETTINGS); setPreviewSegments([]); setShowPreview(false); } }, [document?.id]); /** * 更新设置 */ const updateSettings = useCallback((key: keyof DocumentDetailSegmentationSettings, value: any) => { setSettings(prev => ({ ...prev, [key]: value })); }, []); /** * 重置设置 */ const handleReset = useCallback(() => { setSettings(DEFAULT_DOCUMENT_DETAIL_SETTINGS); setPreviewSegments([]); setShowPreview(false); }, []); /** * 预览分段 */ const handlePreview = useCallback(async () => { if (!document) return; setPreviewLoading(true); setShowPreview(true); try { // 获取当前文档的分段作为预览 const response = await fetchSegments(datasetId, document.id, 1, 50); setPreviewSegments(response.data || []); if (response.data?.length === 0) { message.info('该文档暂无分段数据'); } } catch (err: any) { console.error('预览分段失败:', err); message.error(err.message || '预览失败'); } finally { setPreviewLoading(false); } }, [datasetId, document]); /** * 保存并处理 */ const handleSaveAndProcess = useCallback(async () => { if (!document) return; setSaving(true); try { await updateDocumentWithSettings(datasetId, document.id, { indexing_technique: 'high_quality', process_rule: { mode: 'custom', rules: { pre_processing_rules: [ { id: 'remove_extra_spaces', enabled: settings.removeExtraSpaces }, { id: 'remove_urls_emails', enabled: settings.removeUrlsEmails }, ], segmentation: { separator: settings.separator.replace(/\\n/g, '\n'), max_tokens: settings.maxTokens, }, }, }, }); message.success('设置已保存,文档正在重新处理...'); } catch (err: any) { console.error('保存设置失败:', err); message.error(err.message || '保存失败'); } finally { setSaving(false); } }, [datasetId, document, settings]); return { // 状态 settings, previewSegments, previewLoading, showPreview, saving, // 方法 updateSettings, handleReset, handlePreview, handleSaveAndProcess, }; } export type UseDocumentDetailReturn = ReturnType;