From 0d96403f5689b1e1bbc17104211b6461ec45d47e Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:08:34 -0300 Subject: [PATCH 1/5] Accept `treatPendingAsSignedOut` on `auth` --- packages/nextjs/src/app-router/server/auth.ts | 7 ++++--- packages/nextjs/src/server/createGetAuth.ts | 3 ++- .../nextjs/src/server/data/getAuthDataFromRequest.ts | 11 ++++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/nextjs/src/app-router/server/auth.ts b/packages/nextjs/src/app-router/server/auth.ts index 019b7e23fd3..bbc6ea5161c 100644 --- a/packages/nextjs/src/app-router/server/auth.ts +++ b/packages/nextjs/src/app-router/server/auth.ts @@ -1,5 +1,6 @@ import type { AuthObject } from '@clerk/backend'; import { constants, createClerkRequest, createRedirect, type RedirectFun } from '@clerk/backend/internal'; +import type { PendingSessionOptions } from '@clerk/types'; import { notFound, redirect } from 'next/navigation'; import { PUBLISHABLE_KEY, SIGN_IN_URL, SIGN_UP_URL } from '../../server/constants'; @@ -38,7 +39,7 @@ type Auth = AuthObject & { }; export interface AuthFn { - (): Promise; + (options?: PendingSessionOptions): Promise; /** * `auth` includes a single property, the `protect()` method, which you can use in two ways: @@ -68,7 +69,7 @@ export interface AuthFn { * - Only works on the server-side, such as in Server Components, Route Handlers, and Server Actions. * - Requires [`clerkMiddleware()`](https://clerk.com/docs/references/nextjs/clerk-middleware) to be configured. */ -export const auth: AuthFn = async () => { +export const auth: AuthFn = async ({ treatPendingAsSignedOut } = {}) => { // eslint-disable-next-line @typescript-eslint/no-require-imports require('server-only'); @@ -89,7 +90,7 @@ export const auth: AuthFn = async () => { const authObject = await createAsyncGetAuth({ debugLoggerName: 'auth()', noAuthStatusMessage: authAuthHeaderMissing('auth', await stepsBasedOnSrcDirectory()), - })(request); + })(request, { treatPendingAsSignedOut }); const clerkUrl = getAuthKeyFromRequest(request, 'ClerkUrl'); diff --git a/packages/nextjs/src/server/createGetAuth.ts b/packages/nextjs/src/server/createGetAuth.ts index 56edce21415..a879b3f8d44 100644 --- a/packages/nextjs/src/server/createGetAuth.ts +++ b/packages/nextjs/src/server/createGetAuth.ts @@ -1,6 +1,7 @@ import type { AuthObject } from '@clerk/backend'; import { constants } from '@clerk/backend/internal'; import { isTruthy } from '@clerk/shared/underscore'; +import type { PendingSessionOptions } from '@clerk/types'; import { withLogger } from '../utils/debugLogger'; import { isNextWithUnstableServerActions } from '../utils/sdk-versions'; @@ -22,7 +23,7 @@ export const createAsyncGetAuth = ({ noAuthStatusMessage: string; }) => withLogger(debugLoggerName, logger => { - return async (req: RequestLike, opts?: { secretKey?: string }): Promise => { + return async (req: RequestLike, opts?: { secretKey?: string } & PendingSessionOptions): Promise => { if (isTruthy(getHeader(req, constants.Headers.EnableDebug))) { logger.enable(); } diff --git a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts index c67ca14f59d..f1dc0d88cc0 100644 --- a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts +++ b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts @@ -1,6 +1,7 @@ import type { AuthObject } from '@clerk/backend'; import { AuthStatus, constants, signedInAuthObject, signedOutAuthObject } from '@clerk/backend/internal'; import { decodeJwt } from '@clerk/backend/jwt'; +import type { PendingSessionOptions } from '@clerk/types'; import type { LoggerNoCommit } from '../../utils/debugLogger'; import { API_URL, API_VERSION, PUBLISHABLE_KEY, SECRET_KEY } from '../constants'; @@ -14,7 +15,10 @@ import { assertTokenSignature, decryptClerkRequestData } from '../utils'; */ export function getAuthDataFromRequest( req: RequestLike, - opts: { secretKey?: string; logger?: LoggerNoCommit } = {}, + { + treatPendingAsSignedOut = true, + ...opts + }: { secretKey?: string; logger?: LoggerNoCommit } & PendingSessionOptions = {}, ): AuthObject { const authStatus = getAuthKeyFromRequest(req, 'AuthStatus'); const authToken = getAuthKeyFromRequest(req, 'AuthToken'); @@ -35,6 +39,7 @@ export function getAuthDataFromRequest( authStatus, authMessage, authReason, + treatPendingAsSignedOut, }; opts.logger?.debug('auth options', options); @@ -53,5 +58,9 @@ export function getAuthDataFromRequest( authObject = signedInAuthObject(options, jwt.raw.text, jwt.payload); } + if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') { + authObject = signedOutAuthObject(options); + } + return authObject; } From 4b4532a4380068da5aada1d6fe58dfd59aeec49e Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:08:48 -0300 Subject: [PATCH 2/5] Pass `treatPendingAsSignedOut` to server components on Next --- .changeset/tender-brooms-look.md | 15 +++++++++++++++ .../clerk-js/src/core/__tests__/clerk.test.ts | 4 ++-- packages/clerk-js/src/core/clerk.ts | 4 ++-- .../src/ui/components/SessionTasks/index.tsx | 4 ++-- .../src/app-router/server/controlComponents.tsx | 15 ++++++++++----- packages/react/src/isomorphicClerk.ts | 4 ++-- packages/types/src/clerk.ts | 4 ++-- 7 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 .changeset/tender-brooms-look.md diff --git a/.changeset/tender-brooms-look.md b/.changeset/tender-brooms-look.md new file mode 100644 index 00000000000..30029ebefd1 --- /dev/null +++ b/.changeset/tender-brooms-look.md @@ -0,0 +1,15 @@ +--- +'@clerk/nextjs': patch +--- + +Introduce `treatPendingAsSignedOut` to `auth` and server-side control components + +```ts +const { userId } = auth({ treatPendingAsSignedOut: false }) +``` + +```tsx + + User has a session that is either pending (requires tasks resolution) or active + +``` diff --git a/packages/clerk-js/src/core/__tests__/clerk.test.ts b/packages/clerk-js/src/core/__tests__/clerk.test.ts index b8238723cb1..13625f98461 100644 --- a/packages/clerk-js/src/core/__tests__/clerk.test.ts +++ b/packages/clerk-js/src/core/__tests__/clerk.test.ts @@ -2284,7 +2284,7 @@ describe('Clerk singleton', () => { await sut.load(mockedLoadOptions); await sut.setActive({ session: mockResource as any as PendingSessionResource }); - await sut.__experimental_navigateToTask(); + await sut.__experimental_nextTask(); expect(mockNavigate.mock.calls[0][0]).toBe('/sign-in#/tasks/add-organization'); }); @@ -2328,7 +2328,7 @@ describe('Clerk singleton', () => { await sut.setActive({ session: mockSession as any as ActiveSessionResource }); const redirectUrlComplete = '/welcome-to-app'; - await sut.__experimental_navigateToTask({ redirectUrlComplete }); + await sut.__experimental_nextTask({ redirectUrlComplete }); console.log(mockNavigate.mock.calls); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 2af08c16035..84073f5e89e 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1199,7 +1199,7 @@ export class Clerk implements ClerkInterface { this.#emit(); }; - public __experimental_navigateToTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise => { + public __experimental_nextTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise => { const session = await this.session?.reload(); if (!session || !this.environment) { return; @@ -1216,7 +1216,7 @@ export class Clerk implements ClerkInterface { } const tracker = createBeforeUnloadTracker(this.#options.standardBrowser); - const defaultRedirectUrlComplete = this.client?.signUp ? this.buildAfterSignUpUrl() : this.buildAfterSignInUrl(); + const defaultRedirectUrlComplete = this.client?.signUp ? this.buildAfterSignUpUrl() : this.buildAfterSignUpUrl(); this.#setTransitiveState(); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx index 5aecb49e7e4..dc97a5cb0f5 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx @@ -21,7 +21,7 @@ const SessionTasksStart = withCardStateProvider(() => { useEffect(() => { // Simulates additional latency to avoid a abrupt UI transition when navigating to the next task const timeoutId = setTimeout(() => { - void clerk.__experimental_navigateToTask({ redirectUrlComplete }); + void clerk.__experimental_nextTask({ redirectUrlComplete }); }, 500); return () => clearTimeout(timeoutId); }, [navigate, clerk, redirectUrlComplete]); @@ -80,7 +80,7 @@ export function SessionTask(): JSX.Element { }, [clerk, navigate, redirectUrlComplete]); const nextTask = useCallback( - () => clerk.__experimental_navigateToTask({ redirectUrlComplete }), + () => clerk.__experimental_nextTask({ redirectUrlComplete }), [clerk, redirectUrlComplete], ); diff --git a/packages/nextjs/src/app-router/server/controlComponents.tsx b/packages/nextjs/src/app-router/server/controlComponents.tsx index 48f76645f51..ee91a86f91f 100644 --- a/packages/nextjs/src/app-router/server/controlComponents.tsx +++ b/packages/nextjs/src/app-router/server/controlComponents.tsx @@ -1,17 +1,22 @@ import type { ProtectProps } from '@clerk/clerk-react'; +import type { PendingSessionOptions } from '@clerk/types'; import React from 'react'; import { auth } from './auth'; -export async function SignedIn(props: React.PropsWithChildren): Promise { +export async function SignedIn( + props: React.PropsWithChildren, +): Promise { const { children } = props; - const { userId } = await auth(); + const { userId } = await auth({ treatPendingAsSignedOut: props.treatPendingAsSignedOut }); return userId ? <>{children} : null; } -export async function SignedOut(props: React.PropsWithChildren): Promise { +export async function SignedOut( + props: React.PropsWithChildren, +): Promise { const { children } = props; - const { userId } = await auth(); + const { userId } = await auth({ treatPendingAsSignedOut: props.treatPendingAsSignedOut }); return userId ? null : <>{children}; } @@ -29,7 +34,7 @@ export async function SignedOut(props: React.PropsWithChildren): Promise { const { children, fallback, ...restAuthorizedParams } = props; - const { has, userId } = await auth(); + const { has, userId } = await auth({ treatPendingAsSignedOut: props.treatPendingAsSignedOut }); /** * Fallback to UI provided by user or `null` if authorization checks failed diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 050d12d68a5..7601a3d74dc 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -702,9 +702,9 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - __experimental_navigateToTask = async (params?: NextTaskParams): Promise => { + __experimental_nextTask = async (params?: NextTaskParams): Promise => { if (this.clerkjs) { - return this.clerkjs.__experimental_navigateToTask(params); + return this.clerkjs.__experimental_nextTask(params); } else { return Promise.reject(); } diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 7ddf374c650..7bda4d7383a 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -712,10 +712,10 @@ export interface Clerk { /** * Navigates to the next task or redirects to completion URL. * If the current session has pending tasks, it navigates to the next task. - * If all tasks are complete, it navigates to the provided completion URL or defaults to the origin redirect URL (either from sign-in or sign-up). + * If all tasks are complete, it navigates to the provided completion URL. * @experimental */ - __experimental_navigateToTask: (params?: NextTaskParams) => Promise; + __experimental_nextTask: (params?: NextTaskParams) => Promise; /** * This is an optional function. From 43f23560f65df009a4cc80b1736517bfa8ce968f Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:32:49 -0300 Subject: [PATCH 3/5] Accept `treatPendingAsSignedOut` on `getAuth` --- .changeset/tender-brooms-look.md | 6 +++++- packages/nextjs/src/server/createGetAuth.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.changeset/tender-brooms-look.md b/.changeset/tender-brooms-look.md index 30029ebefd1..adaf3d4f627 100644 --- a/.changeset/tender-brooms-look.md +++ b/.changeset/tender-brooms-look.md @@ -2,12 +2,16 @@ '@clerk/nextjs': patch --- -Introduce `treatPendingAsSignedOut` to `auth` and server-side control components +Introduce `treatPendingAsSignedOut` to `auth`, `getAuth` and server-side control components ```ts const { userId } = auth({ treatPendingAsSignedOut: false }) ``` +```ts +const { userId } = getAuth(req, { treatPendingAsSignedOut: false }) +``` + ```tsx User has a session that is either pending (requires tasks resolution) or active diff --git a/packages/nextjs/src/server/createGetAuth.ts b/packages/nextjs/src/server/createGetAuth.ts index a879b3f8d44..83b8bb89cf0 100644 --- a/packages/nextjs/src/server/createGetAuth.ts +++ b/packages/nextjs/src/server/createGetAuth.ts @@ -63,7 +63,7 @@ export const createSyncGetAuth = ({ noAuthStatusMessage: string; }) => withLogger(debugLoggerName, logger => { - return (req: RequestLike, opts?: { secretKey?: string }): AuthObject => { + return (req: RequestLike, opts?: { secretKey?: string } & PendingSessionOptions): AuthObject => { if (isTruthy(getHeader(req, constants.Headers.EnableDebug))) { logger.enable(); } From 01197f163428330438e1b55420fe0b34bd0d9f6a Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 30 Apr 2025 14:26:58 -0300 Subject: [PATCH 4/5] Pass `treatPendingAsSignedOut` to `auth` on `clerkMiddleware` --- packages/backend/src/tokens/authStatus.ts | 13 ++++++++++--- packages/nextjs/src/server/clerkMiddleware.ts | 16 ++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/backend/src/tokens/authStatus.ts b/packages/backend/src/tokens/authStatus.ts index 0d73f3e2539..8199ecc3d27 100644 --- a/packages/backend/src/tokens/authStatus.ts +++ b/packages/backend/src/tokens/authStatus.ts @@ -1,4 +1,4 @@ -import type { JwtPayload } from '@clerk/types'; +import type { JwtPayload, PendingSessionOptions } from '@clerk/types'; import { constants } from '../constants'; import type { TokenVerificationErrorReason } from '../errors'; @@ -27,7 +27,7 @@ export type SignedInState = { afterSignInUrl: string; afterSignUpUrl: string; isSignedIn: true; - toAuth: () => SignedInAuthObject; + toAuth: (opts?: PendingSessionOptions) => SignedInAuthObject; headers: Headers; token: string; }; @@ -99,7 +99,14 @@ export function signedIn( afterSignInUrl: authenticateContext.afterSignInUrl || '', afterSignUpUrl: authenticateContext.afterSignUpUrl || '', isSignedIn: true, - toAuth: () => authObject, + // @ts-expect-error Dynamically return `SignedOutAuthObject` based on options + toAuth: ({ treatPendingAsSignedOut = true } = {}) => { + if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') { + return signedOutAuthObject(); + } + + return authObject; + }, headers, token, }; diff --git a/packages/nextjs/src/server/clerkMiddleware.ts b/packages/nextjs/src/server/clerkMiddleware.ts index bd851453493..95a9d22a8a9 100644 --- a/packages/nextjs/src/server/clerkMiddleware.ts +++ b/packages/nextjs/src/server/clerkMiddleware.ts @@ -2,6 +2,7 @@ import type { AuthObject, ClerkClient } from '@clerk/backend'; import type { AuthenticateRequestOptions, ClerkRequest, RedirectFun, RequestState } from '@clerk/backend/internal'; import { AuthStatus, constants, createClerkRequest, createRedirect } from '@clerk/backend/internal'; import { parsePublishableKey } from '@clerk/shared/keys'; +import type { PendingSessionOptions } from '@clerk/types'; import { notFound as nextjsNotFound } from 'next/navigation'; import type { NextMiddleware, NextRequest } from 'next/server'; import { NextResponse } from 'next/server'; @@ -41,7 +42,7 @@ export type ClerkMiddlewareAuthObject = AuthObject & { }; export interface ClerkMiddlewareAuth { - (): Promise; + (opts?: PendingSessionOptions): Promise; protect: AuthProtect; } @@ -182,11 +183,14 @@ export const clerkMiddleware = ((...args: unknown[]): NextMiddleware | NextMiddl const redirectToSignUp = createMiddlewareRedirectToSignUp(clerkRequest); const protect = await createMiddlewareProtect(clerkRequest, authObject, redirectToSignIn); - const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(authObject, { - redirectToSignIn, - redirectToSignUp, - }); - const authHandler = () => Promise.resolve(authObjWithMethods); + const authHandler = (opts?: PendingSessionOptions) => { + const authObjWithMethods: ClerkMiddlewareAuthObject = Object.assign(requestState.toAuth(opts), { + redirectToSignIn, + redirectToSignUp, + }); + + return Promise.resolve(authObjWithMethods); + }; authHandler.protect = protect; let handlerResult: Response = NextResponse.next(); From 897334b34605ea496893ac05c5d33afd7bb968b8 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:30:37 -0300 Subject: [PATCH 5/5] Forward initial session status to signed out object --- .changeset/tender-brooms-look.md | 6 ++++-- packages/backend/src/tokens/authObjects.ts | 10 +++++++--- packages/backend/src/tokens/authStatus.ts | 4 ++-- packages/clerk-js/src/core/__tests__/clerk.test.ts | 4 ++-- packages/clerk-js/src/core/clerk.ts | 4 ++-- .../clerk-js/src/ui/components/SessionTasks/index.tsx | 4 ++-- packages/nextjs/src/server/createGetAuth.ts | 2 +- .../nextjs/src/server/data/getAuthDataFromRequest.ts | 2 +- packages/react/src/isomorphicClerk.ts | 4 ++-- packages/types/src/clerk.ts | 4 ++-- 10 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.changeset/tender-brooms-look.md b/.changeset/tender-brooms-look.md index adaf3d4f627..bf72566a7e0 100644 --- a/.changeset/tender-brooms-look.md +++ b/.changeset/tender-brooms-look.md @@ -1,8 +1,10 @@ --- -'@clerk/nextjs': patch +'@clerk/nextjs': minor --- -Introduce `treatPendingAsSignedOut` to `auth`, `getAuth` and server-side control components +Introduce `treatPendingAsSignedOut` option to `getAuth` and `auth` from `clerkMiddleware` + +By default, `treatPendingAsSignedOut` is set to `true`, which means pending sessions are treated as signed-out. You can set this option to `false` to treat pending sessions as authenticated. ```ts const { userId } = auth({ treatPendingAsSignedOut: false }) diff --git a/packages/backend/src/tokens/authObjects.ts b/packages/backend/src/tokens/authObjects.ts index df0837eb19d..2b7ba218506 100644 --- a/packages/backend/src/tokens/authObjects.ts +++ b/packages/backend/src/tokens/authObjects.ts @@ -5,6 +5,7 @@ import type { JwtPayload, ServerGetToken, ServerGetTokenOptions, + SessionStatusClaim, SharedSignedInAuthObjectProperties, } from '@clerk/types'; @@ -37,7 +38,7 @@ export type SignedInAuthObject = SharedSignedInAuthObjectProperties & { export type SignedOutAuthObject = { sessionClaims: null; sessionId: null; - sessionStatus: null; + sessionStatus: SessionStatusClaim | null; actor: null; userId: null; orgId: null; @@ -113,11 +114,14 @@ export function signedInAuthObject( /** * @internal */ -export function signedOutAuthObject(debugData?: AuthObjectDebugData): SignedOutAuthObject { +export function signedOutAuthObject( + debugData?: AuthObjectDebugData, + initialSessionStatus?: SessionStatusClaim, +): SignedOutAuthObject { return { sessionClaims: null, sessionId: null, - sessionStatus: null, + sessionStatus: initialSessionStatus ?? null, userId: null, actor: null, orgId: null, diff --git a/packages/backend/src/tokens/authStatus.ts b/packages/backend/src/tokens/authStatus.ts index 8199ecc3d27..55c29f7352b 100644 --- a/packages/backend/src/tokens/authStatus.ts +++ b/packages/backend/src/tokens/authStatus.ts @@ -99,10 +99,10 @@ export function signedIn( afterSignInUrl: authenticateContext.afterSignInUrl || '', afterSignUpUrl: authenticateContext.afterSignUpUrl || '', isSignedIn: true, - // @ts-expect-error Dynamically return `SignedOutAuthObject` based on options + // @ts-expect-error The return type is intentionally overridden here to support consumer-facing logic that treats pending sessions as signed out. This override does not affect internal session management like handshake flows. toAuth: ({ treatPendingAsSignedOut = true } = {}) => { if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') { - return signedOutAuthObject(); + return signedOutAuthObject(undefined, authObject.sessionStatus); } return authObject; diff --git a/packages/clerk-js/src/core/__tests__/clerk.test.ts b/packages/clerk-js/src/core/__tests__/clerk.test.ts index 13625f98461..b8238723cb1 100644 --- a/packages/clerk-js/src/core/__tests__/clerk.test.ts +++ b/packages/clerk-js/src/core/__tests__/clerk.test.ts @@ -2284,7 +2284,7 @@ describe('Clerk singleton', () => { await sut.load(mockedLoadOptions); await sut.setActive({ session: mockResource as any as PendingSessionResource }); - await sut.__experimental_nextTask(); + await sut.__experimental_navigateToTask(); expect(mockNavigate.mock.calls[0][0]).toBe('/sign-in#/tasks/add-organization'); }); @@ -2328,7 +2328,7 @@ describe('Clerk singleton', () => { await sut.setActive({ session: mockSession as any as ActiveSessionResource }); const redirectUrlComplete = '/welcome-to-app'; - await sut.__experimental_nextTask({ redirectUrlComplete }); + await sut.__experimental_navigateToTask({ redirectUrlComplete }); console.log(mockNavigate.mock.calls); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 84073f5e89e..2af08c16035 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1199,7 +1199,7 @@ export class Clerk implements ClerkInterface { this.#emit(); }; - public __experimental_nextTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise => { + public __experimental_navigateToTask = async ({ redirectUrlComplete }: NextTaskParams = {}): Promise => { const session = await this.session?.reload(); if (!session || !this.environment) { return; @@ -1216,7 +1216,7 @@ export class Clerk implements ClerkInterface { } const tracker = createBeforeUnloadTracker(this.#options.standardBrowser); - const defaultRedirectUrlComplete = this.client?.signUp ? this.buildAfterSignUpUrl() : this.buildAfterSignUpUrl(); + const defaultRedirectUrlComplete = this.client?.signUp ? this.buildAfterSignUpUrl() : this.buildAfterSignInUrl(); this.#setTransitiveState(); diff --git a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx index dc97a5cb0f5..5aecb49e7e4 100644 --- a/packages/clerk-js/src/ui/components/SessionTasks/index.tsx +++ b/packages/clerk-js/src/ui/components/SessionTasks/index.tsx @@ -21,7 +21,7 @@ const SessionTasksStart = withCardStateProvider(() => { useEffect(() => { // Simulates additional latency to avoid a abrupt UI transition when navigating to the next task const timeoutId = setTimeout(() => { - void clerk.__experimental_nextTask({ redirectUrlComplete }); + void clerk.__experimental_navigateToTask({ redirectUrlComplete }); }, 500); return () => clearTimeout(timeoutId); }, [navigate, clerk, redirectUrlComplete]); @@ -80,7 +80,7 @@ export function SessionTask(): JSX.Element { }, [clerk, navigate, redirectUrlComplete]); const nextTask = useCallback( - () => clerk.__experimental_nextTask({ redirectUrlComplete }), + () => clerk.__experimental_navigateToTask({ redirectUrlComplete }), [clerk, redirectUrlComplete], ); diff --git a/packages/nextjs/src/server/createGetAuth.ts b/packages/nextjs/src/server/createGetAuth.ts index 83b8bb89cf0..cf74811c02e 100644 --- a/packages/nextjs/src/server/createGetAuth.ts +++ b/packages/nextjs/src/server/createGetAuth.ts @@ -53,7 +53,7 @@ export const createAsyncGetAuth = ({ /** * Previous known as `createGetAuth`. We needed to create a sync and async variant in order to allow for improvements * that required dynamic imports (using `require` would not work). - * It powers the synchronous top-level api `getAuh()`. + * It powers the synchronous top-level api `getAuth()`. */ export const createSyncGetAuth = ({ debugLoggerName, diff --git a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts index f1dc0d88cc0..43c15cd5c2d 100644 --- a/packages/nextjs/src/server/data/getAuthDataFromRequest.ts +++ b/packages/nextjs/src/server/data/getAuthDataFromRequest.ts @@ -59,7 +59,7 @@ export function getAuthDataFromRequest( } if (treatPendingAsSignedOut && authObject.sessionStatus === 'pending') { - authObject = signedOutAuthObject(options); + authObject = signedOutAuthObject(options, authObject.sessionStatus); } return authObject; diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 7601a3d74dc..050d12d68a5 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -702,9 +702,9 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - __experimental_nextTask = async (params?: NextTaskParams): Promise => { + __experimental_navigateToTask = async (params?: NextTaskParams): Promise => { if (this.clerkjs) { - return this.clerkjs.__experimental_nextTask(params); + return this.clerkjs.__experimental_navigateToTask(params); } else { return Promise.reject(); } diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 7bda4d7383a..7ddf374c650 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -712,10 +712,10 @@ export interface Clerk { /** * Navigates to the next task or redirects to completion URL. * If the current session has pending tasks, it navigates to the next task. - * If all tasks are complete, it navigates to the provided completion URL. + * If all tasks are complete, it navigates to the provided completion URL or defaults to the origin redirect URL (either from sign-in or sign-up). * @experimental */ - __experimental_nextTask: (params?: NextTaskParams) => Promise; + __experimental_navigateToTask: (params?: NextTaskParams) => Promise; /** * This is an optional function.