diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index f9d4c89b7..010940048 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -176,6 +176,16 @@ export function resolveSettingsCloseConfig( return base.onboardingCompleted ? base : { ...base, onboardingCompleted: true }; } +export function projectsWithClearedPendingPrompt( + projects: Project[], + projectId: string | null | undefined, +): Project[] { + if (!projectId) return projects; + return projects.map((p) => + p.id === projectId ? { ...p, pendingPrompt: undefined } : p, + ); +} + export function App() { return ( @@ -1113,17 +1123,18 @@ function AppInner() { }, []); const handleBack = useCallback(() => { + const projectId = route.kind === 'project' ? route.projectId : null; + if (projectId) { + setProjects((curr) => projectsWithClearedPendingPrompt(curr, projectId)); + void patchProject(projectId, { pendingPrompt: null }); + } navigate({ kind: 'home', view: 'home' }); - }, []); + }, [route]); const handleClearPendingPrompt = useCallback(() => { const projectId = route.kind === 'project' ? route.projectId : null; if (!projectId) return; - setProjects((curr) => - curr.map((p) => - p.id === projectId ? { ...p, pendingPrompt: undefined } : p, - ), - ); + setProjects((curr) => projectsWithClearedPendingPrompt(curr, projectId)); void patchProject(projectId, { pendingPrompt: null }); }, [route]); diff --git a/apps/web/tests/App.test.ts b/apps/web/tests/App.test.ts index 79404d5cf..1a4789320 100644 --- a/apps/web/tests/App.test.ts +++ b/apps/web/tests/App.test.ts @@ -4,10 +4,11 @@ import { buildPersistedConfig, isAutosaveDraftOnlyChange, persistComposioConfigChange, + projectsWithClearedPendingPrompt, resolveSettingsCloseConfig, shouldSyncMediaProvidersOnSave, } from '../src/App'; -import type { AppConfig } from '../src/types'; +import type { AppConfig, Project } from '../src/types'; const baseConfig: AppConfig = { mode: 'api', @@ -123,3 +124,20 @@ describe('resolveSettingsCloseConfig', () => { }); }); }); + +describe('projectsWithClearedPendingPrompt', () => { + const projects: Project[] = [ + { id: 'a', name: 'A', pendingPrompt: 'keep me' } as Project, + { id: 'b', name: 'B', pendingPrompt: 'stale seed' } as Project, + ]; + + it('clears pendingPrompt for the target project (#2878)', () => { + const next = projectsWithClearedPendingPrompt(projects, 'b'); + expect(next.find((p) => p.id === 'b')?.pendingPrompt).toBeUndefined(); + expect(next.find((p) => p.id === 'a')?.pendingPrompt).toBe('keep me'); + }); + + it('returns the original list when projectId is missing', () => { + expect(projectsWithClearedPendingPrompt(projects, null)).toBe(projects); + }); +});