From 781539c094a178a05f2f7a412b0534411e09d097 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 12 Mar 2025 19:57:04 -0300 Subject: [PATCH 1/3] Update environment types --- packages/clerk-js/src/core/resources/Environment.ts | 4 ++++ .../src/core/resources/OrganizationSettings.ts | 10 +++++++++- packages/types/src/environment.ts | 1 + packages/types/src/organizationSettings.ts | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/clerk-js/src/core/resources/Environment.ts b/packages/clerk-js/src/core/resources/Environment.ts index ae033e5ecb1..96b55c9bca9 100644 --- a/packages/clerk-js/src/core/resources/Environment.ts +++ b/packages/clerk-js/src/core/resources/Environment.ts @@ -83,4 +83,8 @@ export class Environment extends BaseResource implements EnvironmentResource { maintenance_mode: this.maintenanceMode, }; } + + public get hasTasksEnabled() { + return !!this.organizationSettings.forceOrganizationSelection; + } } diff --git a/packages/clerk-js/src/core/resources/OrganizationSettings.ts b/packages/clerk-js/src/core/resources/OrganizationSettings.ts index 183f8e55b45..cc5895b50ff 100644 --- a/packages/clerk-js/src/core/resources/OrganizationSettings.ts +++ b/packages/clerk-js/src/core/resources/OrganizationSettings.ts @@ -10,6 +10,7 @@ import { BaseResource } from './internal'; export class OrganizationSettings extends BaseResource implements OrganizationSettingsResource { enabled!: boolean; maxAllowedMemberships!: number; + forceOrganizationSelection!: boolean; actions!: { adminDelete: boolean; }; @@ -25,9 +26,16 @@ export class OrganizationSettings extends BaseResource implements OrganizationSe } protected fromJSON(data: OrganizationSettingsJSON | OrganizationSettingsJSONSnapshot | null): this { - const { enabled = false, max_allowed_memberships = 0, actions, domains } = data || {}; + const { + enabled = false, + max_allowed_memberships = 0, + force_organization_selection = false, + actions, + domains, + } = data || {}; this.enabled = enabled; this.maxAllowedMemberships = max_allowed_memberships; + this.forceOrganizationSelection = force_organization_selection; this.actions = { adminDelete: actions?.admin_delete || false }; this.domains = { enabled: domains?.enabled || false, diff --git a/packages/types/src/environment.ts b/packages/types/src/environment.ts index f1b142ed2c6..48679cdd6b7 100644 --- a/packages/types/src/environment.ts +++ b/packages/types/src/environment.ts @@ -18,4 +18,5 @@ export interface EnvironmentResource extends ClerkResource { onWindowLocationHost: () => boolean; maintenanceMode: boolean; __internal_toSnapshot: () => EnvironmentJSONSnapshot; + hasTasksEnabled: boolean; } diff --git a/packages/types/src/organizationSettings.ts b/packages/types/src/organizationSettings.ts index 0e5041508c4..afbe09c5c97 100644 --- a/packages/types/src/organizationSettings.ts +++ b/packages/types/src/organizationSettings.ts @@ -8,6 +8,7 @@ export interface OrganizationSettingsJSON extends ClerkResourceJSON { object: never; enabled: boolean; max_allowed_memberships: number; + force_organization_selection: boolean; actions: { admin_delete: boolean; }; @@ -21,6 +22,7 @@ export interface OrganizationSettingsJSON extends ClerkResourceJSON { export interface OrganizationSettingsResource extends ClerkResource { enabled: boolean; maxAllowedMemberships: number; + forceOrganizationSelection: boolean; actions: { adminDelete: boolean; }; From 351cb819ea134efb65af58ca6703c35c14cf15ce Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 12 Mar 2025 20:00:28 -0300 Subject: [PATCH 2/3] Trigger lazy loading based on environment settings --- integration/templates/next-app-router/src/app/layout.tsx | 2 -- packages/clerk-js/src/ui/components/SignIn/SignIn.tsx | 7 +++---- packages/clerk-js/src/ui/components/SignUp/SignUp.tsx | 5 ++--- packages/clerk-js/src/ui/contexts/components/SignIn.ts | 6 +++--- packages/clerk-js/src/ui/contexts/components/SignUp.ts | 6 +++--- packages/types/src/clerk.ts | 2 -- 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/integration/templates/next-app-router/src/app/layout.tsx b/integration/templates/next-app-router/src/app/layout.tsx index e598334db29..2e56184f39d 100644 --- a/integration/templates/next-app-router/src/app/layout.tsx +++ b/integration/templates/next-app-router/src/app/layout.tsx @@ -24,8 +24,6 @@ export default function RootLayout({ children }: { children: React.ReactNode }) persistClient: process.env.NEXT_PUBLIC_EXPERIMENTAL_PERSIST_CLIENT ? process.env.NEXT_PUBLIC_EXPERIMENTAL_PERSIST_CLIENT === 'true' : undefined, - // `experimental.withSessionTasks` will be removed soon in favor of checking via environment response - withSessionTasks: true, }} > diff --git a/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx b/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx index 2a5895836f0..ccaf9071b20 100644 --- a/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx +++ b/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx @@ -130,7 +130,7 @@ function SignInRoutes(): JSX.Element { > - {signInContext.withSessionTasks && ( + {signInContext.hasTasksEnabled && ( @@ -144,7 +144,7 @@ function SignInRoutes(): JSX.Element { )} - {signInContext.withSessionTasks && ( + {signInContext.hasTasksEnabled && ( @@ -187,8 +187,7 @@ function SignInRoot() { */ usePreloadSignUp(signInContext.isCombinedFlow); - // `experimental.withSessionTasks` will be removed soon in favor of checking via environment response - usePreloadSessionTask(signInContext.withSessionTasks); + usePreloadSessionTask(signInContext.hasTasksEnabled); React.useEffect(() => { return __internal_setComponentNavigationContext?.({ basePath, navigate }); diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx index 9e42f7efac8..e5a3b9a9aca 100644 --- a/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx +++ b/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx @@ -31,8 +31,7 @@ function SignUpRoutes(): JSX.Element { const { navigate, basePath } = useRouter(); const signUpContext = useSignUpContext(); - // `experimental.withSessionTasks` will be removed soon in favor of checking via environment response - usePreloadSessionTask(signUpContext.withSessionTasks); + usePreloadSessionTask(signUpContext.hasTasksEnabled); React.useEffect(() => { return __internal_setComponentNavigationContext?.({ basePath, navigate }); @@ -89,7 +88,7 @@ function SignUpRoutes(): JSX.Element { - {signUpContext.withSessionTasks && ( + {signUpContext.hasTasksEnabled && ( diff --git a/packages/clerk-js/src/ui/contexts/components/SignIn.ts b/packages/clerk-js/src/ui/contexts/components/SignIn.ts index d709a0d14b4..e6dd20612b1 100644 --- a/packages/clerk-js/src/ui/contexts/components/SignIn.ts +++ b/packages/clerk-js/src/ui/contexts/components/SignIn.ts @@ -32,7 +32,7 @@ export type SignInContextType = SignInCtx & { emailLinkRedirectUrl: string; ssoCallbackUrl: string; isCombinedFlow: boolean; - withSessionTasks: boolean; + hasTasksEnabled: boolean; }; export const SignInContext = createContext(null); @@ -40,7 +40,7 @@ export const SignInContext = createContext(null); export const useSignInContext = (): SignInContextType => { const context = useContext(SignInContext); const { navigate } = useRouter(); - const { displayConfig, userSettings } = useEnvironment(); + const { displayConfig, userSettings, hasTasksEnabled } = useEnvironment(); const { queryParams, queryString } = useRouter(); const signUpMode = userSettings.signUp.mode; const options = useOptions(); @@ -144,6 +144,6 @@ export const useSignInContext = (): SignInContextType => { initialValues: { ...ctx.initialValues, ...initialValuesFromQueryParams }, authQueryString, isCombinedFlow, - withSessionTasks: !!options.experimental?.withSessionTasks, + hasTasksEnabled, }; }; diff --git a/packages/clerk-js/src/ui/contexts/components/SignUp.ts b/packages/clerk-js/src/ui/contexts/components/SignUp.ts index 59ce5f4ab09..804e1c53d30 100644 --- a/packages/clerk-js/src/ui/contexts/components/SignUp.ts +++ b/packages/clerk-js/src/ui/contexts/components/SignUp.ts @@ -31,7 +31,7 @@ export type SignUpContextType = SignUpCtx & { isCombinedFlow: boolean; emailLinkRedirectUrl: string; ssoCallbackUrl: string; - withSessionTasks: boolean; + hasTasksEnabled: boolean; }; export const SignUpContext = createContext(null); @@ -39,7 +39,7 @@ export const SignUpContext = createContext(null); export const useSignUpContext = (): SignUpContextType => { const context = useContext(SignUpContext); const { navigate } = useRouter(); - const { displayConfig, userSettings } = useEnvironment(); + const { displayConfig, userSettings, hasTasksEnabled } = useEnvironment(); const { queryParams, queryString } = useRouter(); const signUpMode = userSettings.signUp.mode; const options = useOptions(); @@ -138,6 +138,6 @@ export const useSignUpContext = (): SignUpContextType => { initialValues: { ...ctx.initialValues, ...initialValuesFromQueryParams }, authQueryString, isCombinedFlow, - withSessionTasks: !!options.experimental?.withSessionTasks, + hasTasksEnabled, }; }; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index e1366319454..f778d01cd68 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -818,8 +818,6 @@ export type ClerkOptions = ClerkOptionsNavigation & */ rethrowOfflineNetworkErrors: boolean; commerce: boolean; - // `experimental.withSessionTasks` will be removed soon in favor of checking via environment response - withSessionTasks: boolean; }, Record >; From 572ede5b4afda597a0e1983ff29dcbf353df45de Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Wed, 12 Mar 2025 20:02:58 -0300 Subject: [PATCH 3/3] Enforce hiding personal workspace --- .../clerk-js/src/ui/contexts/components/OrganizationList.ts | 4 ++-- .../src/ui/contexts/components/OrganizationSwitcher.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/clerk-js/src/ui/contexts/components/OrganizationList.ts b/packages/clerk-js/src/ui/contexts/components/OrganizationList.ts index ba86a6e1a4f..0c07c4161f4 100644 --- a/packages/clerk-js/src/ui/contexts/components/OrganizationList.ts +++ b/packages/clerk-js/src/ui/contexts/components/OrganizationList.ts @@ -11,7 +11,7 @@ export const OrganizationListContext = createContext export const useOrganizationListContext = () => { const context = useContext(OrganizationListContext); const { navigate } = useRouter(); - const { displayConfig } = useEnvironment(); + const { displayConfig, organizationSettings } = useEnvironment(); if (!context || context.componentName !== 'OrganizationList') { throw new Error('Clerk: useOrganizationListContext called outside OrganizationList.'); @@ -80,7 +80,7 @@ export const useOrganizationListContext = () => { afterCreateOrganizationUrl, skipInvitationScreen: ctx.skipInvitationScreen || false, hideSlug: ctx.hideSlug || false, - hidePersonal: ctx.hidePersonal || false, + hidePersonal: organizationSettings.forceOrganizationSelection || ctx.hidePersonal || false, navigateAfterCreateOrganization, navigateAfterSelectOrganization, navigateAfterSelectPersonal, diff --git a/packages/clerk-js/src/ui/contexts/components/OrganizationSwitcher.ts b/packages/clerk-js/src/ui/contexts/components/OrganizationSwitcher.ts index e4ceffde605..b4afacd7bd5 100644 --- a/packages/clerk-js/src/ui/contexts/components/OrganizationSwitcher.ts +++ b/packages/clerk-js/src/ui/contexts/components/OrganizationSwitcher.ts @@ -11,7 +11,7 @@ export const OrganizationSwitcherContext = createContext { const context = useContext(OrganizationSwitcherContext); const { navigate } = useRouter(); - const { displayConfig } = useEnvironment(); + const { displayConfig, organizationSettings } = useEnvironment(); if (!context || context.componentName !== 'OrganizationSwitcher') { throw new Error('Clerk: useOrganizationSwitcherContext called outside OrganizationSwitcher.'); @@ -96,7 +96,7 @@ export const useOrganizationSwitcherContext = () => { return { ...ctx, - hidePersonal: ctx.hidePersonal || false, + hidePersonal: organizationSettings.forceOrganizationSelection || ctx.hidePersonal || false, organizationProfileMode: organizationProfileMode || 'modal', createOrganizationMode: createOrganizationMode || 'modal', skipInvitationScreen: ctx.skipInvitationScreen || false,