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) => {