diff --git a/src/pages/settings/Agents/NewAgentPage.tsx b/src/pages/settings/Agents/NewAgentPage.tsx index 9eb59084867e..8536f0102a44 100644 --- a/src/pages/settings/Agents/NewAgentPage.tsx +++ b/src/pages/settings/Agents/NewAgentPage.tsx @@ -19,7 +19,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {clearNewAgentTemplate, setNewAgentTemplate, getAgentTemplates} from '@userActions/Agent'; +import {clearNewAgentAvatarDraft, clearNewAgentTemplate, setNewAgentTemplate, getAgentTemplates} from '@userActions/Agent'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -92,15 +92,15 @@ function NewAgentPage({route}: NewAgentPageProps) { }, [isOffline]); const handleBuildCustomAgent = () => { - // Start from scratch — drop any previously stashed template - clearNewAgentTemplate().then(() => { + // Start from scratch — drop any previously stashed template and avatar draft. + Promise.all([clearNewAgentTemplate(), clearNewAgentAvatarDraft()]).then(() => { Navigation.navigate(ROUTES.SETTINGS_AGENTS_ADD.getRoute(policyID ? {policyID} : undefined)); }); }; const handleAddTemplate = (template: SuggestedAgent, avatarID: AgentAvatarID) => { - // Stash the template in Onyx (persists across refresh) - setNewAgentTemplate({name: template.name, prompt: template.prompt, avatarID}).then(() => { + // Stash the template in Onyx (persists across refresh) and drop any stale avatar draft. + Promise.all([setNewAgentTemplate({name: template.name, prompt: template.prompt, avatarID}), clearNewAgentAvatarDraft()]).then(() => { Navigation.navigate(ROUTES.SETTINGS_AGENTS_ADD.getRoute(policyID ? {policyID} : undefined)); }); }; diff --git a/tests/unit/pages/settings/NewAgentPageTest.tsx b/tests/unit/pages/settings/NewAgentPageTest.tsx index 46a98a2a2904..9902854058af 100644 --- a/tests/unit/pages/settings/NewAgentPageTest.tsx +++ b/tests/unit/pages/settings/NewAgentPageTest.tsx @@ -10,7 +10,7 @@ import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; import NewAgentPage from '@pages/settings/Agents/NewAgentPage'; -import {clearNewAgentTemplate, setNewAgentTemplate} from '@userActions/Agent'; +import {clearNewAgentAvatarDraft, clearNewAgentTemplate, setNewAgentTemplate} from '@userActions/Agent'; import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; @@ -44,6 +44,7 @@ jest.mock('@hooks/useThemeStyles', () => jest.mock('@userActions/Agent', () => ({ setNewAgentTemplate: jest.fn(() => Promise.resolve()), clearNewAgentTemplate: jest.fn(() => Promise.resolve()), + clearNewAgentAvatarDraft: jest.fn(() => Promise.resolve()), getAgentTemplates: jest.fn(), })); jest.mock('@libs/Navigation/Navigation', () => ({ @@ -104,6 +105,7 @@ const mockedUseNetwork = jest.mocked(useNetwork); const mockNavigate = jest.mocked(Navigation.navigate); const mockSetNewAgentTemplate = jest.mocked(setNewAgentTemplate); const mockClearNewAgentTemplate = jest.mocked(clearNewAgentTemplate); +const mockClearNewAgentAvatarDraft = jest.mocked(clearNewAgentAvatarDraft); type NewAgentRouteProp = PlatformStackRouteProp; type NewAgentNavigationProp = PlatformStackScreenProps['navigation']; @@ -134,6 +136,7 @@ describe('NewAgentPage', () => { mockedUseSuggestedAgents.mockReturnValue({data: TEMPLATES, isLoading: false}); mockSetNewAgentTemplate.mockResolvedValue(undefined); mockClearNewAgentTemplate.mockResolvedValue(undefined); + mockClearNewAgentAvatarDraft.mockResolvedValue(undefined); }); it('always renders the build custom agent button', () => { @@ -187,7 +190,7 @@ describe('NewAgentPage', () => { expect(screen.queryByText('newAgentPage.emptyTemplatesSubtitle')).toBeNull(); }); - it('stashes the picked template and opens the builder when Add is pressed', async () => { + it('stashes the picked template, clears the stale avatar draft and opens the builder when Add is pressed', async () => { renderNewAgentPage(); const firstAddButton = screen.getAllByText('common.add').at(0); @@ -202,17 +205,19 @@ describe('NewAgentPage', () => { prompt: 'Reject pricey expenses.', avatarID: AGENT_AVATARS.ordered.at(0)?.id, }); + expect(mockClearNewAgentAvatarDraft).toHaveBeenCalledTimes(1); await waitFor(() => { expect(mockNavigate).toHaveBeenCalledWith(ROUTES.SETTINGS_AGENTS_ADD.getRoute()); }); }); - it('clears any stashed template and opens a blank builder when Build custom agent is pressed', async () => { + it('clears any stashed template and avatar draft and opens a blank builder when Build custom agent is pressed', async () => { renderNewAgentPage(); fireEvent.press(screen.getByText('newAgentPage.buildCustomAgent')); expect(mockClearNewAgentTemplate).toHaveBeenCalledTimes(1); + expect(mockClearNewAgentAvatarDraft).toHaveBeenCalledTimes(1); expect(mockSetNewAgentTemplate).not.toHaveBeenCalled(); await waitFor(() => { expect(mockNavigate).toHaveBeenCalledWith(ROUTES.SETTINGS_AGENTS_ADD.getRoute());