From 5c51fd2ed8075de501df55b0a0b7bf1c3b554c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B6=85?= Date: Tue, 20 Aug 2024 21:18:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8C=89=E6=9C=80=E5=90=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=80=92=E5=BA=8F=E6=8E=92=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B9=E4=BE=BF=E6=9F=A5=E7=9C=8B=E4=B8=8E=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/store/chat.ts | 19 +++++++++++++++++++ app/store/sync.ts | 11 ++++++++--- app/utils/sync.ts | 20 ++++++++++++++++---- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/app/store/chat.ts b/app/store/chat.ts index 3dbda7362..4aa58a073 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -336,6 +336,24 @@ export const useChatStore = createPersistStore( return session; }, + sortSessions() { + const currentSession = get().currentSession(); + const sessions = get().sessions.slice(); + + sessions.sort( + (a, b) => + new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(), + ); + const currentSessionIndex = sessions.findIndex((session) => { + return session && currentSession && session.id === session.id; + }); + + set((state) => ({ + currentSessionIndex, + sessions, + })); + }, + onNewMessage(message: ChatMessage) { get().updateCurrentSession((session) => { session.messages = session.messages.concat(); @@ -343,6 +361,7 @@ export const useChatStore = createPersistStore( }); get().updateStat(message); get().summarizeSession(); + get().sortSessions(); noticeCloudSync(); }, diff --git a/app/store/sync.ts b/app/store/sync.ts index e20f42bf5..ca3f3283d 100644 --- a/app/store/sync.ts +++ b/app/store/sync.ts @@ -46,6 +46,8 @@ const DEFAULT_SYNC_STATE = { lastProvider: "", }; +let lastSyncTime = 0; + export const useSyncStore = createPersistStore( DEFAULT_SYNC_STATE, (set, get) => ({ @@ -92,6 +94,11 @@ export const useSyncStore = createPersistStore( }, async sync() { + if (lastSyncTime && lastSyncTime >= Date.now() - 800) { + return; + } + lastSyncTime = Date.now(); + const enableAutoSync = get().enableAutoSync; if (!enableAutoSync) { return; @@ -111,9 +118,7 @@ export const useSyncStore = createPersistStore( ); return; } else { - const parsedRemoteState = JSON.parse( - await client.get(config.username), - ) as AppState; + const parsedRemoteState = JSON.parse(remoteState) as AppState; mergeAppState(localState, parsedRemoteState); setLocalAppState(localState); } diff --git a/app/utils/sync.ts b/app/utils/sync.ts index 0943260ab..576c18b58 100644 --- a/app/utils/sync.ts +++ b/app/utils/sync.ts @@ -66,6 +66,8 @@ type StateMerger = { const MergeStates: StateMerger = { [StoreKey.Chat]: (localState, remoteState) => { // merge sessions + const currentSession = useChatStore.getState().currentSession(); + const localSessions: Record = {}; const localDeletedSessionIds = localState.deletedSessionIds || {}; localState.sessions.forEach((s) => (localSessions[s.id] = s)); @@ -111,6 +113,10 @@ const MergeStates: StateMerger = { localSession.messages.sort( (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(), ); + localSession.lastUpdate = Math.max( + remoteSession.lastUpdate, + localSession.lastUpdate, + ); const deletedMessageIds = { ...remoteDeletedMessageIds, @@ -130,10 +136,10 @@ const MergeStates: StateMerger = { }); // sort local sessions with date field in desc order - // localState.sessions.sort( - // (a, b) => - // new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(), - // ); + localState.sessions.sort( + (a, b) => + new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(), + ); const deletedSessionIds = { ...remoteDeletedSessionIds, @@ -142,6 +148,12 @@ const MergeStates: StateMerger = { removeOutdatedEntries(deletedSessionIds); localState.deletedSessionIds = deletedSessionIds; + localState.currentSessionIndex = localState.sessions.findIndex( + (session) => { + return session && currentSession && session.id === session.id; + }, + ); + return localState; }, [StoreKey.Prompt]: (localState, remoteState) => {