From 1eae8305ea6e3ff49470e3d205147a3880852e55 Mon Sep 17 00:00:00 2001 From: 777genius Date: Tue, 26 May 2026 18:54:17 +0300 Subject: [PATCH] fix(context): reset lazy project scope --- src/renderer/store/slices/contextSlice.ts | 17 +++++- .../store/contextSliceTeamReset.test.ts | 56 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/renderer/store/slices/contextSlice.ts b/src/renderer/store/slices/contextSlice.ts index 4b016d27..f251f881 100644 --- a/src/renderer/store/slices/contextSlice.ts +++ b/src/renderer/store/slices/contextSlice.ts @@ -282,11 +282,26 @@ export const createContextSlice: StateCreator = } set({ - ...(contextChanged ? getContextScopedTeamResetState() : {}), + ...(contextChanged + ? { + ...getFullResetState(), + ...getContextScopedTeamResetState(), + projects: [], + projectsLoading: false, + projectsInitialized: false, + projectsError: null, + repositoryGroups: [], + repositoryGroupsLoading: false, + repositoryGroupsInitialized: false, + repositoryGroupsError: null, + } + : {}), contextSnapshotsReady: true, activeContextId, }); if (contextChanged) { + void get().fetchProjects(); + void get().fetchRepositoryGroups(); void get().fetchTeams(); void get().fetchAllTasks(); } diff --git a/test/renderer/store/contextSliceTeamReset.test.ts b/test/renderer/store/contextSliceTeamReset.test.ts index e13e9c59..ab08dd59 100644 --- a/test/renderer/store/contextSliceTeamReset.test.ts +++ b/test/renderer/store/contextSliceTeamReset.test.ts @@ -290,6 +290,27 @@ describe('context slice team/task reset', () => { const store = createTestStore(); store.setState({ activeContextId: 'local', + projects: [ + { + id: 'local-project', + name: 'Local Project', + path: '/local/project', + sessions: [], + createdAt: new Date(0).toISOString(), + updatedAt: new Date(0).toISOString(), + }, + ], + projectsInitialized: true, + repositoryGroups: [ + { + id: 'local-repo', + identity: null, + name: 'Local Repo', + totalSessions: 0, + worktrees: [], + }, + ], + repositoryGroupsInitialized: true, teams: [ { teamName: 'local-team', @@ -321,13 +342,48 @@ describe('context slice team/task reset', () => { await store.getState().initializeContextSystem(); expect(store.getState().activeContextId).toBe('ssh-dev'); + expect(store.getState().projects).toEqual(targetSnapshot().projects); + expect(store.getState().projectsInitialized).toBe(true); + expect(store.getState().repositoryGroups).toEqual([]); + expect(store.getState().repositoryGroupsInitialized).toBe(true); expect(store.getState().teams).toEqual([]); expect(store.getState().teamByName).toEqual({}); expect(store.getState().globalTasks).toEqual([]); + expect(apiMock.getProjects).toHaveBeenCalledTimes(1); + expect(apiMock.getRepositoryGroups).toHaveBeenCalledTimes(1); expect(apiMock.teams.list).toHaveBeenCalledTimes(1); expect(apiMock.teams.getAllTasks).toHaveBeenCalledTimes(1); }); + it('clears project and repository loading guards before lazy context initialization refetches', async () => { + apiMock.context.getActive.mockResolvedValue('ssh-dev'); + const projectScan = deferred(); + const repositoryScan = deferred(); + apiMock.getProjects.mockReturnValue(projectScan.promise); + apiMock.getRepositoryGroups.mockReturnValue(repositoryScan.promise); + const store = createTestStore(); + store.setState({ + activeContextId: 'local', + projectsLoading: true, + repositoryGroupsLoading: true, + } as never); + + await store.getState().initializeContextSystem(); + + expect(apiMock.getProjects).toHaveBeenCalledTimes(1); + expect(apiMock.getRepositoryGroups).toHaveBeenCalledTimes(1); + expect(store.getState().projectsLoading).toBe(true); + expect(store.getState().repositoryGroupsLoading).toBe(true); + + projectScan.resolve([]); + repositoryScan.resolve([]); + await Promise.all([projectScan.promise, repositoryScan.promise]); + await flushMicrotasks(); + + expect(store.getState().projectsLoading).toBe(false); + expect(store.getState().repositoryGroupsLoading).toBe(false); + }); + it('drops previous-context team and task caches on direct SSH connect', async () => { const store = createTestStore(); store.setState({