diff --git a/.changeset/hungry-pianos-punch.md b/.changeset/hungry-pianos-punch.md new file mode 100644 index 00000000000..acef79ebd3e --- /dev/null +++ b/.changeset/hungry-pianos-punch.md @@ -0,0 +1,5 @@ +--- +"@clerk/elements": patch +--- + +Add support for redirect_url URL parameter 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 eb340aadc2d..029c429e410 100644 --- a/packages/elements/src/internals/machines/sign-in/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-in/router.machine.ts @@ -84,7 +84,8 @@ export const SignInRouterMachine = setup({ const session = createdSessionId || lastActiveSessionId || null; - const beforeEmit = () => context.router?.push(context.clerk.buildAfterSignInUrl()); + const beforeEmit = () => + context.router?.push(context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignInUrl()); void context.clerk.setActive({ session, beforeEmit }); enqueue.raise({ type: 'RESET' }, { delay: 2000 }); // Reset machine after 2s delay. @@ -186,7 +187,8 @@ export const SignInRouterMachine = setup({ ? context.clerk.__unstable__environment?.displayConfig.signInUrl : context.router?.basePath }${SSO_CALLBACK_PATH_ROUTE}`, - redirectUrlComplete: context.clerk.buildAfterSignInUrl(), + redirectUrlComplete: + context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignInUrl(), }, })), }, @@ -201,7 +203,8 @@ export const SignInRouterMachine = setup({ ? context.clerk.__unstable__environment?.displayConfig.signInUrl : context.router?.basePath }${SSO_CALLBACK_PATH_ROUTE}`, - redirectUrlComplete: context.clerk.buildAfterSignInUrl(), + redirectUrlComplete: + context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignInUrl(), }, })), }, @@ -284,7 +287,9 @@ export const SignInRouterMachine = setup({ log('Already logged in'), { type: 'navigateExternal', - params: ({ context }) => ({ path: context.clerk.buildAfterSignInUrl() }), + params: ({ context }) => ({ + path: context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignInUrl(), + }), }, ], }, 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 e8d9eca25e0..00cc5f29a42 100644 --- a/packages/elements/src/internals/machines/sign-up/router.machine.ts +++ b/packages/elements/src/internals/machines/sign-up/router.machine.ts @@ -78,7 +78,8 @@ export const SignUpRouterMachine = setup({ (params?.useLastActiveSession && context.clerk.client.lastActiveSessionId) || ((event as SignUpRouterNextEvent)?.resource || context.clerk.client.signUp).createdSessionId; - const beforeEmit = () => context.router?.push(context.clerk.buildAfterSignUpUrl()); + const beforeEmit = () => + context.router?.push(context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignUpUrl()); void context.clerk.setActive({ session, beforeEmit }); }, delayedReset: raise({ type: 'RESET' }, { delay: 3000 }), // Reset machine after 3s delay. @@ -187,7 +188,8 @@ export const SignUpRouterMachine = setup({ ? context.clerk.__unstable__environment?.displayConfig.signUpUrl : context.router?.basePath }${SSO_CALLBACK_PATH_ROUTE}`, - redirectUrlComplete: context.clerk.buildAfterSignUpUrl(), + redirectUrlComplete: + context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignUpUrl(), }, })), }, @@ -202,7 +204,8 @@ export const SignUpRouterMachine = setup({ ? context.clerk.__unstable__environment?.displayConfig.signUpUrl : context.router?.basePath }${SSO_CALLBACK_PATH_ROUTE}`, - redirectUrlComplete: context.clerk.buildAfterSignUpUrl(), + redirectUrlComplete: + context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignUpUrl(), }, })), }, @@ -273,7 +276,9 @@ export const SignUpRouterMachine = setup({ log('Already logged in'), { type: 'navigateExternal', - params: ({ context }) => ({ path: context.clerk.buildAfterSignUpUrl() }), + params: ({ context }) => ({ + path: context.router?.searchParams().get('redirect_url') || context.clerk.buildAfterSignUpUrl(), + }), }, ], },