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,