From cb706711684a91d7f93322ed185d0999387a71d8 Mon Sep 17 00:00:00 2001 From: Matt Driscoll Date: Fri, 25 Aug 2023 11:21:29 -0700 Subject: [PATCH] fix(flow): catch error when beforeBack promise is rejected (#7601) **Related Issue:** None ## Summary - catch error when beforeBack promise is rejected --- .../src/components/flow/flow.e2e.ts | 46 +++++++++++++++++++ .../src/components/flow/flow.tsx | 7 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/calcite-components/src/components/flow/flow.e2e.ts b/packages/calcite-components/src/components/flow/flow.e2e.ts index c3c734ea95e..34b4239495c 100755 --- a/packages/calcite-components/src/components/flow/flow.e2e.ts +++ b/packages/calcite-components/src/components/flow/flow.e2e.ts @@ -102,6 +102,8 @@ describe("calcite-flow", () => { await page.setContent(``); + expect(await page.findAll("calcite-flow-item")).toHaveLength(1); + await page.$eval( "calcite-flow-item", (elm: HTMLCalciteFlowItemElement) => @@ -114,6 +116,50 @@ describe("calcite-flow", () => { expect(backValue).toBeDefined(); expect(mockCallBack).toHaveBeenCalledTimes(1); + expect(await page.findAll("calcite-flow-item")).toHaveLength(0); + }); + + it("should handle rejected 'beforeBack' promise'", async () => { + const page = await newE2EPage(); + + const mockCallBack = jest.fn().mockReturnValue(() => Promise.reject()); + await page.exposeFunction("beforeBack", mockCallBack); + + await page.setContent(``); + + await page.$eval( + "calcite-flow-item", + (elm: HTMLCalciteFlowItemElement) => + (elm.beforeBack = (window as typeof window & Pick).beforeBack) + ); + + const flow = await page.find("calcite-flow"); + + await flow.callMethod("back"); + + expect(mockCallBack).toHaveBeenCalledTimes(1); + }); + + it("should not remove flow-item on rejected 'beforeBack' promise'", async () => { + const page = await newE2EPage(); + + await page.exposeFunction("beforeBack", () => Promise.reject()); + + await page.setContent(``); + + expect(await page.findAll("calcite-flow-item")).toHaveLength(1); + + await page.$eval( + "calcite-flow-item", + (elm: HTMLCalciteFlowItemElement) => + (elm.beforeBack = (window as typeof window & Pick).beforeBack) + ); + + const flow = await page.find("calcite-flow"); + + await flow.callMethod("back"); + + expect(await page.findAll("calcite-flow-item")).toHaveLength(1); }); it("frame advancing should add animation class", async () => { diff --git a/packages/calcite-components/src/components/flow/flow.tsx b/packages/calcite-components/src/components/flow/flow.tsx index 1ebfe969054..e4482fdfeda 100755 --- a/packages/calcite-components/src/components/flow/flow.tsx +++ b/packages/calcite-components/src/components/flow/flow.tsx @@ -41,7 +41,12 @@ export class Flow implements LoadableComponent { ? lastItem.beforeBack : (): Promise => Promise.resolve(); - await beforeBack.call(lastItem); + try { + await beforeBack.call(lastItem); + } catch (_error) { + // back prevented + return; + } lastItem.remove();