diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index c38ed8982..4efbf62aa 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -579,6 +579,41 @@ function createGlobalSync() { if (!existing) return const [store, setStore] = existing + + const cleanupSessionCaches = (sessionID: string) => { + if (!sessionID) return + + const hasAny = + store.message[sessionID] !== undefined || + store.session_diff[sessionID] !== undefined || + store.todo[sessionID] !== undefined || + store.permission[sessionID] !== undefined || + store.question[sessionID] !== undefined || + store.session_status[sessionID] !== undefined + + if (!hasAny) return + + setStore( + produce((draft) => { + const messages = draft.message[sessionID] + if (messages) { + for (const message of messages) { + const id = message?.id + if (!id) continue + delete draft.part[id] + } + } + + delete draft.message[sessionID] + delete draft.session_diff[sessionID] + delete draft.todo[sessionID] + delete draft.permission[sessionID] + delete draft.question[sessionID] + delete draft.session_status[sessionID] + }), + ) + } + switch (event.type) { case "server.instance.disposed": { if (globalStore.reload) { @@ -616,6 +651,9 @@ function createGlobalSync() { }), ) } + + cleanupSessionCaches(info.id) + if (info.parentID) break setStore("sessionTotal", (value) => Math.max(0, value - 1)) break @@ -631,7 +669,8 @@ function createGlobalSync() { break } case "session.deleted": { - const result = Binary.search(store.session, event.properties.info.id, (s) => s.id) + const sessionID = event.properties.info.id + const result = Binary.search(store.session, sessionID, (s) => s.id) if (result.found) { setStore( "session", @@ -640,6 +679,9 @@ function createGlobalSync() { }), ) } + + cleanupSessionCaches(sessionID) + if (event.properties.info.parentID) break setStore("sessionTotal", (value) => Math.max(0, value - 1)) break @@ -675,18 +717,22 @@ function createGlobalSync() { break } case "message.removed": { - const messages = store.message[event.properties.sessionID] - if (!messages) break - const result = Binary.search(messages, event.properties.messageID, (m) => m.id) - if (result.found) { - setStore( - "message", - event.properties.sessionID, - produce((draft) => { - draft.splice(result.index, 1) - }), - ) - } + const sessionID = event.properties.sessionID + const messageID = event.properties.messageID + + setStore( + produce((draft) => { + const messages = draft.message[sessionID] + if (messages) { + const result = Binary.search(messages, messageID, (m) => m.id) + if (result.found) { + messages.splice(result.index, 1) + } + } + + delete draft.part[messageID] + }), + ) break } case "message.part.updated": {