@@ -30,7 +30,10 @@ export function useNoteAI(editor: Editor | null, noteId: string | null) {
3030 const [ summaryModalOpen , setSummaryModalOpen ] = useState ( false ) ;
3131 const [ convertedKeys , setConvertedKeys ] = useState < Set < number > > ( new Set ( ) ) ;
3232
33- const { loading : aiLoading , data : aiData , error : aiError , needsConfig : aiNeedsConfig , summarize } = useAISummarize ( ) ;
33+ const {
34+ loading : aiLoading , data : aiData , error : aiError , needsConfig : aiNeedsConfig ,
35+ streamingText, isStreaming, summarizeStream, cancelStream,
36+ } = useAISummarize ( ) ;
3437 const { loading : flashcardLoading , generate : generateFlashcards } = useAIFlashcards ( ) ;
3538 const handleSummarizeError = useAIErrorHandler ( 'AI 摘要生成失败' ) ;
3639 const handleFlashcardError = useAIErrorHandler ( 'AI 闪卡生成失败' ) ;
@@ -64,18 +67,18 @@ export function useNoteAI(editor: Editor | null, noteId: string | null) {
6467 return result . cards . length ;
6568 } , [ generateFlashcards , ensureDefaultDeck , createCard , noteId ] ) ;
6669
67- /** 顶栏入口:校验非空后生成摘要并弹出浮层 */
70+ /** 顶栏入口:校验非空后立即弹出浮层并流式生成摘要(P2-12) */
6871 const startSummarize = useCallback ( ( ) => {
6972 if ( ! editor ) return ;
7073 const text = editor . getText ( ) ;
7174 if ( ! text . trim ( ) ) {
7275 toast ( { type : 'warning' , message : '请先写一些笔记内容再生成摘要' } ) ;
7376 return ;
7477 }
75- summarize ( text )
76- . then ( ( ) => setSummaryModalOpen ( true ) )
77- . catch ( handleSummarizeError ) ;
78- } , [ editor , summarize , toast , handleSummarizeError ] ) ;
78+ setConvertedKeys ( new Set ( ) ) ;
79+ setSummaryModalOpen ( true ) ;
80+ summarizeStream ( text ) . catch ( handleSummarizeError ) ;
81+ } , [ editor , summarizeStream , toast , handleSummarizeError ] ) ;
7982
8083 const handleInsertNote = useCallback ( ( position : 'cursor' | 'start' | 'end' ) => {
8184 if ( ! editor || ! aiData ) return ;
@@ -128,8 +131,8 @@ export function useNoteAI(editor: Editor | null, noteId: string | null) {
128131 const text = editor . getText ( ) ;
129132 if ( ! text . trim ( ) ) { toast ( { type : 'warning' , message : '笔记内容为空' } ) ; return ; }
130133 setConvertedKeys ( new Set ( ) ) ;
131- summarize ( text ) . catch ( handleSummarizeError ) ;
132- } , [ editor , summarize , toast , handleSummarizeError ] ) ;
134+ summarizeStream ( text ) . catch ( handleSummarizeError ) ;
135+ } , [ editor , summarizeStream , toast , handleSummarizeError ] ) ;
133136
134137 const handleExport = useCallback ( ( ) => {
135138 if ( ! aiData ) return ;
@@ -149,6 +152,7 @@ export function useNoteAI(editor: Editor | null, noteId: string | null) {
149152 return {
150153 summaryModalOpen, setSummaryModalOpen,
151154 aiLoading, aiData, aiError, aiNeedsConfig,
155+ streamingText, isStreaming, cancelStream,
152156 flashcardLoading, convertedKeys,
153157 ensureDefaultDeck, persistCards,
154158 startSummarize, handleInsertNote, handleCopySummary,
0 commit comments