diff --git a/.changeset/rename-setactive-to-setselected.md b/.changeset/rename-setactive-to-setselected.md new file mode 100644 index 00000000000..0bc487cfa59 --- /dev/null +++ b/.changeset/rename-setactive-to-setselected.md @@ -0,0 +1,35 @@ +--- +"@clerk/clerk-js": major +"@clerk/shared": major +"@clerk/react": major +"@clerk/nextjs": major +"@clerk/vue": major +"@clerk/expo": major +"@clerk/ui": major +"@clerk/testing": major +"@clerk/upgrade": patch +--- + +Rename `setActive` to `setSelected` + +**BREAKING CHANGE:** The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions. + +### Method Rename +- `clerk.setActive()` → `clerk.setSelected()` +- Hooks now return `setSelected` instead of `setActive`: + - `useSignIn()` + - `useSignUp()` + - `useSessionList()` + - `useOrganizationList()` + +### Type Renames +- `SetActive` → `SetSelected` +- `SetActiveParams` → `SetSelectedParams` +- `SetActiveNavigate` → `SetSelectedNavigate` +- `SetActiveHook` → `SetSelectedHook` + +### Migration +Use the `@clerk/upgrade` codemod for automatic migration: +```bash +npx @clerk/upgrade +``` diff --git a/integration/tests/session-token-cache/multi-session.test.ts b/integration/tests/session-token-cache/multi-session.test.ts index 2f05eab18c3..3d705cc6c1d 100644 --- a/integration/tests/session-token-cache/multi-session.test.ts +++ b/integration/tests/session-token-cache/multi-session.test.ts @@ -117,7 +117,7 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })( password: password, }); - await clerk.setActive({ + await clerk.setSelected({ session: signIn.createdSessionId, }); @@ -191,10 +191,10 @@ testAgainstRunningApps({ withEnv: [appConfigs.envs.withSessionTasks] })( async ({ user1SessionId, user2SessionId }) => { const clerk = (window as any).Clerk; - await clerk.setActive({ session: user1SessionId }); + await clerk.setSelected({ session: user1SessionId }); const user1Token = await clerk.session?.getToken(); - await clerk.setActive({ session: user2SessionId }); + await clerk.setSelected({ session: user2SessionId }); const user2Token = await clerk.session?.getToken(); return { diff --git a/packages/clerk-js/src/core/__tests__/clerk.test.ts b/packages/clerk-js/src/core/__tests__/clerk.test.ts index de0562da1bf..dbbc355894e 100644 --- a/packages/clerk-js/src/core/__tests__/clerk.test.ts +++ b/packages/clerk-js/src/core/__tests__/clerk.test.ts @@ -157,7 +157,7 @@ describe('Clerk singleton', () => { }); }); - describe('.setActive', () => { + describe('.setSelected', () => { describe('with `active` session status', () => { const mockSession = { id: '1', @@ -190,7 +190,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: null }); + await sut.setSelected({ session: null }); await waitFor(() => { expect(mockSession.touch).not.toHaveBeenCalled(); expect(eventBusSpy).toHaveBeenCalledWith('token:update', { token: null }); @@ -203,7 +203,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); expect(mockSession.touch).toHaveBeenCalled(); }); @@ -214,7 +214,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load({ touchSession: false }); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); expect(mockSession.touch).toHaveBeenCalled(); }); }); @@ -229,7 +229,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); expect(mockSession.touch).toHaveBeenCalled(); }); @@ -243,7 +243,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); }); it('sets active organization by slug', async () => { @@ -274,7 +274,7 @@ describe('Clerk singleton', () => { }); mockSession2.getToken.mockImplementation(() => 'mocked-token'); - await sut.setActive({ organization: 'some-org-slug' }); + await sut.setSelected({ organization: 'some-org-slug' }); await waitFor(() => { expect(mockSession2.touch).toHaveBeenCalled(); @@ -299,7 +299,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); sut.navigate = vi.fn(); await sut.load(); - await sut.setActive({ + await sut.setSelected({ session: mockSession as any as ActiveSessionResource, redirectUrl: '/redirect-url-path', }); @@ -323,7 +323,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); sut.navigate = vi.fn(); await sut.load(); - await sut.setActive({ + await sut.setSelected({ session: mockSession as any as ActiveSessionResource, redirectUrl: '/redirect-url-path', }); @@ -345,7 +345,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); sut.navigate = vi.fn(); await sut.load(); - await sut.setActive({ + await sut.setSelected({ session: mockSession as any as ActiveSessionResource, redirectUrl: '/redirect-url-path', }); @@ -359,7 +359,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as PendingSessionResource, navigate }); + await sut.setSelected({ session: mockSession as any as PendingSessionResource, navigate }); expect(mockSession.touch).toHaveBeenCalled(); expect(navigate).toHaveBeenCalled(); }); @@ -376,7 +376,7 @@ describe('Clerk singleton', () => { return Promise.resolve(); }); - await sut.setActive({ organization: { id: 'org_id' } as Organization }); + await sut.setSelected({ organization: { id: 'org_id' } as Organization }); expect(mockSession.touch).toHaveBeenCalled(); expect((mockSession as any as ActiveSessionResource)?.lastActiveOrganizationId).toEqual('org_id'); @@ -431,7 +431,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as PendingSessionResource }); + await sut.setSelected({ session: mockSession as any as PendingSessionResource }); expect(mockSession.touch).toHaveBeenCalled(); }); @@ -444,7 +444,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); expect(onBeforeSetActive).not.toHaveBeenCalled(); }); @@ -457,7 +457,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as ActiveSessionResource }); + await sut.setSelected({ session: mockSession as any as ActiveSessionResource }); expect(onAfterSetActive).not.toHaveBeenCalled(); }); @@ -472,7 +472,7 @@ describe('Clerk singleton', () => { 'choose-organization': '/choose-organization', }, }); - await sut.setActive({ session: mockSession as any as PendingSessionResource }); + await sut.setSelected({ session: mockSession as any as PendingSessionResource }); expect(mockSession.touch).toHaveBeenCalled(); expect(sut.navigate).toHaveBeenCalledWith('/choose-organization'); }); @@ -484,7 +484,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(); - await sut.setActive({ session: mockSession as any as PendingSessionResource, navigate }); + await sut.setSelected({ session: mockSession as any as PendingSessionResource, navigate }); expect(mockSession.touch).toHaveBeenCalled(); expect(navigate).toHaveBeenCalled(); }); @@ -555,7 +555,7 @@ describe('Clerk singleton', () => { }); mockSessionWithOrganization.getToken.mockImplementation(() => 'mocked-token'); - await sut.setActive({ organization: 'some-org-slug' }); + await sut.setSelected({ organization: 'some-org-slug' }); await waitFor(() => { expect(mockSessionWithOrganization.touch).toHaveBeenCalled(); @@ -566,7 +566,7 @@ describe('Clerk singleton', () => { expect(sut.session).toMatchObject(mockSessionWithOrganization); }); - await sut.setActive({ organization: null }); + await sut.setSelected({ organization: null }); expect(sut.session).toMatchObject(mockSessionWithOrganization); }); }); @@ -938,7 +938,7 @@ describe('Clerk singleton', () => { }); }); - it('creates a new user and calls setActive if the user was not found during sso signup', async () => { + it('creates a new user and calls setSelected if the user was not found during sso signup', async () => { mockEnvironmentFetch.mockReturnValue( Promise.resolve({ authConfig: {}, @@ -987,7 +987,7 @@ describe('Clerk singleton', () => { fail('we should always have a client'); } sut.client.signUp.create = mockSignUpCreate; - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await sut.handleRedirectCallback(); @@ -1046,7 +1046,7 @@ describe('Clerk singleton', () => { fail('we should always have a client'); } sut.client.signUp.create = mockSignUpCreate; - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await sut.handleRedirectCallback({ transferable: false }); @@ -1178,7 +1178,7 @@ describe('Clerk singleton', () => { fail('we should always have a client'); } sut.client.signIn.create = mockSignInCreate; - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await sut.handleRedirectCallback(); @@ -1188,7 +1188,7 @@ describe('Clerk singleton', () => { }); }); - it('signs the user by calling setActive if the user was already signed in during sign up', async () => { + it('signs the user by calling setSelected if the user was already signed in during sign up', async () => { mockEnvironmentFetch.mockReturnValue( Promise.resolve({ authConfig: {}, @@ -1230,7 +1230,7 @@ describe('Clerk singleton', () => { const mockSetActive = vi.fn(); const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await sut.handleRedirectCallback(); @@ -1239,7 +1239,7 @@ describe('Clerk singleton', () => { }); }); - it('creates a new user and calls setActive in if the user was found during sign in', async () => { + it('creates a new user and calls setSelected in if the user was found during sign in', async () => { mockEnvironmentFetch.mockReturnValue( Promise.resolve({ authConfig: {}, @@ -1284,7 +1284,7 @@ describe('Clerk singleton', () => { fail('we should always have a client'); } sut.client.signUp.create = mockSignUpCreate; - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await sut.handleRedirectCallback(); @@ -1950,7 +1950,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; const redirectUrlComplete = '/redirect-to'; await sut.handleEmailLinkVerification({ redirectUrlComplete }); @@ -1979,7 +1979,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; const redirectUrl = '/2fa'; sut.handleEmailLinkVerification({ redirectUrl }); @@ -2010,7 +2010,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; const redirectUrlComplete = '/redirect-to'; await sut.handleEmailLinkVerification({ redirectUrlComplete }); @@ -2039,7 +2039,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; const redirectUrl = '/next-up'; sut.handleEmailLinkVerification({ redirectUrl }); @@ -2064,7 +2064,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await expect(async () => { await sut.handleEmailLinkVerification({}); @@ -2086,7 +2086,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await expect(async () => { await sut.handleEmailLinkVerification({}); @@ -2110,7 +2110,7 @@ describe('Clerk singleton', () => { const mockSetActive = vi.fn(); const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; const res = { ping: 'ping' }; const cb = () => { res.ping = 'pong'; @@ -2133,7 +2133,7 @@ describe('Clerk singleton', () => { const mockSetActive = vi.fn(); const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await expect(async () => { await sut.handleEmailLinkVerification({}); }).rejects.toThrow(EmailLinkErrorCodeStatus.Failed); @@ -2158,7 +2158,7 @@ describe('Clerk singleton', () => { const mockSetActive = vi.fn(); const sut = new Clerk(productionPublishableKey); await sut.load(mockedLoadOptions); - sut.setActive = mockSetActive; + sut.setSelected = mockSetActive; await expect(async () => { await sut.handleEmailLinkVerification({}); @@ -2352,15 +2352,15 @@ describe('Clerk singleton', () => { describe('updateClient', () => { afterEach(() => { // cleanup global window pollution - (window as any).__internal_onBeforeSetActive = null; - (window as any).__internal_onAfterSetActive = null; + (window as any).__internal_onBeforeSetSelected = null; + (window as any).__internal_onAfterSetSelected = null; }); it('runs server revalidation hooks when session transitions from `active` to `pending`', async () => { - const mockOnBeforeSetActive = vi.fn().mockReturnValue(Promise.resolve()); - const mockOnAfterSetActive = vi.fn().mockReturnValue(Promise.resolve()); - (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive; - (window as any).__internal_onAfterSetActive = mockOnAfterSetActive; + const mockOnBeforeSetSelected = vi.fn().mockReturnValue(Promise.resolve()); + const mockOnAfterSetSelected = vi.fn().mockReturnValue(Promise.resolve()); + (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetSelected; + (window as any).__internal_onAfterSetSelected = mockOnAfterSetSelected; const mockActiveSession = { id: 'session_1', @@ -2391,7 +2391,7 @@ describe('Clerk singleton', () => { const sut = new Clerk(productionPublishableKey); // Manually set the initial client and session state to simulate active session - // without going through load() or setActive() + // without going through load() or setSelected() sut.updateClient(mockInitialClient as any); // Verify we start with an active session @@ -2402,7 +2402,7 @@ describe('Clerk singleton', () => { // Verify hooks were called await waitFor(() => { - expect(mockOnAfterSetActive).toHaveBeenCalledTimes(1); + expect(mockOnAfterSetSelected).toHaveBeenCalledTimes(1); }); }); }); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 38a8e411478..b15eca4d039 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -98,7 +98,7 @@ import type { Resources, SDKMetadata, SessionResource, - SetActiveParams, + SetSelectedParams, SignedInSessionResource, SignInProps, SignInRedirectOptions, @@ -176,7 +176,7 @@ import { Protect } from './protect'; import { BaseResource, Client, Environment, Organization, Waitlist } from './resources/internal'; import { State } from './state'; -type SetActiveHook = (intent?: 'sign-out') => void | Promise; +type SetSelectedHook = (intent?: 'sign-out') => void | Promise; declare global { interface Window { @@ -297,7 +297,7 @@ export class Clerk implements ClerkInterface { public __internal_isWebAuthnAutofillSupported: (() => Promise) | undefined; public __internal_isWebAuthnPlatformAuthenticatorSupported: (() => Promise) | undefined; - public __internal_setActiveInProgress = false; + public __internal_setSelectedInProgress = false; get publishableKey(): string { return this.#publishableKey; @@ -582,14 +582,14 @@ export class Clerk implements ClerkInterface { return; } - const onBeforeSetActive: SetActiveHook = - typeof window !== 'undefined' && typeof window.__internal_onBeforeSetActive === 'function' - ? window.__internal_onBeforeSetActive + const onBeforeSetSelected: SetSelectedHook = + typeof window !== 'undefined' && typeof window.__internal_onBeforeSetSelected === 'function' + ? window.__internal_onBeforeSetSelected : noop; - const onAfterSetActive: SetActiveHook = - typeof window !== 'undefined' && typeof window.__internal_onAfterSetActive === 'function' - ? window.__internal_onAfterSetActive + const onAfterSetSelected: SetSelectedHook = + typeof window !== 'undefined' && typeof window.__internal_onAfterSetSelected === 'function' + ? window.__internal_onAfterSetSelected : noop; const opts = callbackOrOptions && typeof callbackOrOptions === 'object' ? callbackOrOptions : options || {}; @@ -630,15 +630,15 @@ export class Clerk implements ClerkInterface { this.#setAccessors(); this.#emit(); - await onAfterSetActive(); + await onAfterSetSelected(); }; /** * Clears the router cache for `@clerk/nextjs` on all routes except the current one. - * Note: Calling `onBeforeSetActive` before signing out, allows for new RSC prefetch requests to render as signed in. - * Since we are calling `onBeforeSetActive` before signing out, we should NOT pass `"sign-out"`. + * Note: Calling `onBeforeSetSelected` before signing out, allows for new RSC prefetch requests to render as signed in. + * Since we are calling `onBeforeSetSelected` before signing out, we should NOT pass `"sign-out"`. */ - await onBeforeSetActive(); + await onBeforeSetSelected(); if (!opts.sessionId || this.client.signedInSessions.length === 1) { if (this.#options.experimental?.persistClient ?? true) { await this.client.removeSessions(); @@ -1441,14 +1441,14 @@ export class Clerk implements ClerkInterface { }; /** - * `setActive` can be used to set the active session and/or organization. + * `setSelected` can be used to set the selected session and/or organization. */ - public setActive = async (params: SetActiveParams): Promise => { - const { organization, redirectUrl, navigate: setActiveNavigate } = params; + public setSelected = async (params: SetSelectedParams): Promise => { + const { organization, redirectUrl, navigate: setSelectedNavigate } = params; let { session } = params; - this.__internal_setActiveInProgress = true; + this.__internal_setSelectedInProgress = true; debugLogger.debug( - 'setActive() start', + 'setSelected() start', { hasClient: Boolean(this.client), sessionTarget: typeof session === 'string' ? session : (session?.id ?? session ?? null), @@ -1460,14 +1460,18 @@ export class Clerk implements ClerkInterface { ); try { if (!this.client) { - debugLogger.warn('Clerk setActive called before client is loaded', {}, 'clerk'); - throw new Error('setActive is being called before the client is loaded. Wait for init.'); + debugLogger.warn('Clerk setSelected called before client is loaded', {}, 'clerk'); + throw new Error('setSelected is being called before the client is loaded. Wait for init.'); } if (session === undefined && !this.session) { - debugLogger.warn('Clerk setActive precondition not met: no target session and no active session', {}, 'clerk'); + debugLogger.warn( + 'Clerk setSelected precondition not met: no target session and no selected session', + {}, + 'clerk', + ); throw new Error( - 'setActive should either be called with a session param or there should be already an active session.', + 'setSelected should either be called with a session param or there should be already a selected session.', ); } @@ -1475,14 +1479,14 @@ export class Clerk implements ClerkInterface { session = (this.client.sessions.find(x => x.id === session) as SignedInSessionResource) || null; } - const onBeforeSetActive: SetActiveHook = - typeof window !== 'undefined' && typeof window.__internal_onBeforeSetActive === 'function' - ? window.__internal_onBeforeSetActive + const onBeforeSetSelected: SetSelectedHook = + typeof window !== 'undefined' && typeof window.__internal_onBeforeSetSelected === 'function' + ? window.__internal_onBeforeSetSelected : noop; - const onAfterSetActive: SetActiveHook = - typeof window !== 'undefined' && typeof window.__internal_onAfterSetActive === 'function' - ? window.__internal_onAfterSetActive + const onAfterSetSelected: SetSelectedHook = + typeof window !== 'undefined' && typeof window.__internal_onAfterSetSelected === 'function' + ? window.__internal_onAfterSetSelected : noop; let newSession = session === undefined ? this.session : session; @@ -1524,7 +1528,7 @@ export class Clerk implements ClerkInterface { /** * Hint to each framework, that the user will be signed out when `{session: null}` is provided. */ - await onBeforeSetActive(newSession === null ? 'sign-out' : undefined); + await onBeforeSetSelected(newSession === null ? 'sign-out' : undefined); } //1. setLastActiveSession to passed user session (add a param). @@ -1560,7 +1564,7 @@ export class Clerk implements ClerkInterface { newSession?.currentTask && this.#options.taskUrls?.[newSession?.currentTask.key]; - if (redirectUrl || taskUrl || setActiveNavigate) { + if (redirectUrl || taskUrl || setSelectedNavigate) { await tracker.track(async () => { if (!this.client) { // Typescript is not happy because since thinks this.client might have changed to undefined because the function is asynchronous. @@ -1576,8 +1580,8 @@ export class Clerk implements ClerkInterface { ? buildURL({ base: taskUrl, hashSearchParams: { redirectUrl } }, { stringify: true }) : taskUrl; await this.navigate(taskUrlWithRedirect); - } else if (setActiveNavigate && newSession) { - await setActiveNavigate({ session: newSession }); + } else if (setSelectedNavigate && newSession) { + await setSelectedNavigate({ session: newSession }); } else if (redirectUrl) { if (this.client.isEligibleForTouch()) { const absoluteRedirectUrl = new URL(redirectUrl, window.location.href); @@ -1602,10 +1606,10 @@ export class Clerk implements ClerkInterface { // Do not revalidate server cache for pending sessions to avoid unmount of `SignIn/SignUp` AIOs when navigating to task // newSession can be mutated by the time we get here (org change session touch) if (newSession?.status !== 'pending') { - await onAfterSetActive(); + await onAfterSetSelected(); } } finally { - this.__internal_setActiveInProgress = false; + this.__internal_setSelectedInProgress = false; } }; @@ -2009,7 +2013,7 @@ export class Clerk implements ClerkInterface { const redirectContinue = params.redirectUrl ? () => navigate(params.redirectUrl as string) : noop; if (shouldCompleteOnThisDevice) { - return this.setActive({ + return this.setSelected({ session: newSessionId, redirectUrl: params.redirectUrlComplete, }); @@ -2160,7 +2164,7 @@ export class Clerk implements ClerkInterface { const signInUrl = params.signInUrl || displayConfig.signInUrl; const signUpUrl = params.signUpUrl || displayConfig.signUpUrl; - const setActiveNavigate = async ({ + const setSelectedNavigate = async ({ session, baseUrl, redirectUrl, @@ -2181,10 +2185,10 @@ export class Clerk implements ClerkInterface { }; if (si.status === 'complete') { - return this.setActive({ + return this.setSelected({ session: si.sessionId, navigate: async ({ session }) => { - await setActiveNavigate({ session, baseUrl: signInUrl, redirectUrl: redirectUrls.getAfterSignInUrl() }); + await setSelectedNavigate({ session, baseUrl: signInUrl, redirectUrl: redirectUrls.getAfterSignInUrl() }); }, }); } @@ -2196,10 +2200,10 @@ export class Clerk implements ClerkInterface { const res = await signIn.create({ transfer: true }); switch (res.status) { case 'complete': - return this.setActive({ + return this.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { - await setActiveNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignInUrl() }); + await setSelectedNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignInUrl() }); }, }); case 'needs_first_factor': @@ -2247,10 +2251,10 @@ export class Clerk implements ClerkInterface { const res = await signUp.create({ transfer: true }); switch (res.status) { case 'complete': - return this.setActive({ + return this.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { - await setActiveNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignUpUrl() }); + await setSelectedNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignUpUrl() }); }, }); case 'missing_requirements': @@ -2261,10 +2265,10 @@ export class Clerk implements ClerkInterface { } if (su.status === 'complete') { - return this.setActive({ + return this.setSelected({ session: su.sessionId, navigate: async ({ session }) => { - await setActiveNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignUpUrl() }); + await setSelectedNavigate({ session, baseUrl: signUpUrl, redirectUrl: redirectUrls.getAfterSignUpUrl() }); }, }); } @@ -2287,10 +2291,10 @@ export class Clerk implements ClerkInterface { if (userAlreadySignedIn) { const sessionId = si.firstFactorVerificationSessionId || su.externalAccountSessionId; if (sessionId) { - return this.setActive({ + return this.setSelected({ session: sessionId, navigate: async ({ session }) => { - await setActiveNavigate({ + await setSelectedNavigate({ session, baseUrl: suUserAlreadySignedIn ? signUpUrl : signInUrl, redirectUrl: redirectUrls.getAfterSignInUrl(), @@ -2351,14 +2355,14 @@ export class Clerk implements ClerkInterface { if (opts.broadcast) { eventBus.emit(events.UserSignOut, null); } - return this.setActive({ session: null }); + return this.setSelected({ session: null }); } catch (err) { // `/client` can fail with either a 401, a 403, 500 or network errors. // 401 is already handled internally in our fetcher. // 403 means that the client is blocked, signing out the user is the only option. // 500 means that the client is not working, signing out the user is the only option, since the intention was to sign out the user. if (isClerkAPIResponseError(err) && [403, 500].includes(err.status)) { - return this.setActive({ session: null }); + return this.setSelected({ session: null }); } else { throw err; } @@ -2518,7 +2522,7 @@ export class Clerk implements ClerkInterface { } } - const setActiveNavigate = async ({ session, redirectUrl }: { session: SessionResource; redirectUrl: string }) => { + const setSelectedNavigate = async ({ session, redirectUrl }: { session: SessionResource; redirectUrl: string }) => { if (!session.currentTask) { await this.navigate(redirectUrl); return; @@ -2536,10 +2540,10 @@ export class Clerk implements ClerkInterface { break; case 'complete': if (signInOrSignUp.createdSessionId) { - await this.setActive({ + await this.setSelected({ session: signInOrSignUp.createdSessionId, navigate: async ({ session }) => { - await setActiveNavigate({ session, redirectUrl: redirectUrl ?? this.buildAfterSignInUrl() }); + await setSelectedNavigate({ session, redirectUrl: redirectUrl ?? this.buildAfterSignInUrl() }); }, }); } @@ -2595,14 +2599,14 @@ export class Clerk implements ClerkInterface { const hasTransitionedToPendingStatus = this.session.status === 'active' && session?.status === 'pending'; if (hasTransitionedToPendingStatus) { - const onAfterSetActive: SetActiveHook = - typeof window !== 'undefined' && typeof window.__internal_onAfterSetActive === 'function' - ? window.__internal_onAfterSetActive + const onAfterSetSelected: SetSelectedHook = + typeof window !== 'undefined' && typeof window.__internal_onAfterSetSelected === 'function' + ? window.__internal_onAfterSetSelected : noop; // Execute hooks to update server authentication context and trigger // page protections in clerkMiddleware or server components - void onAfterSetActive(); + void onAfterSetSelected(); } // Note: this might set this.session to null diff --git a/packages/clerk-js/src/core/modules/checkout/instance.ts b/packages/clerk-js/src/core/modules/checkout/instance.ts index 85224308462..6ae5abed847 100644 --- a/packages/clerk-js/src/core/modules/checkout/instance.ts +++ b/packages/clerk-js/src/core/modules/checkout/instance.ts @@ -34,7 +34,7 @@ function createCheckoutInstance(clerk: Clerk, options: __experimental_CheckoutOp if (forOrganization === 'organization' && clerk.organization === null) { throw new Error( - 'Clerk: The current session does not have an active organization. Use `setActive` to set the organization', + 'Clerk: The current session does not have an active organization. Use `setSelected` to set the organization', ); } diff --git a/packages/clerk-js/src/core/resources/BillingCheckout.ts b/packages/clerk-js/src/core/resources/BillingCheckout.ts index 0dbadd220fa..133b7e70ab6 100644 --- a/packages/clerk-js/src/core/resources/BillingCheckout.ts +++ b/packages/clerk-js/src/core/resources/BillingCheckout.ts @@ -204,7 +204,7 @@ export class CheckoutFlow implements CheckoutFlowResourceNonStrict { throw new Error('Clerk: `confirm()` must be called before `finalize()`'); } - await BillingCheckout.clerk.setActive({ session: BillingCheckout.clerk.session?.id, navigate }); + await BillingCheckout.clerk.setSelected({ session: BillingCheckout.clerk.session?.id, navigate }); }); } diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 2ceec76dd3a..182a4d3b5cc 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -1243,7 +1243,7 @@ class SignInFuture implements SignInFutureResource { } this.#hasBeenFinalized = true; - await SignIn.clerk.setActive({ session: this.#resource.createdSessionId, navigate }); + await SignIn.clerk.setSelected({ session: this.#resource.createdSessionId, navigate }); }); } diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 53d3b0647d9..1b22c3d9390 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -972,7 +972,7 @@ class SignUpFuture implements SignUpFutureResource { } this.#hasBeenFinalized = true; - await SignUp.clerk.setActive({ session: this.#resource.createdSessionId, navigate }); + await SignUp.clerk.setSelected({ session: this.#resource.createdSessionId, navigate }); }); } } diff --git a/packages/clerk-js/src/core/resources/__tests__/SignIn.test.ts b/packages/clerk-js/src/core/resources/__tests__/SignIn.test.ts index a2e905a854c..f3f0bd1a45c 100644 --- a/packages/clerk-js/src/core/resources/__tests__/SignIn.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/SignIn.test.ts @@ -1858,7 +1858,7 @@ describe('SignIn', () => { SignIn.clerk = { client: { reload: mockReload, sessions: [] }, - setActive: mockSetActive, + setSelected: mockSetActive, } as any; const signIn = new SignIn({ id: 'signin_123', created_session_id: 'session_123' } as any); @@ -1868,14 +1868,14 @@ describe('SignIn', () => { expect(mockSetActive).toHaveBeenCalledWith({ session: 'session_123', navigate: undefined }); }); - it('passes navigate parameter to setActive', async () => { + it('passes navigate parameter to setSelected', async () => { const mockReload = vi.fn().mockResolvedValue({}); const mockSetActive = vi.fn().mockResolvedValue({}); const mockNavigate = vi.fn(); SignIn.clerk = { client: { reload: mockReload, sessions: [] }, - setActive: mockSetActive, + setSelected: mockSetActive, } as any; const signIn = new SignIn({ id: 'signin_123', created_session_id: 'session_123' } as any); diff --git a/packages/clerk-js/src/core/resources/__tests__/SignUp.test.ts b/packages/clerk-js/src/core/resources/__tests__/SignUp.test.ts index 663fa63d6d2..02f6ab51a7c 100644 --- a/packages/clerk-js/src/core/resources/__tests__/SignUp.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/SignUp.test.ts @@ -666,11 +666,11 @@ describe('SignUp', () => { vi.clearAllMocks(); }); - it('calls setActive with created session ID', async () => { + it('calls setSelected with created session ID', async () => { const mockSetActive = vi.fn().mockResolvedValue({}); SignUp.clerk = { - setActive: mockSetActive, + setSelected: mockSetActive, } as any; const signUp = new SignUp({ id: 'signup_123', created_session_id: 'session_123' } as any); @@ -679,12 +679,12 @@ describe('SignUp', () => { expect(mockSetActive).toHaveBeenCalledWith({ session: 'session_123', navigate: undefined }); }); - it('passes navigate parameter to setActive', async () => { + it('passes navigate parameter to setSelected', async () => { const mockSetActive = vi.fn().mockResolvedValue({}); const mockNavigate = vi.fn(); SignUp.clerk = { - setActive: mockSetActive, + setSelected: mockSetActive, } as any; const signUp = new SignUp({ id: 'signup_123', created_session_id: 'session_123' } as any); diff --git a/packages/clerk-js/src/global.d.ts b/packages/clerk-js/src/global.d.ts index 52a15e8dee6..ee7d741e7da 100644 --- a/packages/clerk-js/src/global.d.ts +++ b/packages/clerk-js/src/global.d.ts @@ -15,8 +15,8 @@ const __BUILD_VARIANT_CHANNEL__: boolean; const __BUILD_VARIANT_CHIPS__: boolean; interface Window { - __internal_onBeforeSetActive: (intent?: 'sign-out') => Promise | void; - __internal_onAfterSetActive: () => Promise | void; + __internal_onBeforeSetSelected: (intent?: 'sign-out') => Promise | void; + __internal_onAfterSetSelected: () => Promise | void; // eslint-disable-next-line @typescript-eslint/consistent-type-imports __internal_ClerkUiCtor?: import('@clerk/shared/types').ClerkUiConstructor; /** diff --git a/packages/clerk-js/src/test/mock-helpers.ts b/packages/clerk-js/src/test/mock-helpers.ts index d76dea115bb..b6b4c341999 100644 --- a/packages/clerk-js/src/test/mock-helpers.ts +++ b/packages/clerk-js/src/test/mock-helpers.ts @@ -99,7 +99,7 @@ export const mockClerkMethods = (clerk: LoadedClerk): DeepVitestMocked; diff --git a/packages/clerk-js/src/utils/authenticateWithPopup.ts b/packages/clerk-js/src/utils/authenticateWithPopup.ts index 9f107868f13..dc737c95419 100644 --- a/packages/clerk-js/src/utils/authenticateWithPopup.ts +++ b/packages/clerk-js/src/utils/authenticateWithPopup.ts @@ -53,7 +53,7 @@ export async function _authenticateWithPopup( console.error(e); } } - await client.setActive({ + await client.setSelected({ session: event.data.session, redirectUrl: params.redirectUrlComplete, }); diff --git a/packages/expo/src/hooks/__tests__/useSignInWithApple.test.ts b/packages/expo/src/hooks/__tests__/useSignInWithApple.test.ts index c918d2ee07d..766dd4dae03 100644 --- a/packages/expo/src/hooks/__tests__/useSignInWithApple.test.ts +++ b/packages/expo/src/hooks/__tests__/useSignInWithApple.test.ts @@ -69,7 +69,7 @@ describe('useSignInWithApple', () => { mocks.useSignIn.mockReturnValue({ signIn: mockSignIn, - setActive: mockSetActive, + setSelected: mockSetActive, isLoaded: true, }); @@ -121,7 +121,7 @@ describe('useSignInWithApple', () => { token: mockIdentityToken, }); expect(response.createdSessionId).toBe('test-session-id'); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); test('should handle transfer flow for new user', async () => { @@ -165,7 +165,7 @@ describe('useSignInWithApple', () => { const response = await result.current.startAppleAuthenticationFlow(); expect(response.createdSessionId).toBe(null); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); test('should throw error when Apple Authentication is not available', async () => { @@ -193,7 +193,7 @@ describe('useSignInWithApple', () => { test('should return early when clerk is not loaded', async () => { mocks.useSignIn.mockReturnValue({ signIn: mockSignIn, - setActive: mockSetActive, + setSelected: mockSetActive, isLoaded: false, }); diff --git a/packages/expo/src/hooks/__tests__/useSignInWithGoogle.test.ts b/packages/expo/src/hooks/__tests__/useSignInWithGoogle.test.ts index 08e2e2a92b8..ce622cbcfda 100644 --- a/packages/expo/src/hooks/__tests__/useSignInWithGoogle.test.ts +++ b/packages/expo/src/hooks/__tests__/useSignInWithGoogle.test.ts @@ -96,7 +96,7 @@ describe('useSignInWithGoogle', () => { mocks.useClerk.mockReturnValue({ loaded: true, - setActive: mockSetActive, + setSelected: mockSetActive, client: { signIn: mockSignIn, signUp: mockSignUp, @@ -146,7 +146,7 @@ describe('useSignInWithGoogle', () => { token: mockIdToken, }); expect(response.createdSessionId).toBe('test-session-id'); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); test('should handle transfer flow for new user', async () => { @@ -163,7 +163,7 @@ describe('useSignInWithGoogle', () => { const mockSignUpWithSession = { ...mockSignUp, createdSessionId: 'new-user-session-id' }; mocks.useClerk.mockReturnValue({ loaded: true, - setActive: mockSetActive, + setSelected: mockSetActive, client: { signIn: mockSignIn, signUp: mockSignUpWithSession, @@ -199,7 +199,7 @@ describe('useSignInWithGoogle', () => { const response = await result.current.startGoogleAuthenticationFlow(); expect(response.createdSessionId).toBe(null); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); test('should handle SIGN_IN_CANCELLED error code', async () => { @@ -211,13 +211,13 @@ describe('useSignInWithGoogle', () => { const response = await result.current.startGoogleAuthenticationFlow(); expect(response.createdSessionId).toBe(null); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); test('should return early when clerk is not loaded', async () => { mocks.useClerk.mockReturnValue({ loaded: false, - setActive: mockSetActive, + setSelected: mockSetActive, client: null, }); @@ -256,7 +256,7 @@ describe('useSignInWithGoogle', () => { }; mocks.useClerk.mockReturnValue({ loaded: true, - setActive: mockSetActive, + setSelected: mockSetActive, client: { signIn: mockSignIn, signUp: mockSignUpWithSession, @@ -284,7 +284,7 @@ describe('useSignInWithGoogle', () => { // Verify the session was created expect(response.createdSessionId).toBe('new-signup-session-id'); - expect(response.setActive).toBe(mockSetActive); + expect(response.setSelected).toBe(mockSetActive); }); }); }); diff --git a/packages/expo/src/hooks/useOAuth.ts b/packages/expo/src/hooks/useOAuth.ts index 9779e2d1d11..6fe748d5e7f 100644 --- a/packages/expo/src/hooks/useOAuth.ts +++ b/packages/expo/src/hooks/useOAuth.ts @@ -1,5 +1,5 @@ import { useSignIn, useSignUp } from '@clerk/react/legacy'; -import type { OAuthStrategy, SetActive, SignInResource, SignUpResource } from '@clerk/shared/types'; +import type { OAuthStrategy, SetSelected, SignInResource, SignUpResource } from '@clerk/shared/types'; import * as AuthSession from 'expo-auth-session'; import * as WebBrowser from 'expo-web-browser'; @@ -18,7 +18,7 @@ export type StartOAuthFlowParams = { export type StartOAuthFlowReturnType = { createdSessionId: string; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; authSessionResult?: WebBrowser.WebBrowserAuthSessionResult; @@ -33,7 +33,7 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { return errorThrower.throw('Missing oauth strategy'); } - const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); + const { signIn, setSelected, isLoaded: isSignInLoaded } = useSignIn(); const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); async function startOAuthFlow(startOAuthFlowParams?: StartOAuthFlowParams): Promise { @@ -42,7 +42,7 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { createdSessionId: '', signIn, signUp, - setActive, + setSelected, }; } @@ -79,7 +79,7 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { return { authSessionResult, createdSessionId: '', - setActive, + setSelected, signIn, signUp, }; @@ -108,7 +108,7 @@ export function useOAuth(useOAuthParams: UseOAuthFlowParams) { return { authSessionResult, createdSessionId, - setActive, + setSelected, signIn, signUp, }; diff --git a/packages/expo/src/hooks/useSSO.ts b/packages/expo/src/hooks/useSSO.ts index 797cbc85ff8..d0937046b4b 100644 --- a/packages/expo/src/hooks/useSSO.ts +++ b/packages/expo/src/hooks/useSSO.ts @@ -2,7 +2,7 @@ import { useSignIn, useSignUp } from '@clerk/react/legacy'; import type { EnterpriseSSOStrategy, OAuthStrategy, - SetActive, + SetSelected, SignInResource, SignUpResource, } from '@clerk/shared/types'; @@ -28,13 +28,13 @@ export type StartSSOFlowParams = { export type StartSSOFlowReturnType = { createdSessionId: string | null; authSessionResult: WebBrowser.WebBrowserAuthSessionResult | null; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; }; export function useSSO() { - const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); + const { signIn, setSelected, isLoaded: isSignInLoaded } = useSignIn(); const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); async function startSSOFlow(startSSOFlowParams: StartSSOFlowParams): Promise { @@ -44,7 +44,7 @@ export function useSSO() { authSessionResult: null, signIn, signUp, - setActive, + setSelected, }; } @@ -81,7 +81,7 @@ export function useSSO() { if (authSessionResult.type !== 'success' || !authSessionResult.url) { return { createdSessionId: null, - setActive, + setSelected, signIn, signUp, authSessionResult, @@ -102,7 +102,7 @@ export function useSSO() { return { createdSessionId: signUp.createdSessionId ?? signIn.createdSessionId, - setActive, + setSelected, signIn, signUp, authSessionResult, diff --git a/packages/expo/src/hooks/useSignInWithApple.ios.ts b/packages/expo/src/hooks/useSignInWithApple.ios.ts index 23cb27ee25f..00e9e5e2f93 100644 --- a/packages/expo/src/hooks/useSignInWithApple.ios.ts +++ b/packages/expo/src/hooks/useSignInWithApple.ios.ts @@ -1,5 +1,5 @@ import { useSignIn, useSignUp } from '@clerk/react/legacy'; -import type { SetActive, SignInResource, SignUpResource } from '@clerk/shared/types'; +import type { SetSelected, SignInResource, SignUpResource } from '@clerk/shared/types'; import { errorThrower } from '../utils/errors'; @@ -9,7 +9,7 @@ export type StartAppleAuthenticationFlowParams = { export type StartAppleAuthenticationFlowReturnType = { createdSessionId: string | null; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; }; @@ -32,10 +32,10 @@ export type StartAppleAuthenticationFlowReturnType = { * * const onPress = async () => { * try { - * const { createdSessionId, setActive } = await startAppleAuthenticationFlow(); + * const { createdSessionId, setSelected } = await startAppleAuthenticationFlow(); * - * if (createdSessionId && setActive) { - * await setActive({ session: createdSessionId }); + * if (createdSessionId && setSelected) { + * await setSelected({ session: createdSessionId }); * } * } catch (err) { * console.error('Apple Authentication error:', err); @@ -52,7 +52,7 @@ export type StartAppleAuthenticationFlowReturnType = { * @returns An object containing the `startAppleAuthenticationFlow` function */ export function useSignInWithApple() { - const { signIn, setActive, isLoaded: isSignInLoaded } = useSignIn(); + const { signIn, setSelected, isLoaded: isSignInLoaded } = useSignIn(); const { signUp, isLoaded: isSignUpLoaded } = useSignUp(); async function startAppleAuthenticationFlow( @@ -63,7 +63,7 @@ export function useSignInWithApple() { createdSessionId: null, signIn, signUp, - setActive, + setSelected, }; } @@ -124,7 +124,7 @@ export function useSignInWithApple() { return { createdSessionId: signUp.createdSessionId, - setActive, + setSelected, signIn, signUp, }; @@ -133,7 +133,7 @@ export function useSignInWithApple() { // User exists - return the SignIn session return { createdSessionId: signIn.createdSessionId, - setActive, + setSelected, signIn, signUp, }; @@ -143,7 +143,7 @@ export function useSignInWithApple() { // User canceled the sign-in flow return { createdSessionId: null, - setActive, + setSelected, signIn, signUp, }; diff --git a/packages/expo/src/hooks/useSignInWithApple.ts b/packages/expo/src/hooks/useSignInWithApple.ts index b1f2708465b..4fa85f82839 100644 --- a/packages/expo/src/hooks/useSignInWithApple.ts +++ b/packages/expo/src/hooks/useSignInWithApple.ts @@ -1,4 +1,4 @@ -import type { SetActive, SignInResource, SignUpResource } from '@clerk/shared/types'; +import type { SetSelected, SignInResource, SignUpResource } from '@clerk/shared/types'; import { errorThrower } from '../utils/errors'; @@ -8,7 +8,7 @@ export type StartAppleAuthenticationFlowParams = { export type StartAppleAuthenticationFlowReturnType = { createdSessionId: string | null; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; }; @@ -29,12 +29,12 @@ export type StartAppleAuthenticationFlowReturnType = { * * const onPress = async () => { * try { - * const { createdSessionId, setActive } = await startSSOFlow({ + * const { createdSessionId, setSelected } = await startSSOFlow({ * strategy: 'oauth_apple' * }); * - * if (createdSessionId && setActive) { - * await setActive({ session: createdSessionId }); + * if (createdSessionId && setSelected) { + * await setSelected({ session: createdSessionId }); * } * } catch (err) { * console.error('Apple Authentication error:', err); diff --git a/packages/expo/src/hooks/useSignInWithGoogle.android.ts b/packages/expo/src/hooks/useSignInWithGoogle.android.ts index e7f032cbaf4..6fc0ae65928 100644 --- a/packages/expo/src/hooks/useSignInWithGoogle.android.ts +++ b/packages/expo/src/hooks/useSignInWithGoogle.android.ts @@ -27,10 +27,10 @@ export type { * * const onPress = async () => { * try { - * const { createdSessionId, setActive } = await startGoogleAuthenticationFlow(); + * const { createdSessionId, setSelected } = await startGoogleAuthenticationFlow(); * - * if (createdSessionId && setActive) { - * await setActive({ session: createdSessionId }); + * if (createdSessionId && setSelected) { + * await setSelected({ session: createdSessionId }); * } * } catch (err) { * console.error('Google Authentication error:', err); diff --git a/packages/expo/src/hooks/useSignInWithGoogle.ios.ts b/packages/expo/src/hooks/useSignInWithGoogle.ios.ts index f278815e27f..a04cb4cc4ce 100644 --- a/packages/expo/src/hooks/useSignInWithGoogle.ios.ts +++ b/packages/expo/src/hooks/useSignInWithGoogle.ios.ts @@ -27,10 +27,10 @@ export type { * * const onPress = async () => { * try { - * const { createdSessionId, setActive } = await startGoogleAuthenticationFlow(); + * const { createdSessionId, setSelected } = await startGoogleAuthenticationFlow(); * - * if (createdSessionId && setActive) { - * await setActive({ session: createdSessionId }); + * if (createdSessionId && setSelected) { + * await setSelected({ session: createdSessionId }); * } * } catch (err) { * console.error('Google Authentication error:', err); diff --git a/packages/expo/src/hooks/useSignInWithGoogle.shared.ts b/packages/expo/src/hooks/useSignInWithGoogle.shared.ts index e7f4ef97f6b..04ffd99e96c 100644 --- a/packages/expo/src/hooks/useSignInWithGoogle.shared.ts +++ b/packages/expo/src/hooks/useSignInWithGoogle.shared.ts @@ -1,6 +1,6 @@ import { useClerk } from '@clerk/react'; import { isClerkAPIResponseError } from '@clerk/shared/error'; -import type { ClientResource, SetActive } from '@clerk/shared/types'; +import type { ClientResource, SetSelected } from '@clerk/shared/types'; import { ClerkGoogleOneTapSignIn, isErrorWithCode, isSuccessResponse } from '../google-one-tap'; import { errorThrower } from '../utils/errors'; @@ -16,7 +16,7 @@ export type GoogleClientIds = { export type GoogleAuthenticationFlowContext = { client: ClientResource; - setActive: SetActive; + setSelected: SetSelected; }; type PlatformConfig = { @@ -64,12 +64,12 @@ export function createUseSignInWithGoogle(platformConfig: PlatformConfig) { async function startGoogleAuthenticationFlow( startGoogleAuthenticationFlowParams?: StartGoogleAuthenticationFlowParams, ): Promise { - const { client, loaded, setActive } = clerk; + const { client, loaded, setSelected } = clerk; if (!loaded || !client) { return { createdSessionId: null, - setActive, + setSelected, }; } @@ -89,7 +89,7 @@ export function createUseSignInWithGoogle(platformConfig: PlatformConfig) { } return executeGoogleAuthenticationFlow( - { client, setActive }, + { client, setSelected }, { webClientId, iosClientId }, startGoogleAuthenticationFlowParams, ); @@ -111,7 +111,7 @@ export async function executeGoogleAuthenticationFlow( clientIds: GoogleClientIds, params?: StartGoogleAuthenticationFlowParams, ): Promise { - const { client, setActive } = context; + const { client, setSelected } = context; const { signIn, signUp } = client; // Configure Google Sign-In with client IDs @@ -131,7 +131,7 @@ export async function executeGoogleAuthenticationFlow( if (!isSuccessResponse(response)) { return { createdSessionId: null, - setActive, + setSelected, signIn, signUp, }; @@ -158,7 +158,7 @@ export async function executeGoogleAuthenticationFlow( return { createdSessionId: signUp.createdSessionId, - setActive, + setSelected, signIn, signUp, }; @@ -167,7 +167,7 @@ export async function executeGoogleAuthenticationFlow( // User exists - return the SignIn session return { createdSessionId: signIn.createdSessionId, - setActive, + setSelected, signIn, signUp, }; @@ -186,7 +186,7 @@ export async function executeGoogleAuthenticationFlow( return { createdSessionId: signUp.createdSessionId, - setActive, + setSelected, signIn, signUp, }; @@ -200,7 +200,7 @@ export async function executeGoogleAuthenticationFlow( if (isErrorWithCode(error) && error.code === 'SIGN_IN_CANCELLED') { return { createdSessionId: null, - setActive, + setSelected, signIn, signUp, }; diff --git a/packages/expo/src/hooks/useSignInWithGoogle.ts b/packages/expo/src/hooks/useSignInWithGoogle.ts index 0872a3e0e19..44fa0aeed38 100644 --- a/packages/expo/src/hooks/useSignInWithGoogle.ts +++ b/packages/expo/src/hooks/useSignInWithGoogle.ts @@ -1,4 +1,4 @@ -import type { SetActive, SignInResource, SignUpResource } from '@clerk/shared/types'; +import type { SetSelected, SignInResource, SignUpResource } from '@clerk/shared/types'; import { errorThrower } from '../utils/errors'; @@ -10,7 +10,7 @@ export type StartGoogleAuthenticationFlowParams = { export type StartGoogleAuthenticationFlowReturnType = { createdSessionId: string | null; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; }; @@ -31,12 +31,12 @@ export type StartGoogleAuthenticationFlowReturnType = { * * const onPress = async () => { * try { - * const { createdSessionId, setActive } = await startSSOFlow({ + * const { createdSessionId, setSelected } = await startSSOFlow({ * strategy: 'oauth_google' * }); * - * if (createdSessionId && setActive) { - * await setActive({ session: createdSessionId }); + * if (createdSessionId && setSelected) { + * await setSelected({ session: createdSessionId }); * } * } catch (err) { * console.error('Google Authentication error:', err); diff --git a/packages/expo/src/hooks/useSignInWithGoogle.types.ts b/packages/expo/src/hooks/useSignInWithGoogle.types.ts index 522f1a12385..56d783dc337 100644 --- a/packages/expo/src/hooks/useSignInWithGoogle.types.ts +++ b/packages/expo/src/hooks/useSignInWithGoogle.types.ts @@ -1,4 +1,4 @@ -import type { SetActive, SignInResource, SignUpResource } from '@clerk/shared/types'; +import type { SetSelected, SignInResource, SignUpResource } from '@clerk/shared/types'; export type StartGoogleAuthenticationFlowParams = { unsafeMetadata?: SignUpUnsafeMetadata; @@ -6,7 +6,7 @@ export type StartGoogleAuthenticationFlowParams = { export type StartGoogleAuthenticationFlowReturnType = { createdSessionId: string | null; - setActive?: SetActive; + setSelected?: SetSelected; signIn?: SignInResource; signUp?: SignUpResource; }; diff --git a/packages/nextjs/src/app-router/client/ClerkProvider.tsx b/packages/nextjs/src/app-router/client/ClerkProvider.tsx index ee9d6d6c6fe..22afe84ee94 100644 --- a/packages/nextjs/src/app-router/client/ClerkProvider.tsx +++ b/packages/nextjs/src/app-router/client/ClerkProvider.tsx @@ -37,7 +37,7 @@ const NextClientClerkProvider = (props: NextClerkProviderPr } useSafeLayoutEffect(() => { - window.__internal_onBeforeSetActive = intent => { + window.__internal_onBeforeSetSelected = intent => { /** * We need to invalidate the cache in case the user is navigating to a page that * was previously cached using the auth state that was active at the time. @@ -61,12 +61,12 @@ const NextClientClerkProvider = (props: NextClerkProviderPr const nextVersion = window?.next?.version || ''; // On Next.js 15+ calling a server action that returns a 404 error when deployed on Vercel is prohibited, failing with 405 status code. - // When a user transitions from "signed in" to "signed out", we clear the `__session` cookie, then we call `__internal_onBeforeSetActive`. + // When a user transitions from "signed in" to "signed out", we clear the `__session` cookie, then we call `__internal_onBeforeSetSelected`. // If we were to call `invalidateCacheAction` while the user is already signed out (deleted cookie), any page protected by `auth.protect()` // will result to the server action returning a 404 error (this happens because server actions inherit the protection rules of the page they are called from). // SOLUTION: // To mitigate this, since the router cache on version 15+ is much less aggressive, we can treat this as a noop and simply resolve the promise. - // Once `setActive` performs the navigation, `__internal_onAfterSetActive` will kick in and perform a router.refresh ensuring shared layouts will also update with the correct authentication context. + // Once `setSelected` performs the navigation, `__internal_onAfterSetSelected` will kick in and perform a router.refresh ensuring shared layouts will also update with the correct authentication context. if ((nextVersion.startsWith('15') || nextVersion.startsWith('16')) && intent === 'sign-out') { resolve(); // noop } else { @@ -75,7 +75,7 @@ const NextClientClerkProvider = (props: NextClerkProviderPr }); }; - window.__internal_onAfterSetActive = () => { + window.__internal_onAfterSetSelected = () => { if (__internal_invokeMiddlewareOnAuthStateChange) { return router.refresh(); } diff --git a/packages/nextjs/src/global.d.ts b/packages/nextjs/src/global.d.ts index efefffd1ed0..982a2a43b5f 100644 --- a/packages/nextjs/src/global.d.ts +++ b/packages/nextjs/src/global.d.ts @@ -38,8 +38,8 @@ interface Window { __clerk_nav_await: Array<(value: void) => void>; __clerk_nav: (to: string) => Promise; - __internal_onBeforeSetActive: (intent?: 'sign-out') => void | Promise; - __internal_onAfterSetActive: () => void | Promise; + __internal_onBeforeSetSelected: (intent?: 'sign-out') => void | Promise; + __internal_onAfterSetSelected: () => void | Promise; next?: { version: string; diff --git a/packages/nextjs/src/pages/ClerkProvider.tsx b/packages/nextjs/src/pages/ClerkProvider.tsx index 786da7c7654..0123b9c13c9 100644 --- a/packages/nextjs/src/pages/ClerkProvider.tsx +++ b/packages/nextjs/src/pages/ClerkProvider.tsx @@ -23,11 +23,11 @@ export function ClerkProvider({ children, ...props }: NextC ReactClerkProvider.displayName = 'ReactClerkProvider'; useSafeLayoutEffect(() => { - window.__internal_onBeforeSetActive = invalidateNextRouterCache; + window.__internal_onBeforeSetSelected = invalidateNextRouterCache; }, []); useSafeLayoutEffect(() => { - window.__internal_onAfterSetActive = () => { + window.__internal_onAfterSetSelected = () => { // Re-run the middleware every time there auth state changes. // This enables complete control from a centralized place (NextJS middleware), // as we will invoke it every time the client-side auth state changes, eg: signing-out, switching orgs, etc.\ diff --git a/packages/react/src/hooks/legacy/useSignIn.ts b/packages/react/src/hooks/legacy/useSignIn.ts index 8068f2b184d..71d13026d83 100644 --- a/packages/react/src/hooks/legacy/useSignIn.ts +++ b/packages/react/src/hooks/legacy/useSignIn.ts @@ -58,12 +58,12 @@ export const useSignIn = (): UseSignInReturn => { isomorphicClerk.telemetry?.record(eventMethodCalled('useSignIn')); if (!client) { - return { isLoaded: false, signIn: undefined, setActive: undefined }; + return { isLoaded: false, signIn: undefined, setSelected: undefined }; } return { isLoaded: true, signIn: client.signIn, - setActive: isomorphicClerk.setActive, + setSelected: isomorphicClerk.setSelected, }; }; diff --git a/packages/react/src/hooks/legacy/useSignUp.ts b/packages/react/src/hooks/legacy/useSignUp.ts index bee9c7fdf3d..1933ac846ea 100644 --- a/packages/react/src/hooks/legacy/useSignUp.ts +++ b/packages/react/src/hooks/legacy/useSignUp.ts @@ -58,12 +58,12 @@ export const useSignUp = (): UseSignUpReturn => { isomorphicClerk.telemetry?.record(eventMethodCalled('useSignUp')); if (!client) { - return { isLoaded: false, signUp: undefined, setActive: undefined }; + return { isLoaded: false, signUp: undefined, setSelected: undefined }; } return { isLoaded: true, signUp: client.signUp, - setActive: isomorphicClerk.setActive, + setSelected: isomorphicClerk.setSelected, }; }; diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index b39bf352b8c..01b4e4d94e3 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -40,7 +40,7 @@ import type { OrganizationSwitcherProps, PricingTableProps, RedirectOptions, - SetActiveParams, + SetSelectedParams, SignInProps, SignInRedirectOptions, SignInResource, @@ -115,7 +115,7 @@ type IsomorphicLoadedClerk = Without< | '__internal_reloadInitialResources' | 'billing' | 'apiKeys' - | '__internal_setActiveInProgress' + | '__internal_setSelectedInProgress' > & { client: ClientResource | undefined; billing: BillingNamespace | undefined; @@ -804,11 +804,11 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { }; /** - * `setActive` can be used to set the active session and/or organization. + * `setSelected` can be used to set the selected session and/or organization. */ - setActive = (params: SetActiveParams): Promise => { + setSelected = (params: SetSelectedParams): Promise => { if (this.clerkjs) { - return this.clerkjs.setActive(params); + return this.clerkjs.setSelected(params); } else { return Promise.reject(); } diff --git a/packages/shared/src/internal/clerk-js/sessionTasks.ts b/packages/shared/src/internal/clerk-js/sessionTasks.ts index eb8a3f3ca99..b69c769762b 100644 --- a/packages/shared/src/internal/clerk-js/sessionTasks.ts +++ b/packages/shared/src/internal/clerk-js/sessionTasks.ts @@ -1,5 +1,5 @@ import { logger } from '../../logger'; -import type { ClerkOptions, SessionResource, SessionTask, SetActiveParams } from '../../types'; +import type { ClerkOptions, SessionResource, SessionTask, SetSelectedParams } from '../../types'; import { forwardClerkQueryParams } from './queryParams'; import { buildURL } from './url'; @@ -55,7 +55,7 @@ export function navigateIfTaskExists( export function warnMissingPendingTaskHandlers(options: Record) { const taskOptions = ['taskUrls', 'navigate'] as Array< - keyof (Pick & Pick) + keyof (Pick & Pick) >; const hasAtLeastOneOption = Object.keys(options).some(option => taskOptions.includes(option as any)); diff --git a/packages/shared/src/react/hooks/useOrganizationList.tsx b/packages/shared/src/react/hooks/useOrganizationList.tsx index 8060e48a22f..2f9cef1f9f8 100644 --- a/packages/shared/src/react/hooks/useOrganizationList.tsx +++ b/packages/shared/src/react/hooks/useOrganizationList.tsx @@ -7,7 +7,7 @@ import type { OrganizationMembershipResource, OrganizationResource, OrganizationSuggestionResource, - SetActive, + SetSelected, UserOrganizationInvitationResource, } from '../../types'; import { useAssertWrappedByClerkProvider, useClerkInstanceContext, useUserContext } from '../contexts'; @@ -84,9 +84,9 @@ export type UseOrganizationListReturn = */ createOrganization: undefined; /** - * A function that sets the active session and/or Organization. + * A function that sets the selected session and/or Organization. */ - setActive: undefined; + setSelected: undefined; /** * Returns `PaginatedResources` which includes a list of the user's Organization memberships. */ @@ -103,7 +103,7 @@ export type UseOrganizationListReturn = | { isLoaded: boolean; createOrganization: (CreateOrganizationParams: CreateOrganizationParams) => Promise; - setActive: SetActive; + setSelected: SetSelected; userMemberships: PaginatedResources< OrganizationMembershipResource, T['userMemberships'] extends { infinite: true } ? true : false @@ -161,7 +161,7 @@ export type UseOrganizationListReturn = * import React from 'react' * * const JoinedOrganizations = () => { - * const { isLoaded, setActive, userMemberships } = useOrganizationList({ + * const { isLoaded, setSelected, userMemberships } = useOrganizationList({ * userMemberships: { * infinite: true, * }, @@ -177,7 +177,7 @@ export type UseOrganizationListReturn = * {userMemberships.data?.map((mem) => ( *
  • * {mem.organization.name} - * + * *
  • * ))} * @@ -382,7 +382,7 @@ export function useOrganizationList(params? return { isLoaded: false, createOrganization: undefined, - setActive: undefined, + setSelected: undefined, userMemberships: undefinedPaginatedResource, userInvitations: undefinedPaginatedResource, userSuggestions: undefinedPaginatedResource, @@ -391,7 +391,7 @@ export function useOrganizationList(params? return { isLoaded: isClerkLoaded, - setActive: clerk.setActive, + setSelected: clerk.setSelected, createOrganization: clerk.createOrganization, userMemberships: memberships, userInvitations: invitations, diff --git a/packages/shared/src/react/hooks/useSessionList.ts b/packages/shared/src/react/hooks/useSessionList.ts index f92cda3f31a..f61b0e2e115 100644 --- a/packages/shared/src/react/hooks/useSessionList.ts +++ b/packages/shared/src/react/hooks/useSessionList.ts @@ -56,12 +56,12 @@ export const useSessionList = (): UseSessionListReturn => { clerk.telemetry?.record(eventMethodCalled(hookName)); if (!client) { - return { isLoaded: false, sessions: undefined, setActive: undefined }; + return { isLoaded: false, sessions: undefined, setSelected: undefined }; } return { isLoaded: true, sessions: client.sessions, - setActive: isomorphicClerk.setActive, + setSelected: isomorphicClerk.setSelected, }; }; diff --git a/packages/shared/src/types/billing.ts b/packages/shared/src/types/billing.ts index fd6124f1337..10475a8e813 100644 --- a/packages/shared/src/types/billing.ts +++ b/packages/shared/src/types/billing.ts @@ -1,6 +1,6 @@ import type { ClerkError } from '@/errors/clerkError'; -import type { SetActiveNavigate } from './clerk'; +import type { SetSelectedNavigate } from './clerk'; import type { DeletedObjectResource } from './deletedObject'; import type { ClerkPaginatedResponse, ClerkPaginationParams } from './pagination'; import type { ClerkResource } from './resource'; @@ -983,7 +983,7 @@ type CheckoutFlowInitialized = { type CheckoutPropertiesPerStatus = CheckoutFlowUninitialized | CheckoutFlowInitialized; export interface CheckoutFlowFinalizeParams { - navigate: SetActiveNavigate; + navigate: SetSelectedNavigate; } /** diff --git a/packages/shared/src/types/clerk.ts b/packages/shared/src/types/clerk.ts index 314d186793b..fb5cccec8af 100644 --- a/packages/shared/src/types/clerk.ts +++ b/packages/shared/src/types/clerk.ts @@ -136,7 +136,7 @@ export type SDKMetadata = { export type ListenerCallback = (emission: Resources) => void; export type UnsubscribeCallback = () => void; -export type SetActiveNavigate = ({ session }: { session: SessionResource }) => void | Promise; +export type SetSelectedNavigate = ({ session }: { session: SessionResource }) => void | Promise; export type SignOutCallback = () => void | Promise; @@ -719,12 +719,12 @@ export interface Clerk { __internal_addNavigationListener: (callback: () => void) => UnsubscribeCallback; /** - * Set the active session and Organization explicitly. + * Set the selected session and Organization explicitly. * - * If the session param is `null`, the active session is deleted. - * In a similar fashion, if the organization param is `null`, the current organization is removed as active. + * If the session param is `null`, the selected session is deleted. + * In a similar fashion, if the organization param is `null`, the current organization is removed as selected. */ - setActive: SetActive; + setSelected: SetSelected; /** * Function used to commit a navigation after certain steps in the Clerk processes. @@ -965,10 +965,10 @@ export interface Clerk { __internal_reloadInitialResources: () => Promise; /** - * Internal flag indicating whether a `setActive` call is in progress. Used to prevent navigations from being + * Internal flag indicating whether a `setSelected` call is in progress. Used to prevent navigations from being * initiated outside of the Clerk class. */ - __internal_setActiveInProgress: boolean; + __internal_setSelectedInProgress: boolean; /** * API Keys Object @@ -1325,18 +1325,18 @@ export type SignUpRedirectOptions = RedirectOptions & }; /** - * The parameters for the `setActive()` method. + * The parameters for the `setSelected()` method. * * @interface */ -export type SetActiveParams = { +export type SetSelectedParams = { /** - * The session resource or session ID (string version) to be set as active. If `null`, the current session is deleted. + * The session resource or session ID (string version) to be set as selected. If `null`, the current session is deleted. */ session?: SignedInSessionResource | string | null; /** - * The Organization resource or Organization ID/slug (string version) to be set as active in the current session. If `null`, the currently Active Organization is removed as active. + * The Organization resource or Organization ID/slug (string version) to be set as selected in the current session. If `null`, the currently selected Organization is removed. */ organization?: OrganizationResource | string | null; @@ -1352,7 +1352,7 @@ export type SetActiveParams = { * * @example * ```typescript - * await clerk.setActive({ + * await clerk.setSelected({ * session, * navigate: async ({ session }) => { * const currentTask = session.currentTask; @@ -1366,13 +1366,13 @@ export type SetActiveParams = { * }); * ``` */ - navigate?: SetActiveNavigate; + navigate?: SetSelectedNavigate; }; /** * @inline */ -export type SetActive = (setActiveParams: SetActiveParams) => Promise; +export type SetSelected = (setSelectedParams: SetSelectedParams) => Promise; export type RoutingOptions = | { path: string | undefined; routing?: Extract } diff --git a/packages/shared/src/types/hooks.ts b/packages/shared/src/types/hooks.ts index 622d588478b..74c1d50e601 100644 --- a/packages/shared/src/types/hooks.ts +++ b/packages/shared/src/types/hooks.ts @@ -1,4 +1,4 @@ -import type { SetActive, SignOut } from './clerk'; +import type { SetSelected, SignOut } from './clerk'; import type { ActClaim, JwtPayload } from './jwtv2'; import type { OrganizationCustomRoleKey } from './organizationMembership'; import type { @@ -131,14 +131,14 @@ export type UseSignInReturn = */ signIn: undefined; /** - * A function that sets the active session. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-active). + * A function that sets the selected session. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-selected). */ - setActive: undefined; + setSelected: undefined; } | { isLoaded: true; signIn: SignInResource; - setActive: SetActive; + setSelected: SetSelected; }; /** @@ -155,14 +155,14 @@ export type UseSignUpReturn = */ signUp: undefined; /** - * A function that sets the active session. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-active). + * A function that sets the selected session. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-selected). */ - setActive: undefined; + setSelected: undefined; } | { isLoaded: true; signUp: SignUpResource; - setActive: SetActive; + setSelected: SetSelected; }; /** @@ -208,14 +208,14 @@ export type UseSessionListReturn = */ sessions: undefined; /** - * A function that sets the active session and/or Organization. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-active). + * A function that sets the selected session and/or Organization. See the [reference doc](https://clerk.com/docs/reference/javascript/clerk#set-selected). */ - setActive: undefined; + setSelected: undefined; } | { isLoaded: true; sessions: SessionResource[]; - setActive: SetActive; + setSelected: SetSelected; }; /** diff --git a/packages/shared/src/types/signInFuture.ts b/packages/shared/src/types/signInFuture.ts index fa673bb4d66..88799d6a626 100644 --- a/packages/shared/src/types/signInFuture.ts +++ b/packages/shared/src/types/signInFuture.ts @@ -1,5 +1,5 @@ import type { ClerkError } from '../errors/clerkError'; -import type { SetActiveNavigate } from './clerk'; +import type { SetSelectedNavigate } from './clerk'; import type { PhoneCodeChannel } from './phoneCodeChannel'; import type { SignInFirstFactor, SignInSecondFactor, SignInStatus, UserData } from './signInCommon'; import type { OAuthStrategy, PasskeyStrategy, Web3Strategy } from './strategies'; @@ -273,7 +273,7 @@ export interface SignInFuturePasskeyParams { } export interface SignInFutureFinalizeParams { - navigate?: SetActiveNavigate; + navigate?: SetSelectedNavigate; } /** diff --git a/packages/shared/src/types/signUpFuture.ts b/packages/shared/src/types/signUpFuture.ts index d44ba2e534c..660c193b56b 100644 --- a/packages/shared/src/types/signUpFuture.ts +++ b/packages/shared/src/types/signUpFuture.ts @@ -1,5 +1,5 @@ import type { ClerkError } from '../errors/clerkError'; -import type { SetActiveNavigate } from './clerk'; +import type { SetSelectedNavigate } from './clerk'; import type { PhoneCodeChannel } from './phoneCodeChannel'; import type { SignUpField, SignUpIdentificationField, SignUpStatus } from './signUpCommon'; import type { Web3Strategy } from './strategies'; @@ -249,7 +249,7 @@ export interface SignUpFutureWeb3Params extends SignUpFutureAdditionalParams { } export interface SignUpFutureFinalizeParams { - navigate?: SetActiveNavigate; + navigate?: SetSelectedNavigate; } /** diff --git a/packages/testing/src/common/helpers-utils.ts b/packages/testing/src/common/helpers-utils.ts index 923cf3a194d..03689152355 100644 --- a/packages/testing/src/common/helpers-utils.ts +++ b/packages/testing/src/common/helpers-utils.ts @@ -15,7 +15,7 @@ export const signInHelper = async ({ signInParams, windowObject }: SignInHelperP switch (signInParams.strategy) { case 'password': { const res = await signIn.create(signInParams); - await w.Clerk.setActive({ + await w.Clerk.setSelected({ session: res.createdSessionId, }); break; @@ -28,7 +28,7 @@ export const signInHelper = async ({ signInParams, windowObject }: SignInHelperP }); if (res.status === 'complete') { - await w.Clerk.setActive({ + await w.Clerk.setSelected({ session: res.createdSessionId, }); } else { @@ -66,7 +66,7 @@ export const signInHelper = async ({ signInParams, windowObject }: SignInHelperP }); if (signInAttempt.status === 'complete') { - await w.Clerk.setActive({ session: signInAttempt.createdSessionId }); + await w.Clerk.setSelected({ session: signInAttempt.createdSessionId }); } else { throw new Error(`Status is ${signInAttempt.status}`); } @@ -105,7 +105,7 @@ export const signInHelper = async ({ signInParams, windowObject }: SignInHelperP }); if (signInAttempt.status === 'complete') { - await w.Clerk.setActive({ session: signInAttempt.createdSessionId }); + await w.Clerk.setSelected({ session: signInAttempt.createdSessionId }); } else { throw new Error(`Status is ${signInAttempt.status}`); } diff --git a/packages/ui/src/common/SSOCallback.tsx b/packages/ui/src/common/SSOCallback.tsx index 374de774e37..c02a55ceb53 100644 --- a/packages/ui/src/common/SSOCallback.tsx +++ b/packages/ui/src/common/SSOCallback.tsx @@ -19,13 +19,13 @@ export const SSOCallback = withCardStateProvider { - const { handleRedirectCallback, __internal_setActiveInProgress } = useClerk(); + const { handleRedirectCallback, __internal_setSelectedInProgress } = useClerk(); const { navigate } = useRouter(); const card = useCardState(); React.useEffect(() => { let timeoutId: ReturnType; - if (__internal_setActiveInProgress !== true) { + if (__internal_setSelectedInProgress !== true) { const intent = new URLSearchParams(window.location.search).get('intent'); const reloadResource = intent === 'signIn' || intent === 'signUp' ? intent : undefined; handleRedirectCallback({ ...props, reloadResource }, navigate).catch(e => { diff --git a/packages/ui/src/components/CreateOrganization/CreateOrganizationForm.tsx b/packages/ui/src/components/CreateOrganization/CreateOrganizationForm.tsx index 0bc7f29a13d..062a1f6f161 100644 --- a/packages/ui/src/components/CreateOrganization/CreateOrganizationForm.tsx +++ b/packages/ui/src/components/CreateOrganization/CreateOrganizationForm.tsx @@ -41,7 +41,7 @@ export const CreateOrganizationForm = withCardStateProvider((props: CreateOrgani const wizard = useWizard({ onNextStep: () => card.setError(undefined) }); const lastCreatedOrganizationRef = React.useRef(null); - const { createOrganization, isLoaded, setActive, userMemberships } = useOrganizationList({ + const { createOrganization, isLoaded, setSelected, userMemberships } = useOrganizationList({ userMemberships: organizationListParams.userMemberships, }); const { organization } = useOrganization(); @@ -89,7 +89,7 @@ export const CreateOrganizationForm = withCardStateProvider((props: CreateOrgani } lastCreatedOrganizationRef.current = organization; - await setActive({ organization }); + await setSelected({ organization }); void userMemberships.revalidate?.(); diff --git a/packages/ui/src/components/OrganizationList/UserMembershipList.tsx b/packages/ui/src/components/OrganizationList/UserMembershipList.tsx index a7dec64439b..780e900578b 100644 --- a/packages/ui/src/components/OrganizationList/UserMembershipList.tsx +++ b/packages/ui/src/components/OrganizationList/UserMembershipList.tsx @@ -17,7 +17,7 @@ export const MembershipPreview = (props: { organization: OrganizationResource }) const card = useCardState(); const { navigateAfterSelectOrganization } = useOrganizationListContext(); const { t } = useLocalizations(); - const { isLoaded, setActive } = useOrganizationList(); + const { isLoaded, setSelected } = useOrganizationList(); if (!isLoaded) { return null; @@ -26,7 +26,7 @@ export const MembershipPreview = (props: { organization: OrganizationResource }) const handleOrganizationClicked = (organization: OrganizationResource) => { return card.runAsync(async () => { try { - await setActive({ + await setSelected({ organization, }); @@ -75,7 +75,7 @@ export const MembershipPreview = (props: { organization: OrganizationResource }) export const PersonalAccountPreview = withCardStateProvider(() => { const card = useCardState(); const { hidePersonal, navigateAfterSelectPersonal } = useOrganizationListContext(); - const { isLoaded, setActive } = useOrganizationList(); + const { isLoaded, setSelected } = useOrganizationList(); const { user } = useUser(); if (!user) { @@ -89,7 +89,7 @@ export const PersonalAccountPreview = withCardStateProvider(() => { return; } return card.runAsync(async () => { - await setActive({ + await setSelected({ organization: null, }); diff --git a/packages/ui/src/components/OrganizationList/__tests__/OrganizationList.test.tsx b/packages/ui/src/components/OrganizationList/__tests__/OrganizationList.test.tsx index 68a1d43ec03..39275e024e7 100644 --- a/packages/ui/src/components/OrganizationList/__tests__/OrganizationList.test.tsx +++ b/packages/ui/src/components/OrganizationList/__tests__/OrganizationList.test.tsx @@ -383,11 +383,11 @@ describe('OrganizationList', () => { }); await waitFor(async () => { - fixtures.clerk.setActive.mockReturnValue(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValue(Promise.resolve()); await userEvent.click(getByText(/Personal account/i)); expect(fixtures.router.navigate).toHaveBeenCalledWith(`/user/test_user_id`); - expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith( expect.objectContaining({ organization: null, }), @@ -433,9 +433,9 @@ describe('OrganizationList', () => { }); await waitFor(async () => { - fixtures.clerk.setActive.mockReturnValue(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValue(Promise.resolve()); await userEvent.click(getByRole('button', { name: /Org1/i })); - expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith( expect.objectContaining({ organization: membership.organization, }), @@ -464,7 +464,7 @@ describe('OrganizationList', () => { wrapper, }); - fixtures.clerk.setActive.mockReturnValue(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValue(Promise.resolve()); await waitFor(async () => expect(await findByRole('menuitem', { name: 'Create organization' })).toBeInTheDocument(), ); diff --git a/packages/ui/src/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx b/packages/ui/src/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx index 40f39578b47..d82c3ebb238 100644 --- a/packages/ui/src/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx +++ b/packages/ui/src/components/OrganizationSwitcher/OrganizationSwitcherPopover.tsx @@ -27,7 +27,7 @@ export const OrganizationSwitcherPopover = React.forwardRef { return card .runAsync(() => - setActive({ + setSelected({ organization, redirectUrl: afterSelectOrganizationUrl(organization), }), @@ -68,7 +68,7 @@ export const OrganizationSwitcherPopover = React.forwardRef { return card - .runAsync(() => setActive({ organization: null, redirectUrl: afterSelectPersonalUrl(user) })) + .runAsync(() => setSelected({ organization: null, redirectUrl: afterSelectPersonalUrl(user) })) .then(close); }; diff --git a/packages/ui/src/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx b/packages/ui/src/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx index 9334d0a812b..8bfd9edcb14 100644 --- a/packages/ui/src/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx +++ b/packages/ui/src/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx @@ -564,7 +564,7 @@ describe('OrganizationSwitcher', () => { }), ); - fixtures.clerk.setActive.mockReturnValueOnce(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValueOnce(Promise.resolve()); props.setProps({ hidePersonal: true }); const { getByRole, getByText, userEvent } = render(, { wrapper }); @@ -576,7 +576,7 @@ describe('OrganizationSwitcher', () => { }); await userEvent.click(getByText('Org2')); - expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith( expect.objectContaining({ organization: expect.objectContaining({ name: 'Org2', @@ -597,7 +597,7 @@ describe('OrganizationSwitcher', () => { }); }); - fixtures.clerk.setActive.mockReturnValueOnce(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValueOnce(Promise.resolve()); const { getByRole, getByText, userEvent } = render(, { wrapper }); await userEvent.click(getByRole('button')); expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1); @@ -607,7 +607,7 @@ describe('OrganizationSwitcher', () => { }); await userEvent.click(getByText(/Personal account/i)); - expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith( expect.objectContaining({ organization: null, }), diff --git a/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx b/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx index 2c47d5710dc..d5fd8f2e9b7 100644 --- a/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx +++ b/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.tsx @@ -115,7 +115,7 @@ const MembershipPreview = (props: { organization: OrganizationResource }) => { const card = useCardState(); const { navigateOnSetActive } = useSessionTasksContext(); const { redirectUrlComplete } = useTaskChooseOrganizationContext(); - const { isLoaded, setActive } = useOrganizationList(); + const { isLoaded, setSelected } = useOrganizationList(); const { t } = useLocalizations(); if (!isLoaded) { @@ -125,7 +125,7 @@ const MembershipPreview = (props: { organization: OrganizationResource }) => { const handleOrganizationClicked = (organization: OrganizationResource) => { return card.runAsync(async () => { try { - await setActive({ + await setSelected({ organization, navigate: async ({ session }) => { await navigateOnSetActive?.({ session, redirectUrlComplete }); diff --git a/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx b/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx index 085b45919d9..f8e9172d4ea 100644 --- a/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx +++ b/packages/ui/src/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.tsx @@ -29,7 +29,7 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = const card = useCardState(); const { navigateOnSetActive } = useSessionTasksContext(); const { redirectUrlComplete } = useTaskChooseOrganizationContext(); - const { createOrganization, isLoaded, setActive } = useOrganizationList({ + const { createOrganization, isLoaded, setSelected } = useOrganizationList({ userMemberships: organizationListParams.userMemberships, }); const { organizationSettings } = useEnvironment(); @@ -73,7 +73,7 @@ export const CreateOrganizationScreen = (props: CreateOrganizationScreenProps) = await organization.setLogo({ file: logoFile }); } - await setActive({ + await setSelected({ organization, navigate: async ({ session }) => { await navigateOnSetActive?.({ session, redirectUrlComplete }); diff --git a/packages/ui/src/components/SessionTasks/tasks/TaskResetPassword/index.tsx b/packages/ui/src/components/SessionTasks/tasks/TaskResetPassword/index.tsx index dc88aa35244..8f56135dae2 100644 --- a/packages/ui/src/components/SessionTasks/tasks/TaskResetPassword/index.tsx +++ b/packages/ui/src/components/SessionTasks/tasks/TaskResetPassword/index.tsx @@ -91,7 +91,7 @@ const TaskResetPasswordInternal = () => { ]); // Update session to have the latest list of tasks (eg: if reset-password gets resolved) - await clerk.setActive({ + await clerk.setSelected({ session: clerk.session, navigate: async ({ session }) => { await navigateOnSetActive?.({ session, redirectUrlComplete }); diff --git a/packages/ui/src/components/SessionTasks/tasks/shared/withTaskGuard.ts b/packages/ui/src/components/SessionTasks/tasks/shared/withTaskGuard.ts index 510ff80238e..fc50d9b6f47 100644 --- a/packages/ui/src/components/SessionTasks/tasks/shared/withTaskGuard.ts +++ b/packages/ui/src/components/SessionTasks/tasks/shared/withTaskGuard.ts @@ -27,7 +27,7 @@ export const withTaskGuard =

    ( Component, clerk => !clerk.session?.currentTask || - (clerk.session.currentTask.key !== taskKey && !clerk.__internal_setActiveInProgress), + (clerk.session.currentTask.key !== taskKey && !clerk.__internal_setSelectedInProgress), ({ clerk }) => !clerk.session ? clerk.buildSignInUrl() : (ctx.redirectUrlComplete ?? clerk.buildAfterSignInUrl()), warnings.cannotRenderComponentWhenTaskDoesNotExist, diff --git a/packages/ui/src/components/SignIn/SignInFactorOne.tsx b/packages/ui/src/components/SignIn/SignInFactorOne.tsx index c493c19dfd9..f6ffc07aaa6 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOne.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOne.tsx @@ -63,7 +63,7 @@ function determineAlternativeMethodsMode( } function SignInFactorOneInternal(): JSX.Element { - const { __internal_setActiveInProgress } = useClerk(); + const { __internal_setSelectedInProgress } = useClerk(); const signIn = useCoreSignIn(); const { preferredSignInStrategy } = useEnvironment().displayConfig; const availableFactors = signIn.supportedFirstFactors; @@ -108,7 +108,7 @@ function SignInFactorOneInternal(): JSX.Element { const [passwordErrorCode, setPasswordErrorCode] = React.useState(null); React.useEffect(() => { - if (__internal_setActiveInProgress) { + if (__internal_setSelectedInProgress) { return; } @@ -118,7 +118,7 @@ function SignInFactorOneInternal(): JSX.Element { if (signIn.status === 'needs_identifier' || signIn.status === null) { void router.navigate('../'); } - }, [__internal_setActiveInProgress]); + }, [__internal_setSelectedInProgress]); if (!currentFactor) { return signIn.status ? ( diff --git a/packages/ui/src/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.tsx b/packages/ui/src/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.tsx index eaf0b15af0e..f571dce56da 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.tsx @@ -35,7 +35,7 @@ export const SignInFactorOneAlternativeChannelCodeForm = (props: SignInFactorOne const card = useCardState(); const { navigate } = useRouter(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const supportEmail = useSupportEmail(); const clerk = useClerk(); const channel = props.factor.channel; @@ -65,7 +65,7 @@ export const SignInFactorOneAlternativeChannelCodeForm = (props: SignInFactorOne switch (res.status) { case 'complete': - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInFactorOneCodeForm.tsx b/packages/ui/src/components/SignIn/SignInFactorOneCodeForm.tsx index 0a21dddf09f..9e090bf105f 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOneCodeForm.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOneCodeForm.tsx @@ -36,7 +36,7 @@ export const SignInFactorOneCodeForm = (props: SignInFactorOneCodeFormProps) => const card = useCardState(); const { navigate } = useRouter(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const supportEmail = useSupportEmail(); const clerk = useClerk(); @@ -96,7 +96,7 @@ export const SignInFactorOneCodeForm = (props: SignInFactorOneCodeFormProps) => switch (res.status) { case 'complete': - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInFactorOneEmailLinkCard.tsx b/packages/ui/src/components/SignIn/SignInFactorOneEmailLinkCard.tsx index 25a158a5044..41563534477 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOneEmailLinkCard.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOneEmailLinkCard.tsx @@ -29,7 +29,7 @@ export const SignInFactorOneEmailLinkCard = (props: SignInFactorOneEmailLinkCard const { signInUrl } = signInContext; const { navigate } = useRouter(); const { afterSignInUrl } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { startEmailLinkFlow, cancelEmailLinkFlow } = useEmailLink(signIn); const [showVerifyModal, setShowVerifyModal] = React.useState(false); const clerk = useClerk(); @@ -72,7 +72,7 @@ export const SignInFactorOneEmailLinkCard = (props: SignInFactorOneEmailLinkCard const completeSignInFlow = async (si: SignInResource) => { if (si.status === 'complete') { - return setActive({ + return setSelected({ session: si.createdSessionId, redirectUrl: afterSignInUrl, }); diff --git a/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx b/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx index 27829ec7675..243e6fc87f2 100644 --- a/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorOnePasswordCard.tsx @@ -55,7 +55,7 @@ export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) const { onShowAlternativeMethodsClick, onPasswordError } = props; const passwordInputRef = React.useRef(null); const card = useCardState(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const signIn = useCoreSignIn(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); const supportEmail = useSupportEmail(); @@ -76,7 +76,7 @@ export const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) .then(res => { switch (res.status) { case 'complete': - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: ({ session }) => { return navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInFactorTwoBackupCodeCard.tsx b/packages/ui/src/components/SignIn/SignInFactorTwoBackupCodeCard.tsx index ed86694d2c0..5e1aacc149f 100644 --- a/packages/ui/src/components/SignIn/SignInFactorTwoBackupCodeCard.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorTwoBackupCodeCard.tsx @@ -25,7 +25,7 @@ export const SignInFactorTwoBackupCodeCard = (props: SignInFactorTwoBackupCodeCa const { onShowAlternativeMethodsClicked } = props; const signIn = useCoreSignIn(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { navigate } = useRouter(); const supportEmail = useSupportEmail(); const card = useCardState(); @@ -52,7 +52,7 @@ export const SignInFactorTwoBackupCodeCard = (props: SignInFactorTwoBackupCodeCa queryParams.set('createdSessionId', res.createdSessionId); return navigate(`../reset-password-success?${queryParams.toString()}`); } - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInFactorTwoCodeForm.tsx b/packages/ui/src/components/SignIn/SignInFactorTwoCodeForm.tsx index 2cf59b83d6b..a3a67cfc6ab 100644 --- a/packages/ui/src/components/SignIn/SignInFactorTwoCodeForm.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorTwoCodeForm.tsx @@ -40,7 +40,7 @@ export const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => const signIn = useCoreSignIn(); const card = useCardState(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { navigate } = useRouter(); const supportEmail = useSupportEmail(); const clerk = useClerk(); @@ -91,7 +91,7 @@ export const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => queryParams.set('createdSessionId', res.createdSessionId); return navigate(`../reset-password-success?${queryParams.toString()}`); } - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx b/packages/ui/src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx index 3842bd8f590..6aa757fd5e0 100644 --- a/packages/ui/src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx +++ b/packages/ui/src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx @@ -31,7 +31,7 @@ export const SignInFactorTwoEmailLinkCard = (props: SignInFactorTwoEmailLinkCard const signInContext = useSignInContext(); const { signInUrl } = signInContext; const { afterSignInUrl } = useSignInContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { startEmailLinkFlow, cancelEmailLinkFlow } = useEmailLink(signIn); const [showVerifyModal, setShowVerifyModal] = React.useState(false); const clerk = useClerk(); @@ -68,7 +68,7 @@ export const SignInFactorTwoEmailLinkCard = (props: SignInFactorTwoEmailLinkCard } else if (ver.verifiedFromTheSameClient()) { setShowVerifyModal(true); } else { - await setActive({ + await setSelected({ session: si.createdSessionId, redirectUrl: afterSignInUrl, }); diff --git a/packages/ui/src/components/SignIn/SignInSocialButtons.tsx b/packages/ui/src/components/SignIn/SignInSocialButtons.tsx index abb128536ce..e22f2549d70 100644 --- a/packages/ui/src/components/SignIn/SignInSocialButtons.tsx +++ b/packages/ui/src/components/SignIn/SignInSocialButtons.tsx @@ -40,7 +40,7 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps) ); if (sessionAlreadyExistsError) { - return clerk.setActive({ + return clerk.setSelected({ session: clerk.client.lastActiveSessionId, navigate: async ({ session }) => { await ctx.navigateOnSetActive({ session, redirectUrl: ctx.afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/SignInStart.tsx b/packages/ui/src/components/SignIn/SignInStart.tsx index fd27013ed4e..03fad6cf92a 100644 --- a/packages/ui/src/components/SignIn/SignInStart.tsx +++ b/packages/ui/src/components/SignIn/SignInStart.tsx @@ -239,7 +239,7 @@ function SignInStartInternal(): JSX.Element { return navigate('client-trust'); case 'complete': removeClerkQueryParam('__clerk_ticket'); - return clerk.setActive({ + return clerk.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); @@ -395,7 +395,7 @@ function SignInStartInternal(): JSX.Element { case 'needs_client_trust': return navigate('client-trust'); case 'complete': - return clerk.setActive({ + return clerk.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); @@ -449,7 +449,7 @@ function SignInStartInternal(): JSX.Element { if (instantPasswordError) { await signInWithFields(identifierField); } else if (sessionAlreadyExistsError) { - await clerk.setActive({ + await clerk.setSelected({ session: clerk.client.lastActiveSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); @@ -458,7 +458,7 @@ function SignInStartInternal(): JSX.Element { } else if (alreadySignedInError) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const sid = alreadySignedInError.meta!.sessionId!; - await clerk.setActive({ + await clerk.setSelected({ session: sid, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignIn/__tests__/ResetPasswordSuccess.test.tsx b/packages/ui/src/components/SignIn/__tests__/ResetPasswordSuccess.test.tsx index aaa4d90c107..705023b9109 100644 --- a/packages/ui/src/components/SignIn/__tests__/ResetPasswordSuccess.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/ResetPasswordSuccess.test.tsx @@ -28,9 +28,9 @@ describe('ResetPasswordSuccess', () => { try { render(, { wrapper }); vi.advanceTimersByTime(1000); - expect(fixtures.clerk.setActive).not.toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).not.toHaveBeenCalled(); vi.advanceTimersByTime(1000); - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); } finally { vi.useRealTimers(); } @@ -42,7 +42,7 @@ describe('ResetPasswordSuccess', () => { try { render(, { wrapper }); vi.advanceTimersByTime(2000); - expect(fixtures.clerk.setActive).not.toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).not.toHaveBeenCalled(); } finally { vi.useRealTimers(); } diff --git a/packages/ui/src/components/SignIn/__tests__/SignInAccountSwitcher.test.tsx b/packages/ui/src/components/SignIn/__tests__/SignInAccountSwitcher.test.tsx index 54a8cd799de..db2ea556fbc 100644 --- a/packages/ui/src/components/SignIn/__tests__/SignInAccountSwitcher.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/SignInAccountSwitcher.test.tsx @@ -30,10 +30,10 @@ describe('SignInAccountSwitcher', () => { it('sets an active session when user clicks an already logged in account from the list', async () => { const { wrapper, fixtures } = await createFixtures(initConfig); - fixtures.clerk.setActive.mockReturnValueOnce(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValueOnce(Promise.resolve()); const { userEvent, getByText } = render(, { wrapper }); await userEvent.click(getByText('Nick Kouk')); - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); // this one uses the windowNavigate method. we need to mock it correctly diff --git a/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx b/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx index 1de4ab411a9..0abd1a2c2d9 100644 --- a/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/SignInFactorOne.test.tsx @@ -102,7 +102,7 @@ describe('SignInFactorOne', () => { await userEvent.type(screen.getByLabelText(/Enter verification code/i), '123456'); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); }); }); diff --git a/packages/ui/src/components/SignIn/__tests__/SignInFactorTwo.test.tsx b/packages/ui/src/components/SignIn/__tests__/SignInFactorTwo.test.tsx index 3d944954df9..545d310953f 100644 --- a/packages/ui/src/components/SignIn/__tests__/SignInFactorTwo.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/SignInFactorTwo.test.tsx @@ -61,7 +61,7 @@ describe('SignInFactorTwo', () => { await userEvent.type(screen.getByLabelText(/Enter verification code/i), '123456'); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); }); @@ -86,7 +86,7 @@ describe('SignInFactorTwo', () => { await userEvent.type(screen.getByLabelText(/Enter verification code/i), '123456'); await waitFor(() => { - expect(fixtures.clerk.setActive).not.toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).not.toHaveBeenCalled(); expect(fixtures.router.navigate).toHaveBeenCalledWith( '../reset-password-success?createdSessionId=1234_session_id', ); diff --git a/packages/ui/src/components/SignIn/__tests__/SignInStart.test.tsx b/packages/ui/src/components/SignIn/__tests__/SignInStart.test.tsx index c175f6f71c4..1bbb53c139d 100644 --- a/packages/ui/src/components/SignIn/__tests__/SignInStart.test.tsx +++ b/packages/ui/src/components/SignIn/__tests__/SignInStart.test.tsx @@ -278,7 +278,7 @@ describe('SignInStart', () => { await userEvent.click(googleButton); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalledWith({ + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith({ session: 'sess_123', navigate: expect.any(Function), }); @@ -557,7 +557,7 @@ describe('SignInStart', () => { await userEvent.click(screen.getByText('Continue')); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalledWith({ + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith({ session: 'sess_123', navigate: expect.any(Function), }); @@ -584,7 +584,7 @@ describe('SignInStart', () => { fixtures.signIn.create.mockRejectedValueOnce(sessionExistsError); const mockSession = { id: 'sess_123' } as any; - (fixtures.clerk.setActive as any).mockImplementation( + (fixtures.clerk.setSelected as any).mockImplementation( async ({ navigate }: { navigate: ({ session }: { session: any }) => Promise }) => { await navigate({ session: mockSession }); }, @@ -596,7 +596,7 @@ describe('SignInStart', () => { await userEvent.click(screen.getByText('Continue')); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); }); }); diff --git a/packages/ui/src/components/SignIn/handleCombinedFlowTransfer.ts b/packages/ui/src/components/SignIn/handleCombinedFlowTransfer.ts index 5ed1926acb8..db18ebc1cf2 100644 --- a/packages/ui/src/components/SignIn/handleCombinedFlowTransfer.ts +++ b/packages/ui/src/components/SignIn/handleCombinedFlowTransfer.ts @@ -93,7 +93,7 @@ export function handleCombinedFlowTransfer({ verifyEmailPath: 'create/verify-email-address', verifyPhonePath: 'create/verify-phone-number', handleComplete: () => - clerk.setActive({ + clerk.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); diff --git a/packages/ui/src/components/SignIn/shared.ts b/packages/ui/src/components/SignIn/shared.ts index 656b844bbc7..cd933067bce 100644 --- a/packages/ui/src/components/SignIn/shared.ts +++ b/packages/ui/src/components/SignIn/shared.ts @@ -14,7 +14,7 @@ import { useSupportEmail } from '../../hooks/useSupportEmail'; function useHandleAuthenticateWithPasskey(onSecondFactor: () => Promise) { const card = useCardState(); // @ts-expect-error -- private method for the time being - const { setActive, __internal_navigateWithError } = useClerk(); + const { setSelected, __internal_navigateWithError } = useClerk(); const supportEmail = useSupportEmail(); const { afterSignInUrl, navigateOnSetActive } = useSignInContext(); const { authenticateWithPasskey } = useCoreSignIn(); @@ -30,7 +30,7 @@ function useHandleAuthenticateWithPasskey(onSecondFactor: () => Promise const res = await authenticateWithPasskey(...args); switch (res.status) { case 'complete': - return setActive({ + return setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignInUrl }); diff --git a/packages/ui/src/components/SignUp/SignUpContinue.tsx b/packages/ui/src/components/SignUp/SignUpContinue.tsx index 9acbc23a2f2..bbbbb22dd11 100644 --- a/packages/ui/src/components/SignUp/SignUpContinue.tsx +++ b/packages/ui/src/components/SignUp/SignUpContinue.tsx @@ -104,7 +104,7 @@ function SignUpContinueInternal() { useEffect(() => { // Redirect to sign-up if there is no persisted sign-up - if (!signUp.id && clerk.__internal_setActiveInProgress !== true) { + if (!signUp.id && clerk.__internal_setSelectedInProgress !== true) { void navigate(displayConfig.signUpUrl); } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -180,7 +180,7 @@ function SignUpContinueInternal() { verifyEmailPath: './verify-email-address', verifyPhonePath: './verify-phone-number', handleComplete: () => - clerk.setActive({ + clerk.setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); diff --git a/packages/ui/src/components/SignUp/SignUpEmailLinkCard.tsx b/packages/ui/src/components/SignUp/SignUpEmailLinkCard.tsx index 4f08cd90a7c..140481f26c2 100644 --- a/packages/ui/src/components/SignUp/SignUpEmailLinkCard.tsx +++ b/packages/ui/src/components/SignUp/SignUpEmailLinkCard.tsx @@ -20,7 +20,7 @@ export const SignUpEmailLinkCard = () => { const { afterSignUpUrl, navigateOnSetActive } = signUpContext; const card = useCardState(); const { navigate } = useRouter(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const [showVerifyModal, setShowVerifyModal] = React.useState(false); const { startEmailLinkFlow, cancelEmailLinkFlow } = useEmailLink(signUp); @@ -57,7 +57,7 @@ export const SignUpEmailLinkCard = () => { verifyEmailPath: '../verify-email-address', verifyPhonePath: '../verify-phone-number', handleComplete: () => - setActive({ + setSelected({ session: su.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); diff --git a/packages/ui/src/components/SignUp/SignUpStart.tsx b/packages/ui/src/components/SignUp/SignUpStart.tsx index 30acd72fbb6..a85a8357f85 100644 --- a/packages/ui/src/components/SignUp/SignUpStart.tsx +++ b/packages/ui/src/components/SignUp/SignUpStart.tsx @@ -41,7 +41,7 @@ function SignUpStartInternal(): JSX.Element { const { userSettings, authConfig } = useEnvironment(); const { navigate } = useRouter(); const { attributes } = userSettings; - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const ctx = useSignUpContext(); const isWithinSignInContext = !!React.useContext(SignInContext); const { afterSignUpUrl, signInUrl, unsafeMetadata, navigateOnSetActive } = ctx; @@ -168,7 +168,7 @@ function SignUpStartInternal(): JSX.Element { handleComplete: () => { removeClerkQueryParam('__clerk_ticket'); removeClerkQueryParam('__clerk_invitation_token'); - return setActive({ + return setSelected({ session: signUp.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); @@ -345,7 +345,7 @@ function SignUpStartInternal(): JSX.Element { verifyEmailPath: 'verify-email-address', verifyPhonePath: 'verify-phone-number', handleComplete: () => - setActive({ + setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); diff --git a/packages/ui/src/components/SignUp/SignUpVerificationCodeForm.tsx b/packages/ui/src/components/SignUp/SignUpVerificationCodeForm.tsx index 4ca48081849..3e6aee6b6f9 100644 --- a/packages/ui/src/components/SignUp/SignUpVerificationCodeForm.tsx +++ b/packages/ui/src/components/SignUp/SignUpVerificationCodeForm.tsx @@ -26,7 +26,7 @@ type SignInFactorOneCodeFormProps = { export const SignUpVerificationCodeForm = (props: SignInFactorOneCodeFormProps) => { const { afterSignUpUrl, navigateOnSetActive, isCombinedFlow: _isCombinedFlow } = useSignUpContext(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { navigate } = useRouter(); const isWithinSignInContext = !!React.useContext(SignInContext); @@ -48,7 +48,7 @@ export const SignUpVerificationCodeForm = (props: SignInFactorOneCodeFormProps) verifyPhonePath: '../verify-phone-number', continuePath: '../continue', handleComplete: () => - setActive({ + setSelected({ session: res.createdSessionId, navigate: async ({ session }) => { await navigateOnSetActive({ session, redirectUrl: afterSignUpUrl }); diff --git a/packages/ui/src/components/UserButton/__tests__/UserButton.test.tsx b/packages/ui/src/components/UserButton/__tests__/UserButton.test.tsx index 50bc2f243b8..292ee3f8942 100644 --- a/packages/ui/src/components/UserButton/__tests__/UserButton.test.tsx +++ b/packages/ui/src/components/UserButton/__tests__/UserButton.test.tsx @@ -156,11 +156,11 @@ describe('UserButton', () => { it('changes the active session when clicking another session', async () => { const { wrapper, fixtures } = await createFixtures(initConfig); - fixtures.clerk.setActive.mockReturnValueOnce(Promise.resolve()); + fixtures.clerk.setSelected.mockReturnValueOnce(Promise.resolve()); const { getByText, getByRole, userEvent } = render(, { wrapper }); await userEvent.click(getByRole('button', { name: 'Open user menu' })); await userEvent.click(getByText('First3 Last3')); - expect(fixtures.clerk.setActive).toHaveBeenCalledWith( + expect(fixtures.clerk.setSelected).toHaveBeenCalledWith( expect.objectContaining({ session: expect.objectContaining({ user: expect.objectContaining({ id: '3' }) }) }), ); }); diff --git a/packages/ui/src/components/UserButton/useMultisessionActions.tsx b/packages/ui/src/components/UserButton/useMultisessionActions.tsx index 8b045f99f7a..394dff8709e 100644 --- a/packages/ui/src/components/UserButton/useMultisessionActions.tsx +++ b/packages/ui/src/components/UserButton/useMultisessionActions.tsx @@ -22,7 +22,7 @@ type UseMultisessionActionsParams = { } & Pick; export const useMultisessionActions = (opts: UseMultisessionActionsParams) => { - const { setActive, signOut, openUserProfile } = useClerk(); + const { setSelected, signOut, openUserProfile } = useClerk(); const card = useCardState(); const { signedInSessions, otherSessions } = useMultipleSessions({ user: opts.user }); const { navigate } = useRouter(); @@ -76,7 +76,7 @@ export const useMultisessionActions = (opts: UseMultisessionActionsParams) => { const handleSessionClicked = (session: SignedInSessionResource) => async () => { card.setLoading(); - return setActive({ + return setSelected({ session, navigate: async ({ session }) => { if (!session.currentTask && opts.afterSwitchSessionUrl) { diff --git a/packages/ui/src/components/UserProfile/DeleteUserForm.tsx b/packages/ui/src/components/UserProfile/DeleteUserForm.tsx index 68b90d01681..93b689b9962 100644 --- a/packages/ui/src/components/UserProfile/DeleteUserForm.tsx +++ b/packages/ui/src/components/UserProfile/DeleteUserForm.tsx @@ -20,7 +20,7 @@ export const DeleteUserForm = withCardStateProvider((props: DeleteUserFormProps) const { user } = useUser(); const { t } = useLocalizations(); const { otherSessions } = useMultipleSessions({ user }); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const deleteUserWithReverification = useReverification(() => user?.delete()); const confirmationField = useFormControl('deleteConfirmation', '', { @@ -43,7 +43,7 @@ export const DeleteUserForm = withCardStateProvider((props: DeleteUserFormProps) await deleteUserWithReverification(); const redirectUrl = otherSessions.length === 0 ? afterSignOutUrl : afterMultiSessionSingleSignOutUrl; - return await setActive({ + return await setSelected({ session: null, redirectUrl, }); diff --git a/packages/ui/src/components/UserVerification/__tests__/UVFactorOne.test.tsx b/packages/ui/src/components/UserVerification/__tests__/UVFactorOne.test.tsx index 1db947ebbc8..1276c934f0e 100644 --- a/packages/ui/src/components/UserVerification/__tests__/UVFactorOne.test.tsx +++ b/packages/ui/src/components/UserVerification/__tests__/UVFactorOne.test.tsx @@ -129,7 +129,7 @@ describe('UserVerificationFactorOne', () => { await userEvent.click(screen.getByText('Continue')); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); expect(fixtures.session?.attemptFirstFactorVerification).toHaveBeenCalledTimes(1); }); diff --git a/packages/ui/src/components/UserVerification/__tests__/UVFactorTwo.test.tsx b/packages/ui/src/components/UserVerification/__tests__/UVFactorTwo.test.tsx index 569073c8c85..306e1e9c084 100644 --- a/packages/ui/src/components/UserVerification/__tests__/UVFactorTwo.test.tsx +++ b/packages/ui/src/components/UserVerification/__tests__/UVFactorTwo.test.tsx @@ -121,7 +121,7 @@ describe('UserVerificationFactorTwo', () => { await userEvent.type(getByLabelText(/Enter verification code/i), '123456'); await waitFor(() => { - expect(fixtures.clerk.setActive).toHaveBeenCalled(); + expect(fixtures.clerk.setSelected).toHaveBeenCalled(); }); }); }); diff --git a/packages/ui/src/components/UserVerification/use-after-verification.ts b/packages/ui/src/components/UserVerification/use-after-verification.ts index 0507452dd28..80799784dfc 100644 --- a/packages/ui/src/components/UserVerification/use-after-verification.ts +++ b/packages/ui/src/components/UserVerification/use-after-verification.ts @@ -11,7 +11,7 @@ import { useUserVerificationSession } from './useUserVerificationSession'; const useAfterVerification = () => { const { afterVerification } = useUserVerification(); const supportEmail = useSupportEmail(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { setCache } = useUserVerificationSession(); const { navigate } = useRouter(); @@ -26,7 +26,7 @@ const useAfterVerification = () => { }); switch (sessionVerification.status) { case 'complete': - await setActive({ session: sessionVerification.session.id }); + await setSelected({ session: sessionVerification.session.id }); return afterVerification?.(); case 'needs_second_factor': @@ -35,7 +35,7 @@ const useAfterVerification = () => { return console.error(clerkInvalidFAPIResponse(sessionVerification.status, supportEmail)); } }, - [navigate, setActive, supportEmail], + [navigate, setSelected, supportEmail], ); return { diff --git a/packages/ui/src/contexts/components/Plans.tsx b/packages/ui/src/contexts/components/Plans.tsx index 3b2131bbf0f..45402627a1a 100644 --- a/packages/ui/src/contexts/components/Plans.tsx +++ b/packages/ui/src/contexts/components/Plans.tsx @@ -335,7 +335,7 @@ export const usePlansContext = () => { }, onClose: () => { if (session?.id) { - void clerk.setActive({ session: session.id }); + void clerk.setSelected({ session: session.id }); } }, appearance, diff --git a/packages/ui/src/hooks/__tests__/useCoreOrganizationList.test.tsx b/packages/ui/src/hooks/__tests__/useCoreOrganizationList.test.tsx index dbe8147240e..c5342e5c274 100644 --- a/packages/ui/src/hooks/__tests__/useCoreOrganizationList.test.tsx +++ b/packages/ui/src/hooks/__tests__/useCoreOrganizationList.test.tsx @@ -38,7 +38,7 @@ describe('useOrganizationList', () => { const { result } = renderHook(() => useOrganizationList(), { wrapper }); expect(result.current.isLoaded).toBe(true); - expect(result.current.setActive).toBeDefined(); + expect(result.current.setSelected).toBeDefined(); expect(result.current.createOrganization).toBeDefined(); expect(result.current.userInvitations).toEqual( diff --git a/packages/ui/src/hooks/useSetSessionWithTimeout.ts b/packages/ui/src/hooks/useSetSessionWithTimeout.ts index 832ff461637..6118800b1d5 100644 --- a/packages/ui/src/hooks/useSetSessionWithTimeout.ts +++ b/packages/ui/src/hooks/useSetSessionWithTimeout.ts @@ -6,7 +6,7 @@ import { useRouter } from '../router'; export const useSetSessionWithTimeout = (delay = 2000) => { const { queryString } = useRouter(); - const { setActive } = useClerk(); + const { setSelected } = useClerk(); const { afterSignInUrl } = useSignInContext(); useEffect(() => { @@ -15,7 +15,7 @@ export const useSetSessionWithTimeout = (delay = 2000) => { const createdSessionId = queryParams.get('createdSessionId'); if (createdSessionId) { timeoutId = setTimeout(() => { - void setActive({ session: createdSessionId, redirectUrl: afterSignInUrl }); + void setSelected({ session: createdSessionId, redirectUrl: afterSignInUrl }); }, delay); } @@ -24,5 +24,5 @@ export const useSetSessionWithTimeout = (delay = 2000) => { clearTimeout(timeoutId); } }; - }, [setActive, afterSignInUrl, queryString]); + }, [setSelected, afterSignInUrl, queryString]); }; diff --git a/packages/ui/src/test/mock-helpers.ts b/packages/ui/src/test/mock-helpers.ts index 35bcb54a8f6..c729ead13f3 100644 --- a/packages/ui/src/test/mock-helpers.ts +++ b/packages/ui/src/test/mock-helpers.ts @@ -99,7 +99,7 @@ export const mockClerkMethods = (clerk: LoadedClerk): DeepVitestMocked; diff --git a/packages/upgrade/src/codemods/__tests__/__fixtures__/transform-remove-deprecated-props.fixtures.js b/packages/upgrade/src/codemods/__tests__/__fixtures__/transform-remove-deprecated-props.fixtures.js index 3eaab4af5af..ae3668bef0c 100644 --- a/packages/upgrade/src/codemods/__tests__/__fixtures__/transform-remove-deprecated-props.fixtures.js +++ b/packages/upgrade/src/codemods/__tests__/__fixtures__/transform-remove-deprecated-props.fixtures.js @@ -172,7 +172,7 @@ await setActive({ }); `, output: ` -await setActive({ +await setSelected({ session: '123', navigate: params => handleBeforeEmit(params.session), }); diff --git a/packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs b/packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs index 30909cdcf9f..c4eab4494fb 100644 --- a/packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs +++ b/packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs @@ -105,6 +105,25 @@ module.exports = function transformDeprecatedProps({ source }, { jscodeshift: j, dirty = true; } + // Rename setActive to setSelected + if (transformSetActiveToSetSelected(root, j, stats)) { + dirty = true; + } + + // Rename SetActive types to SetSelected + if (renameTypeReferences(root, j, 'SetActive', 'SetSelected')) { + dirty = true; + } + if (renameTypeReferences(root, j, 'SetActiveParams', 'SetSelectedParams')) { + dirty = true; + } + if (renameTypeReferences(root, j, 'SetActiveNavigate', 'SetSelectedNavigate')) { + dirty = true; + } + if (renameTypeReferences(root, j, 'SetActiveHook', 'SetSelectedHook')) { + dirty = true; + } + if (renameTypeReferences(root, j, 'ClerkMiddlewareAuthObject', 'ClerkMiddlewareSessionAuthObject')) { dirty = true; } @@ -378,7 +397,7 @@ function transformSetActiveBeforeEmit(root, j, stats) { root .find(j.CallExpression) - .filter(path => isSetActiveCall(path.node.callee)) + .filter(path => isSetActiveOrSetSelectedCall(path.node.callee)) .forEach(path => { const [args0] = path.node.arguments; if (!args0 || args0.type !== 'ObjectExpression') { @@ -408,16 +427,85 @@ function transformSetActiveBeforeEmit(root, j, stats) { return changed; } -function isSetActiveCall(callee) { +function transformSetActiveToSetSelected(root, j, stats) { + let changed = false; + + // Rename setActive method calls: clerk.setActive(...) -> clerk.setSelected(...) + root + .find(j.MemberExpression, { + property: { type: 'Identifier', name: 'setActive' }, + computed: false, + }) + .forEach(path => { + path.node.property.name = 'setSelected'; + changed = true; + stats('setActiveRenamed'); + }); + + root + .find(j.OptionalMemberExpression, { + property: { type: 'Identifier', name: 'setActive' }, + computed: false, + }) + .forEach(path => { + path.node.property.name = 'setSelected'; + changed = true; + stats('setActiveRenamed'); + }); + + // Rename setActive identifier (e.g., standalone call or destructured) + root.find(j.Identifier, { name: 'setActive' }).forEach(path => { + // Skip if it's part of a member expression property (already handled above) + if ( + path.parent && + (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') && + path.parent.node.property === path.node + ) { + return; + } + // Skip if it's part of an import specifier (handled separately) + if (path.parent && path.parent.node.type === 'ImportSpecifier') { + return; + } + path.node.name = 'setSelected'; + changed = true; + stats('setActiveRenamed'); + }); + + // Rename import specifier: import { setActive } -> import { setSelected } + root.find(j.ImportSpecifier).forEach(path => { + const imported = path.node.imported; + if (imported && imported.type === 'Identifier' && imported.name === 'setActive') { + imported.name = 'setSelected'; + if (path.node.local && path.node.local.name === 'setActive') { + path.node.local.name = 'setSelected'; + } + changed = true; + stats('setActiveRenamed'); + } + }); + + // Rename object property keys: { setActive: ... } -> { setSelected: ... } + if (renameObjectProperties(root, j, 'setActive', 'setSelected')) { + changed = true; + stats('setActiveRenamed'); + } + + return changed; +} + +function isSetActiveOrSetSelectedCall(callee) { if (!callee) { return false; } if (callee.type === 'Identifier') { - return callee.name === 'setActive'; + return callee.name === 'setActive' || callee.name === 'setSelected'; } if (callee.type === 'MemberExpression' || callee.type === 'OptionalMemberExpression') { const property = callee.property; - return property && property.type === 'Identifier' && property.name === 'setActive'; + return ( + property && property.type === 'Identifier' && (property.name === 'setActive' || property.name === 'setSelected') + ); } return false; } diff --git a/packages/upgrade/src/versions/core-3/changes/set-active-before-emit-removed.md b/packages/upgrade/src/versions/core-3/changes/set-active-before-emit-removed.md index fe40a61a229..07035b5608b 100644 --- a/packages/upgrade/src/versions/core-3/changes/set-active-before-emit-removed.md +++ b/packages/upgrade/src/versions/core-3/changes/set-active-before-emit-removed.md @@ -1,13 +1,13 @@ --- -title: '`setActive({ beforeEmit })` changed to `setActive({ navigate })`' +title: '`setSelected({ beforeEmit })` changed to `setSelected({ navigate })`' matcher: 'beforeEmit' category: 'deprecation-removal' --- -The `beforeEmit` callback in `setActive()` has been replaced with `navigate`. The callback signature has also changed: +The `beforeEmit` callback in `setSelected()` (formerly `setActive()`) has been replaced with `navigate`. The callback signature has also changed: ```diff -await setActive({ +await setSelected({ session: sessionId, - beforeEmit: () => { - // Called before session is set diff --git a/packages/upgrade/src/versions/core-3/changes/set-active-renamed-to-set-selected.md b/packages/upgrade/src/versions/core-3/changes/set-active-renamed-to-set-selected.md new file mode 100644 index 00000000000..33f0395140f --- /dev/null +++ b/packages/upgrade/src/versions/core-3/changes/set-active-renamed-to-set-selected.md @@ -0,0 +1,44 @@ +--- +title: '`setActive` renamed to `setSelected`' +matcher: 'setActive' +category: 'deprecation-removal' +--- + +The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions. Update all usages: + +```diff +// Method calls +- await clerk.setActive({ session: sessionId }); ++ await clerk.setSelected({ session: sessionId }); + +// Destructuring from hooks +- const { setActive } = useSignIn(); ++ const { setSelected } = useSignIn(); + +- const { setActive } = useSignUp(); ++ const { setSelected } = useSignUp(); + +- const { setActive } = useSessionList(); ++ const { setSelected } = useSessionList(); + +- const { setActive } = useOrganizationList(); ++ const { setSelected } = useOrganizationList(); +``` + +## Type Changes + +The following types have also been renamed: + +```diff +- SetActive ++ SetSelected + +- SetActiveParams ++ SetSelectedParams + +- SetActiveNavigate ++ SetSelectedNavigate + +- SetActiveHook ++ SetSelectedHook +``` diff --git a/packages/vue/src/composables/useSessionList.ts b/packages/vue/src/composables/useSessionList.ts index 86839f1d4bb..698440c7c59 100644 --- a/packages/vue/src/composables/useSessionList.ts +++ b/packages/vue/src/composables/useSessionList.ts @@ -36,14 +36,14 @@ export const useSessionList: UseSessionList = () => { const result = computed(() => { if (!clientCtx.value) { - return { isLoaded: false, sessions: undefined, setActive: undefined }; + return { isLoaded: false, sessions: undefined, setSelected: undefined }; } return { isLoaded: true, sessions: clientCtx.value.sessions, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - setActive: clerk.value!.setActive, + setSelected: clerk.value!.setSelected, }; }); diff --git a/packages/vue/src/composables/useSignIn.ts b/packages/vue/src/composables/useSignIn.ts index 4931829c592..f44a1bf0faf 100644 --- a/packages/vue/src/composables/useSignIn.ts +++ b/packages/vue/src/composables/useSignIn.ts @@ -41,13 +41,13 @@ export const useSignIn: UseSignIn = () => { const result = computed(() => { if (!clerk.value || !clientCtx.value) { - return { isLoaded: false, signIn: undefined, setActive: undefined }; + return { isLoaded: false, signIn: undefined, setSelected: undefined }; } return { isLoaded: true, signIn: clientCtx.value.signIn, - setActive: clerk.value.setActive, + setSelected: clerk.value.setSelected, }; }); diff --git a/packages/vue/src/composables/useSignUp.ts b/packages/vue/src/composables/useSignUp.ts index 097a1cada60..b087015e4a1 100644 --- a/packages/vue/src/composables/useSignUp.ts +++ b/packages/vue/src/composables/useSignUp.ts @@ -41,13 +41,13 @@ export const useSignUp: UseSignUp = () => { const result = computed(() => { if (!clerk.value || !clientCtx.value) { - return { isLoaded: false, signUp: undefined, setActive: undefined }; + return { isLoaded: false, signUp: undefined, setSelected: undefined }; } return { isLoaded: true, signUp: clientCtx.value.signUp, - setActive: clerk.value.setActive, + setSelected: clerk.value.setSelected, }; });