feat: 优化会话列表按最后更新时间倒序排序,更方便查看与管理

This commit is contained in:
李超 2024-08-20 21:18:28 +08:00
parent fc97c4b06f
commit d0b7ddc1d6
3 changed files with 43 additions and 7 deletions

View File

@ -336,6 +336,24 @@ export const useChatStore = createPersistStore(
return session; 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) { onNewMessage(message: ChatMessage) {
get().updateCurrentSession((session) => { get().updateCurrentSession((session) => {
session.messages = session.messages.concat(); session.messages = session.messages.concat();
@ -343,6 +361,7 @@ export const useChatStore = createPersistStore(
}); });
get().updateStat(message); get().updateStat(message);
get().summarizeSession(); get().summarizeSession();
get().sortSessions();
noticeCloudSync(); noticeCloudSync();
}, },

View File

@ -46,6 +46,8 @@ const DEFAULT_SYNC_STATE = {
lastProvider: "", lastProvider: "",
}; };
let lastSyncTime = 0;
export const useSyncStore = createPersistStore( export const useSyncStore = createPersistStore(
DEFAULT_SYNC_STATE, DEFAULT_SYNC_STATE,
(set, get) => ({ (set, get) => ({
@ -92,6 +94,11 @@ export const useSyncStore = createPersistStore(
}, },
async sync() { async sync() {
if (lastSyncTime && lastSyncTime >= Date.now() - 800) {
return;
}
lastSyncTime = Date.now();
const enableAutoSync = get().enableAutoSync; const enableAutoSync = get().enableAutoSync;
if (!enableAutoSync) { if (!enableAutoSync) {
return; return;
@ -111,9 +118,7 @@ export const useSyncStore = createPersistStore(
); );
return; return;
} else { } else {
const parsedRemoteState = JSON.parse( const parsedRemoteState = JSON.parse(remoteState) as AppState;
await client.get(config.username),
) as AppState;
mergeAppState(localState, parsedRemoteState); mergeAppState(localState, parsedRemoteState);
setLocalAppState(localState); setLocalAppState(localState);
} }

View File

@ -66,6 +66,8 @@ type StateMerger = {
const MergeStates: StateMerger = { const MergeStates: StateMerger = {
[StoreKey.Chat]: (localState, remoteState) => { [StoreKey.Chat]: (localState, remoteState) => {
// merge sessions // merge sessions
const currentSession = useChatStore.getState().currentSession();
const localSessions: Record<string, ChatSession> = {}; const localSessions: Record<string, ChatSession> = {};
const localDeletedSessionIds = localState.deletedSessionIds || {}; const localDeletedSessionIds = localState.deletedSessionIds || {};
localState.sessions.forEach((s) => (localSessions[s.id] = s)); localState.sessions.forEach((s) => (localSessions[s.id] = s));
@ -111,6 +113,10 @@ const MergeStates: StateMerger = {
localSession.messages.sort( localSession.messages.sort(
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(), (a, b) => new Date(a.date).getTime() - new Date(b.date).getTime(),
); );
localSession.lastUpdate = Math.max(
remoteSession.lastUpdate,
localSession.lastUpdate,
);
const deletedMessageIds = { const deletedMessageIds = {
...remoteDeletedMessageIds, ...remoteDeletedMessageIds,
@ -130,10 +136,10 @@ const MergeStates: StateMerger = {
}); });
// sort local sessions with date field in desc order // sort local sessions with date field in desc order
// localState.sessions.sort( localState.sessions.sort(
// (a, b) => (a, b) =>
// new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(), new Date(b.lastUpdate).getTime() - new Date(a.lastUpdate).getTime(),
// ); );
const deletedSessionIds = { const deletedSessionIds = {
...remoteDeletedSessionIds, ...remoteDeletedSessionIds,
@ -142,6 +148,12 @@ const MergeStates: StateMerger = {
removeOutdatedEntries(deletedSessionIds); removeOutdatedEntries(deletedSessionIds);
localState.deletedSessionIds = deletedSessionIds; localState.deletedSessionIds = deletedSessionIds;
localState.currentSessionIndex = localState.sessions.findIndex(
(session) => {
return session && currentSession && session.id === session.id;
},
);
return localState; return localState;
}, },
[StoreKey.Prompt]: (localState, remoteState) => { [StoreKey.Prompt]: (localState, remoteState) => {