From fe99c455aebdfa9b69620f1ea35540a868f65169 Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Tue, 16 Jun 2026 15:55:35 +0300 Subject: [PATCH] fix: prevent session folder rerender loop #1461 Avoids redundant folder store updates Prevents startup crashes with many sessions Keeps invalid folder moves from mutating state --- .../ui/src/stores/useSessionFoldersStore.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/ui/src/stores/useSessionFoldersStore.ts b/packages/ui/src/stores/useSessionFoldersStore.ts index 03e81f1d..7b61d65f 100644 --- a/packages/ui/src/stores/useSessionFoldersStore.ts +++ b/packages/ui/src/stores/useSessionFoldersStore.ts @@ -326,6 +326,17 @@ export const useSessionFoldersStore = create()( const scopeFolders = current[scopeKey]; if (!scopeFolders) return; + const targetFolder = scopeFolders.find((folder) => folder.id === folderId); + if (!targetFolder) return; + + const sessionFolderCount = scopeFolders.reduce( + (count, folder) => count + (folder.sessionIds.includes(sessionId) ? 1 : 0), + 0, + ); + if (targetFolder.sessionIds.includes(sessionId) && sessionFolderCount === 1) { + return; + } + // Remove session from any existing folder first, then add to target const nextFolders = scopeFolders.map((folder) => { const withoutSession = folder.sessionIds.filter((id) => id !== sessionId); @@ -356,6 +367,30 @@ export const useSessionFoldersStore = create()( const idSet = new Set(sessionIds.filter((id) => typeof id === 'string' && id.length > 0)); if (idSet.size === 0) return; + const targetFolder = scopeFolders.find((folder) => folder.id === folderId); + if (!targetFolder) return; + + let changed = false; + for (const folder of scopeFolders) { + for (const id of idSet) { + if (!folder.sessionIds.includes(id)) continue; + if (folder.id !== folderId || !targetFolder.sessionIds.includes(id)) { + changed = true; + break; + } + } + if (changed) break; + } + if (!changed) { + for (const id of idSet) { + if (!targetFolder.sessionIds.includes(id)) { + changed = true; + break; + } + } + } + if (!changed) return; + const nextFolders = scopeFolders.map((folder) => { const withoutSessions = folder.sessionIds.filter((id) => !idSet.has(id)); if (folder.id === folderId) {