Skip to content

feat(clerk-js): Introduce navigate for setActive #6486

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 42 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
9f8e387
Remove `__internal_navigateToTaskIfAvailable`
LauraBeatris Aug 7, 2025
63cb97c
Introduce `onPendingSession` and remove `#componentNavigationContext`
LauraBeatris Aug 7, 2025
d2b6b9a
Remove redirect to task within `withRedirect` guard
LauraBeatris Aug 7, 2025
21730cb
Navigate to tasks from sign up context
LauraBeatris Aug 7, 2025
4511ee1
Remove `NavigateToTask` control component
LauraBeatris Aug 7, 2025
4e8ac6f
Add redirect guards for root sign-in / sign-up AIOs
LauraBeatris Aug 8, 2025
12d5b13
Use `taskUrl` from AIOs navigation
LauraBeatris Aug 8, 2025
09181df
Validate task options on Clerk init
LauraBeatris Aug 8, 2025
9c15f8c
Adjust unit tests with newest API
LauraBeatris Aug 8, 2025
8e8cc86
Remove `#handlePendingSession` branch and introduce `navigate` option
nikosdouvlis Aug 8, 2025
73cb09b
Replace `onPendingSession` with `navigate`
LauraBeatris Aug 8, 2025
1d5cdc9
Add unit tests for invalidation hooks
LauraBeatris Aug 8, 2025
daf0f06
Fix display name of redirect guards
LauraBeatris Aug 8, 2025
bc36a29
Rename `navigateToTask` from `navigateIfTaskExists`
LauraBeatris Aug 8, 2025
da36727
Add warning for missing params for task handling
LauraBeatris Aug 8, 2025
cb3981f
Fix navigation between sign-in/sign-up steps
LauraBeatris Aug 8, 2025
0d99f7e
Preserve `redirectUrl` on `taskUrl` for after sign-in/sign-up
LauraBeatris Aug 8, 2025
ef2df25
Add changesets
LauraBeatris Aug 8, 2025
78a7258
Navigate to next task if any from AIOs
LauraBeatris Aug 8, 2025
69593ad
Fix `warnMissingPendingTaskHandlers` call
LauraBeatris Aug 8, 2025
695000d
Add `@inline` to `SetActiveNavigate` type
LauraBeatris Aug 8, 2025
3a2a345
Fix navigation on active sessions
LauraBeatris Aug 8, 2025
09c40ae
Fix mocking of `signedInSessions`
LauraBeatris Aug 8, 2025
87d59c2
Update custom flow snippet from changeset
LauraBeatris Aug 8, 2025
eee514b
Fix typedoc tests
LauraBeatris Aug 8, 2025
aad5654
Fix navigation for multi-session
LauraBeatris Aug 8, 2025
073b648
Use `navigate` for `setActive` on combined flow
LauraBeatris Aug 9, 2025
a46e00e
Rename `RedirectToTask` control component to `RedirectToTasks`
LauraBeatris Aug 9, 2025
6c298ac
Fix E2E test for sign-up with tasks
LauraBeatris Aug 9, 2025
8077716
Display root sign-in for multi-session mode with tasks
LauraBeatris Aug 9, 2025
738c9f0
Fix navigating to tasks on SSO callback
LauraBeatris Aug 9, 2025
b031996
Bump max size of `clerk.headless` bundle
LauraBeatris Aug 9, 2025
bbe73ad
Remove condition to always send `redirect_url` for SSO with after-aut…
LauraBeatris Aug 11, 2025
fea15d0
Remove duplicated changeset
LauraBeatris Aug 11, 2025
f570e5e
Remove `SessionTasksContext` from `TaskChooseOrganization`
LauraBeatris Aug 11, 2025
01b9740
Fix `redirectUrl` for SSO with SignIn
LauraBeatris Aug 11, 2025
750c266
Run `onAfterSetActive` if the new session is `active`
LauraBeatris Aug 11, 2025
fc642c3
Always use the latest session for status checks
nikosdouvlis Aug 11, 2025
80e50a9
Fix early returns in setActive
nikosdouvlis Aug 11, 2025
f3a3ad2
Fix session status check within `setActive`
LauraBeatris Aug 12, 2025
ff831cc
Maintain base URL of sign-in/sign-up for routing
LauraBeatris Aug 12, 2025
16b3b5f
Fix navigation for SSO to maintain path and hash routing
LauraBeatris Aug 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .changeset/rich-donuts-agree.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
'@clerk/clerk-js': minor
'@clerk/types': minor
---

Add `navigate` parameter to `clerk.setActive()` for custom navigation before the session and/or organization is set.

It's useful for handling pending session tasks for after-auth flows:

```typescript
await clerk.setActive({
session,
navigate: async ({ session }) => {
const currentTask = session.currentTask;
if (currentTask) {
await router.push(`/onboarding/${currentTask.key}`)
return;
}

await navigate('/dashboard')
}
});
```
11 changes: 11 additions & 0 deletions .changeset/warm-rocks-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@clerk/tanstack-react-start': minor
'@clerk/react-router': minor
'@clerk/nextjs': minor
'@clerk/clerk-react': minor
'@clerk/remix': minor
'@clerk/types': minor
'@clerk/vue': minor
---

Rename `RedirectToTask` control component to `RedirectToTasks`
2 changes: 1 addition & 1 deletion integration/tests/session-tasks-sign-in.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })(
await u.po.signIn.enterTestOtpCode();

// Resolves task
await u.po.signIn.waitForMounted();
await u.po.signUp.waitForMounted();
const fakeOrganization = Object.assign(u.services.organizations.createFakeOrganization(), {
slug: u.services.organizations.createFakeOrganization().slug + '-with-sign-in-sso',
});
Expand Down
32 changes: 25 additions & 7 deletions integration/tests/session-tasks-sign-up.test.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
import { createClerkClient } from '@clerk/backend';
import { expect, test } from '@playwright/test';

import { appConfigs } from '../presets';
import { instanceKeys } from '../presets/envs';
import type { FakeUser } from '../testUtils';
import { createTestUtils, testAgainstRunningApps } from '../testUtils';
import { createUserService } from '../testUtils/usersService';

testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })(
'session tasks after sign-up flow @nextjs',
({ app }) => {
test.describe.configure({ mode: 'serial' });

let fakeUser: FakeUser;
let regularFakeUser: FakeUser;
let fakeUserForOAuth: FakeUser;

test.beforeEach(() => {
const u = createTestUtils({ app });
fakeUser = u.services.users.createFakeUser({
regularFakeUser = u.services.users.createFakeUser({
fictionalEmail: true,
withPhoneNumber: true,
withUsername: true,
});
fakeUserForOAuth = u.services.users.createFakeUser({
fictionalEmail: true,
withPhoneNumber: true,
withUsername: true,
Expand All @@ -23,7 +32,16 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })(
test.afterAll(async () => {
const u = createTestUtils({ app });
await u.services.organizations.deleteAll();
await fakeUser.deleteIfExists();
await regularFakeUser.deleteIfExists();

// Delete user from OAuth provider instance
const client = createClerkClient({
secretKey: instanceKeys.get('oauth-provider').sk,
publishableKey: instanceKeys.get('oauth-provider').pk,
});
const users = createUserService(client);
await users.deleteIfExists({ email: fakeUserForOAuth.email });

await app.teardown();
});

Expand All @@ -38,8 +56,8 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })(
const u = createTestUtils({ app, page, context });
await u.po.signUp.goTo();
await u.po.signUp.signUpWithEmailAndPassword({
email: fakeUser.email,
password: fakeUser.password,
email: regularFakeUser.email,
password: regularFakeUser.password,
});
await u.po.expect.toBeSignedIn();

Expand Down Expand Up @@ -68,12 +86,12 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })(
await u.po.signIn.getGoToSignUp().click();

await u.po.signUp.waitForMounted();
await u.po.signUp.setEmailAddress(fakeUser.email);
await u.po.signUp.setEmailAddress(fakeUserForOAuth.email);
await u.po.signUp.continue();
await u.po.signUp.enterTestOtpCode();

// Resolves task
await u.po.signIn.waitForMounted();
await u.po.signUp.waitForMounted();
const fakeOrganization = Object.assign(u.services.organizations.createFakeOrganization(), {
slug: u.services.organizations.createFakeOrganization().slug + '-with-sign-in-sso',
});
Expand Down
6 changes: 3 additions & 3 deletions packages/clerk-js/bundlewatch.config.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"files": [
{ "path": "./dist/clerk.js", "maxSize": "622KB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "76KB" },
{ "path": "./dist/clerk.js", "maxSize": "625KB" },
{ "path": "./dist/clerk.browser.js", "maxSize": "78KB" },
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "117KB" },
{ "path": "./dist/clerk.headless*.js", "maxSize": "58KB" },
{ "path": "./dist/clerk.headless*.js", "maxSize": "61KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "113KB" },
{ "path": "./dist/ui-common*.legacy.*.js", "maxSize": "118KB" },
{ "path": "./dist/vendors*.js", "maxSize": "40.2KB" },
Expand Down
Loading
Loading