diff --git a/src/app/v/[token]/dispatch/_components/refuse-dispatch-dialog.tsx b/src/app/v/[token]/dispatch/_components/refuse-dispatch-dialog.tsx index 5f85e775..f0cb4cf4 100644 --- a/src/app/v/[token]/dispatch/_components/refuse-dispatch-dialog.tsx +++ b/src/app/v/[token]/dispatch/_components/refuse-dispatch-dialog.tsx @@ -12,6 +12,7 @@ import { type RefuseDispatchValues, } from "@/domain/vendor-portal/schemas/refuse-dispatch-schema"; import { queryKeys } from "@/infra/query-key/query-key"; +import { guardDialogClose } from "@/lib/dialog-guard"; type RefuseDispatchDialogProps = { open: boolean; @@ -75,7 +76,11 @@ export function RefuseDispatchDialog({ : ""; return ( - + Refuse dispatch
void submit(event)}> diff --git a/src/test/app/v/refuse-dispatch-dialog.test.tsx b/src/test/app/v/refuse-dispatch-dialog.test.tsx index b5651278..5850a511 100644 --- a/src/test/app/v/refuse-dispatch-dialog.test.tsx +++ b/src/test/app/v/refuse-dispatch-dialog.test.tsx @@ -137,4 +137,36 @@ describe("RefuseDispatchDialog", () => { await waitFor(() => expect(onClose).toHaveBeenCalled()); expect(vendorPortalApi.refuse).not.toHaveBeenCalled(); }); + + it("blocks Escape and backdrop close while a refusal is pending, then closes on success", async () => { + let resolveRefusal!: (value: { id: number; status: string }) => void; + vi.spyOn(vendorPortalApi, "refuse").mockImplementation( + () => + new Promise((resolve) => { + resolveRefusal = resolve; + }), + ); + const onClose = vi.fn(); + renderDialog({ onClose }); + + await act(async () => { + fireEvent.click(screen.getByRole("button", { name: "Refuse dispatch" })); + }); + + await waitFor(() => expect(screen.getByRole("button", { name: "Refusing…" })).toBeDisabled()); + expect(screen.getByRole("button", { name: "Cancel" })).toBeDisabled(); + + const backdrop = document.querySelector(".MuiBackdrop-root"); + expect(backdrop).not.toBeNull(); + fireEvent.click(backdrop as Element); + fireEvent.keyDown(document.body, { key: "Escape" }); + + expect(onClose).not.toHaveBeenCalled(); + + await act(async () => { + resolveRefusal({ id: 9, status: "Refused" }); + }); + + await waitFor(() => expect(onClose).toHaveBeenCalled()); + }); });