diff --git a/.changeset/quiet-cart-aborts.md b/.changeset/quiet-cart-aborts.md new file mode 100644 index 0000000000..9042bcd2f5 --- /dev/null +++ b/.changeset/quiet-cart-aborts.md @@ -0,0 +1,5 @@ +--- +"@shopify/hydrogen": patch +--- + +Prevent superseded cart mutations from producing unhandled `AbortError` console errors. diff --git a/packages/hydrogen/src/core/cart/cart-transactions.test.ts b/packages/hydrogen/src/core/cart/cart-transactions.test.ts index d71eb9ac24..81156a57bf 100644 --- a/packages/hydrogen/src/core/cart/cart-transactions.test.ts +++ b/packages/hydrogen/src/core/cart/cart-transactions.test.ts @@ -407,6 +407,25 @@ describe("transaction cart store", () => { expect(store.getState().pending.lines).toEqual(new Set()); }); + it("handles an aborted correlated Standard Event promise", async () => { + dispatchEventsSynchronously = false; + store.hydrate(makeCart([makeLine("line-a", 1)])); + getCart.mockResolvedValueOnce({ cart: makeCart([makeLine("line-a", 3)]) }); + + const first = store.handleFormSubmit(submitLine("line-a")); + await Promise.resolve(); + await Promise.resolve(); + const second = store.handleFormSubmit(submitLine("line-a")); + await Promise.resolve(); + await Promise.resolve(); + + expect(transportSignals[0].aborted).toBe(true); + transportDeferreds[1].resolve(serverResult([makeLine("line-a", 3)])); + await Promise.all([first, second]); + + expect(store.getState().data.lines.nodes[0].quantity).toBe(3); + }); + it("retains references outside a transaction's scope", () => { const lineA = makeLine("line-a", 1); const lineB = makeLine("line-b", 1); diff --git a/packages/hydrogen/src/core/cart/cart.ts b/packages/hydrogen/src/core/cart/cart.ts index b528025933..1c570249bd 100644 --- a/packages/hydrogen/src/core/cart/cart.ts +++ b/packages/hydrogen/src/core/cart/cart.ts @@ -1533,6 +1533,8 @@ function enqueueTransaction( ); if (expectedEventIndex !== -1) { store.expectedEvents.splice(expectedEventIndex, 1); + // Prevent request cancellation from becoming an unhandled rejection. + promise.then(NOOP, NOOP); return; } if (store.observedPromises.has(promise)) return;