From eeb015b379f70701a97cde4c7cde7fd01b0f1ab0 Mon Sep 17 00:00:00 2001 From: Vaggelis Yfantis Date: Wed, 30 Apr 2025 17:40:45 +0300 Subject: [PATCH] fix(clerk-js): Retry checkout confirm if there is another checkout already in progress --- .changeset/eighty-windows-grow.md | 5 +++++ .../clerk-js/src/core/resources/CommerceCheckout.ts | 11 ++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .changeset/eighty-windows-grow.md diff --git a/.changeset/eighty-windows-grow.md b/.changeset/eighty-windows-grow.md new file mode 100644 index 00000000000..511a5af10d6 --- /dev/null +++ b/.changeset/eighty-windows-grow.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Retry checkout confirmation if there is another checkout in progress diff --git a/packages/clerk-js/src/core/resources/CommerceCheckout.ts b/packages/clerk-js/src/core/resources/CommerceCheckout.ts index f8f97effea3..eaa3c0afce1 100644 --- a/packages/clerk-js/src/core/resources/CommerceCheckout.ts +++ b/packages/clerk-js/src/core/resources/CommerceCheckout.ts @@ -13,6 +13,7 @@ import { __experimental_CommercePlan, __experimental_CommerceSubscription, BaseResource, + isClerkAPIResponseError, } from './internal'; export class __experimental_CommerceCheckout extends BaseResource implements __experimental_CommerceCheckoutResource { @@ -75,8 +76,16 @@ export class __experimental_CommerceCheckout extends BaseResource implements __e initialDelay: 2 * 1_000, jitter: false, shouldRetry(error: any, iterations: number) { + if (!isClerkAPIResponseError(error) || iterations >= 4) { + return false; + } + const status = error?.status; - return !!status && status >= 500 && iterations <= 4; + const isServerError = status >= 500; + const checkoutAlreadyInProgress = + status === 409 && error.errors?.[0]?.code === 'checkout_already_in_progress'; + + return isServerError || checkoutAlreadyInProgress; }, }, );