Skip to content

Commit 182cb57

Browse files
fix(schedule-actions): navigate to list before refetching deleted schedule
Skip describeSchedule invalidation on delete so the detail page does not 404-refetch and hit the error boundary before router.push completes. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent a0ccbad commit 182cb57

3 files changed

Lines changed: 35 additions & 8 deletions

File tree

src/views/schedule-actions/config/schedule-actions.config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ const deleteScheduleActionConfig: ScheduleAction<DeleteScheduleResponse> = {
8080
httpMethod: 'DELETE',
8181
renderSuccessMessage: () => 'Schedule deleted.',
8282
onSuccess: ({ queryClient, params, router }) => {
83-
queryClient.invalidateQueries({
84-
queryKey: ['listSchedules', { domain: params.domain, cluster: params.cluster }],
85-
});
8683
router.push(
8784
`/domains/${encodeURIComponent(params.domain)}/${encodeURIComponent(params.cluster)}/schedules`
8885
);
86+
queryClient.invalidateQueries({
87+
queryKey: ['listSchedules', { domain: params.domain, cluster: params.cluster }],
88+
});
8989
},
9090
};
9191

src/views/schedule-actions/schedule-actions-modal-content/__tests__/schedule-actions-modal-content.test.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { HttpResponse } from 'msw';
2+
import { QueryClient } from '@tanstack/react-query';
23

34
import { render, screen, userEvent, waitFor } from '@/test-utils/rtl';
45

@@ -135,6 +136,29 @@ describe(ScheduleActionsModalContent.name, () => {
135136
);
136137
expect(mockOnClose).toHaveBeenCalled();
137138
});
139+
140+
it('does not invalidate describeSchedule after delete', async () => {
141+
const invalidateQueriesSpy = jest.spyOn(
142+
QueryClient.prototype,
143+
'invalidateQueries'
144+
);
145+
146+
const { user, waitForRequest } = setup({
147+
actionConfig: mockScheduleActionsConfig[2],
148+
});
149+
150+
await user.click(
151+
screen.getByRole('button', { name: 'Delete schedule' })
152+
);
153+
154+
await waitForRequest();
155+
156+
expect(invalidateQueriesSpy).not.toHaveBeenCalledWith(
157+
expect.objectContaining({
158+
queryKey: ['describeSchedule', mockScheduleParams],
159+
})
160+
);
161+
});
138162
});
139163
});
140164

src/views/schedule-actions/schedule-actions-modal-content/schedule-actions-modal-content.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,14 @@ export default function ScheduleActionsModalContent<
6868
}).then((res) => res.json() as Result);
6969
},
7070
onSuccess: (result, mutationParams) => {
71-
queryClient.invalidateQueries({
72-
queryKey: ['describeSchedule', params],
73-
});
74-
75-
action.onSuccess?.({ queryClient, params, router });
71+
if (action.id === 'delete') {
72+
action.onSuccess?.({ queryClient, params, router });
73+
} else {
74+
queryClient.invalidateQueries({
75+
queryKey: ['describeSchedule', params],
76+
});
77+
action.onSuccess?.({ queryClient, params, router });
78+
}
7679

7780
onCloseModal();
7881
enqueue({

0 commit comments

Comments
 (0)