3
3
// DON'T REMOVE THE FIRST LINE
4
4
import isEqual from 'fast-deep-equal' ;
5
5
import { t } from 'i18next' ;
6
- import { produce } from 'immer' ;
7
6
import useSWR , { SWRResponse , mutate } from 'swr' ;
8
7
import { StateCreator } from 'zustand/vanilla' ;
9
8
@@ -37,19 +36,19 @@ export interface ChatTopicAction {
37
36
removeAllTopics : ( ) => Promise < void > ;
38
37
removeSessionTopics : ( ) => Promise < void > ;
39
38
removeTopic : ( id : string ) => Promise < void > ;
40
- removeUnstarredTopic : ( ) => void ;
39
+ removeUnstarredTopic : ( ) => Promise < void > ;
41
40
saveToTopic : ( ) => Promise < string | undefined > ;
42
41
createTopic : ( ) => Promise < string | undefined > ;
43
42
44
43
autoRenameTopicTitle : ( id : string ) => Promise < void > ;
45
44
duplicateTopic : ( id : string ) => Promise < void > ;
46
45
summaryTopicTitle : ( topicId : string , messages : ChatMessage [ ] ) => Promise < void > ;
47
46
switchTopic : ( id ?: string , skipRefreshMessage ?: boolean ) => Promise < void > ;
48
- updateTopicTitleInSummary : ( id : string , title : string ) => void ;
49
47
updateTopicTitle : ( id : string , title : string ) => Promise < void > ;
50
48
useFetchTopics : ( sessionId : string ) => SWRResponse < ChatTopic [ ] > ;
51
49
useSearchTopics : ( keywords ?: string , sessionId ?: string ) => SWRResponse < ChatTopic [ ] > ;
52
50
51
+ internal_updateTopicTitleInSummary : ( id : string , title : string ) => void ;
53
52
internal_updateTopicLoading : ( id : string , loading : boolean ) => void ;
54
53
internal_createTopic : ( params : CreateTopicParams ) => Promise < string > ;
55
54
internal_updateTopic : ( id : string , data : Partial < ChatTopic > ) => Promise < void > ;
@@ -133,18 +132,18 @@ export const chatTopic: StateCreator<
133
132
} ,
134
133
// update
135
134
summaryTopicTitle : async ( topicId , messages ) => {
136
- const { updateTopicTitleInSummary , internal_updateTopicLoading } = get ( ) ;
135
+ const { internal_updateTopicTitleInSummary , internal_updateTopicLoading } = get ( ) ;
137
136
const topic = topicSelectors . getTopicById ( topicId ) ( get ( ) ) ;
138
137
if ( ! topic ) return ;
139
138
140
- updateTopicTitleInSummary ( topicId , LOADING_FLAT ) ;
139
+ internal_updateTopicTitleInSummary ( topicId , LOADING_FLAT ) ;
141
140
142
141
let output = '' ;
143
142
144
143
// 自动总结话题标题
145
144
await chatService . fetchPresetTaskResult ( {
146
145
onError : ( ) => {
147
- updateTopicTitleInSummary ( topicId , topic . title ) ;
146
+ internal_updateTopicTitleInSummary ( topicId , topic . title ) ;
148
147
} ,
149
148
onFinish : async ( text ) => {
150
149
await get ( ) . internal_updateTopic ( topicId , { title : text } ) ;
@@ -159,7 +158,7 @@ export const chatTopic: StateCreator<
159
158
}
160
159
}
161
160
162
- updateTopicTitleInSummary ( topicId , output ) ;
161
+ internal_updateTopicTitleInSummary ( topicId , output ) ;
163
162
} ,
164
163
params : await chainSummaryTitle ( messages ) ,
165
164
trace : get ( ) . getCurrentTracePayload ( { traceName : TraceNameMap . SummaryTopicTitle , topicId } ) ,
@@ -264,15 +263,11 @@ export const chatTopic: StateCreator<
264
263
} ,
265
264
266
265
// Internal process method of the topics
267
- updateTopicTitleInSummary : ( id , title ) => {
268
- const topics = produce ( get ( ) . topics , ( draftState ) => {
269
- const topic = draftState . find ( ( i ) => i . id === id ) ;
270
-
271
- if ( ! topic ) return ;
272
- topic . title = title ;
273
- } ) ;
274
-
275
- set ( { topics } , false , n ( `updateTopicTitleInSummary` , { id, title } ) ) ;
266
+ internal_updateTopicTitleInSummary : ( id , title ) => {
267
+ get ( ) . internal_dispatchTopic (
268
+ { type : 'updateTopic' , id, value : { title } } ,
269
+ 'updateTopicTitleInSummary' ,
270
+ ) ;
276
271
} ,
277
272
refreshTopic : async ( ) => {
278
273
return mutate ( [ SWR_USE_FETCH_TOPIC , get ( ) . activeId ] ) ;
@@ -317,8 +312,12 @@ export const chatTopic: StateCreator<
317
312
} ,
318
313
319
314
internal_dispatchTopic : ( payload , action ) => {
320
- const nextTopics = topicReducer ( get ( ) . topics , payload ) ;
315
+ const nextTopics = topicReducer ( topicSelectors . currentTopics ( get ( ) ) , payload ) ;
316
+ const nextMap = { ...get ( ) . topicMaps , [ get ( ) . activeId ] : nextTopics } ;
317
+
318
+ // no need to update map if is the same
319
+ if ( isEqual ( nextMap , get ( ) . topicMaps ) ) return ;
321
320
322
- set ( { topics : nextTopics } , false , action ?? n ( `dispatchTopic/${ payload . type } ` ) ) ;
321
+ set ( { topicMaps : nextMap } , false , action ?? n ( `dispatchTopic/${ payload . type } ` ) ) ;
323
322
} ,
324
323
} ) ;
0 commit comments