import { useIframeMode } from '@/components/html-editor/hooks/useIframeMode' import type { TaskArtifact } from '@/components/nova-sdk' import { useDebounceFn } from 'ahooks' import { useEffect } from 'react' import { savePPT } from '../server' import { useEditState } from '@/components/html-editor/hooks/useEditState' import { usePPTEditContext } from '@/components/html-editor/context' interface SliderListItem { content: string file_name: string file_type: string id: string path: string title: string } export interface SlideJson { outline: Array<{ id: string; summary: string; title: string; }>; project_dir: string; slide_ids: string[]; slide_list: SliderListItem[] } export const usePPTEditor = ( id: string, slideRef: React.RefObject, scale: number, slideJson: SlideJson | undefined, artifact: TaskArtifact, taskId: string | null | undefined, editable: boolean ) => { const editorContext = usePPTEditContext() const editState = useEditState() const saveHandler = async (type: 'auto' | 'manual' = 'auto', callback?: () => void) => { if (editState.isSaving) return const slideList = editorContext?.originalSlide.current || [] if (!slideList || slideList.length === 0) return editState.setSaveType(type) editState.setIsSaving(true) try { console.log('保存变更, ppt页数', slideList.length, artifact) await savePPT({ task_id: taskId!, slide_content: JSON.stringify({ ...slideJson, slide_list: slideList, }), slide_path: artifact.path, }) } catch (e) { console.error(e) } finally { editState.setIsSaving(false) editState.setSaveType(null) setTimeout(() => { callback?.() }, 500); } } const handleSave = useDebounceFn(saveHandler, { wait: 1000 }) const manualSave = () => { handleSave.cancel() saveHandler('manual') } const useIframeReturn = useIframeMode( id, slideRef, { onContentChange: content => { const originalSlide = editorContext?.originalSlide.current || [] if (originalSlide && originalSlide.length) { const slide = originalSlide.find(s => s.id === id) if (slide) { console.log('内容变更写入', id) slide.content = content } handleSave.run('auto'); } }, onHistoryChange: (_state, instance) => { editState.handleHistoryChangeEvent(instance) }, enabled: editable }, scale, ) const { selectedElement, editor, tipPosition } = useIframeReturn useEffect(() => { const hasActive = editor?.EditorRegistry.hasActiveEditor() const reWriteState = { ...useIframeReturn } if (hasActive && selectedElement) { // 有激活的实例且为当前的实例 editorContext?.setState(reWriteState) } else if (!selectedElement && !hasActive) { // 失焦后清空所有状态,关闭tip reWriteState.position = null reWriteState.tipPosition = null editorContext?.setState(reWriteState) } }, [selectedElement, editor, tipPosition]) return { ...editState, handleSave, manualSave, } }