diff --git a/.changeset/many-lizards-tap.md b/.changeset/many-lizards-tap.md new file mode 100644 index 00000000000..8e45ec706fe --- /dev/null +++ b/.changeset/many-lizards-tap.md @@ -0,0 +1,5 @@ +--- +"@clerk/elements": minor +--- + +Update signin `isLoggedInAndSingleSession` guard to navigate using `buildAfterSignInUrl` when true. diff --git a/packages/elements/src/internals/machines/sign-in/router.machine.ts b/packages/elements/src/internals/machines/sign-in/router.machine.ts index 32e53ca8f2a..e368e308003 100644 --- a/packages/elements/src/internals/machines/sign-in/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/router.machine.ts @@ -2,7 +2,7 @@ import { joinURL } from '@clerk/shared/url'; import { isWebAuthnAutofillSupported } from '@clerk/shared/webauthn'; import type { SignInStatus } from '@clerk/types'; import type { NonReducibleUnknown } from 'xstate'; -import { and, assign, enqueueActions, fromPromise, not, or, raise, sendTo, setup } from 'xstate'; +import { and, assign, enqueueActions, fromPromise, log, not, or, raise, sendTo, setup } from 'xstate'; import { ERROR_CODES, @@ -272,15 +272,12 @@ export const SignInRouterMachine = setup({ { guard: 'isLoggedInAndSingleSession', actions: [ - () => console.warn('logged-in-single-session-mode'), + log('Already logged in'), { - type: 'setError', - params: { - error: new ClerkElementsError('logged-in-single-session-mode', 'You are already logged in.'), - }, + type: 'navigateExternal', + params: ({ context }) => ({ path: context.clerk.buildAfterSignInUrl() }), }, ], - target: 'Start', }, { guard: 'needsStart', diff --git a/packages/elements/src/internals/machines/sign-up/router.machine.ts b/packages/elements/src/internals/machines/sign-up/router.machine.ts index 59edc04d9a5..10f184991b8 100644 --- a/packages/elements/src/internals/machines/sign-up/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/router.machine.ts @@ -139,6 +139,7 @@ export const SignUpRouterMachine = setup({ hasClerkTransfer: ({ context }) => Boolean(context.router?.searchParams().get(SEARCH_PARAMS.transfer)), hasResource: ({ context }) => Boolean(context.clerk.client.signUp), + isLoggedInAndSingleSession: and(['isLoggedIn', 'isSingleSessionMode', not('isExampleMode')]), isStatusAbandoned: needsStatus('abandoned'), isStatusComplete: ({ context, event }) => { const resource = (event as SignUpRouterNextEvent)?.resource; @@ -152,6 +153,7 @@ export const SignUpRouterMachine = setup({ isStatusMissingRequirements: needsStatus('missing_requirements'), isLoggedIn: or(['isStatusComplete', ({ context }) => Boolean(context.clerk.user)]), + isSingleSessionMode: ({ context }) => Boolean(context.clerk?.__unstable__environment?.authConfig.singleSessionMode), isExampleMode: ({ context }) => Boolean(context.exampleMode), isMissingRequiredFields: and(['isStatusMissingRequirements', 'areFieldsMissing']), isMissingRequiredUnverifiedFields: and(['isStatusMissingRequirements', 'areFieldsUnverified']), @@ -254,7 +256,7 @@ export const SignUpRouterMachine = setup({ }), always: [ { - guard: and(['isLoggedIn', not('isExampleMode')]), + guard: 'isLoggedInAndSingleSession', actions: [ log('Already logged in'), {