Skip to content

Commit 8145b48

Browse files
committed
Display error in development if orgs is disabled
1 parent 880d0b2 commit 8145b48

File tree

9 files changed

+49
-47
lines changed

9 files changed

+49
-47
lines changed

.changeset/bright-cats-lay.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
2-
'@clerk/clerk-js': patch
3-
'@clerk/types': patch
2+
'@clerk/clerk-js': minor
3+
'@clerk/types': minor
44
---
55

66
Export `<TaskSelectOrganization />` component.

packages/clerk-js/src/core/clerk.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import type {
7676
SignUpProps,
7777
SignUpRedirectOptions,
7878
SignUpResource,
79+
TaskSelectOrganizationProps,
7980
UnsubscribeCallback,
8081
UserButtonProps,
8182
UserProfileProps,
@@ -1164,9 +1165,18 @@ export class Clerk implements ClerkInterface {
11641165
void this.#componentControls.ensureMounted().then(controls => controls.unmountComponent({ node }));
11651166
};
11661167

1167-
public mountTaskSelectOrganization = (node: HTMLDivElement, props?: APIKeysProps) => {
1168+
public mountTaskSelectOrganization = (node: HTMLDivElement, props?: TaskSelectOrganizationProps) => {
11681169
this.assertComponentsReady(this.#componentControls);
11691170

1171+
if (disabledOrganizationsFeature(this, this.environment)) {
1172+
if (this.#instanceType === 'development') {
1173+
throw new ClerkRuntimeError(warnings.cannotRenderAnyOrganizationComponent('TaskSelectOrganization'), {
1174+
code: CANNOT_RENDER_ORGANIZATIONS_DISABLED_ERROR_CODE,
1175+
});
1176+
}
1177+
return;
1178+
}
1179+
11701180
void this.#componentControls.ensureMounted({ preloadHint: 'TaskSelectOrganization' }).then(controls =>
11711181
controls.mountComponent({
11721182
name: 'TaskSelectOrganization',

packages/clerk-js/src/core/warnings.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ const formatWarning = (msg: string) => {
55
};
66

77
const createMessageForDisabledOrganizations = (
8-
componentName: 'OrganizationProfile' | 'OrganizationSwitcher' | 'OrganizationList' | 'CreateOrganization',
8+
componentName:
9+
| 'OrganizationProfile'
10+
| 'OrganizationSwitcher'
11+
| 'OrganizationList'
12+
| 'CreateOrganization'
13+
| 'TaskSelectOrganization',
914
) => {
1015
return formatWarning(
1116
`The <${componentName}/> cannot be rendered when the feature is turned off. Visit 'dashboard.clerk.com' to enable the feature. Since the feature is turned off, this is no-op.`,

packages/clerk-js/src/ui/components/CreateOrganization/CreateOrganizationForm.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { useOrganization, useOrganizationList } from '@clerk/shared/react';
1+
import { useClerk, useOrganization, useOrganizationList } from '@clerk/shared/react';
22
import type { CreateOrganizationParams, OrganizationResource } from '@clerk/types';
3-
import React from 'react';
3+
import React, { useContext } from 'react';
44

5-
import { useSessionTasksContext } from '@/ui/contexts/components/SessionTasks';
5+
import { SessionTasksContext } from '@/ui/contexts/components/SessionTasks';
66
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
77
import { Form } from '@/ui/elements/Form';
88
import { FormButtonContainer } from '@/ui/elements/FormButtons';
@@ -40,7 +40,8 @@ type CreateOrganizationFormProps = {
4040
export const CreateOrganizationForm = withCardStateProvider((props: CreateOrganizationFormProps) => {
4141
const card = useCardState();
4242
const wizard = useWizard({ onNextStep: () => card.setError(undefined) });
43-
const sessionTasksContext = useSessionTasksContext();
43+
const sessionTasksContext = useContext(SessionTasksContext);
44+
const clerk = useClerk();
4445

4546
const lastCreatedOrganizationRef = React.useRef<OrganizationResource | null>(null);
4647
const { createOrganization, isLoaded, setActive, userMemberships } = useOrganizationList({
@@ -92,7 +93,9 @@ export const CreateOrganizationForm = withCardStateProvider((props: CreateOrgani
9293
void userMemberships.revalidate?.();
9394

9495
if (sessionTasksContext) {
95-
await sessionTasksContext.navigateToTaskIfAvailable();
96+
await clerk.__internal_navigateToTaskIfAvailable({
97+
redirectUrlComplete: sessionTasksContext.redirectUrlComplete,
98+
});
9699
return;
97100
}
98101

packages/clerk-js/src/ui/components/OrganizationList/UserMembershipList.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
import { useOrganizationList, useUser } from '@clerk/shared/react';
1+
import { useClerk, useOrganizationList, useUser } from '@clerk/shared/react';
22
import type { OrganizationResource } from '@clerk/types';
3+
import { useContext } from 'react';
34

45
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
56
import { OrganizationPreview } from '@/ui/elements/OrganizationPreview';
67
import { PersonalWorkspacePreview } from '@/ui/elements/PersonalWorkspacePreview';
78

89
import { useOrganizationListContext } from '../../contexts';
9-
import { useSessionTasksContext } from '../../contexts/components/SessionTasks';
10+
import { SessionTasksContext } from '../../contexts/components/SessionTasks';
1011
import { localizationKeys } from '../../localization';
1112
import { OrganizationListPreviewButton, sharedMainIdentifierSx } from './shared';
1213

1314
export const MembershipPreview = withCardStateProvider((props: { organization: OrganizationResource }) => {
1415
const card = useCardState();
1516
const { navigateAfterSelectOrganization } = useOrganizationListContext();
1617
const { isLoaded, setActive } = useOrganizationList();
17-
const sessionTasksContext = useSessionTasksContext();
18+
const clerk = useClerk();
19+
const sessionTasksContext = useContext(SessionTasksContext);
1820

1921
if (!isLoaded) {
2022
return null;
@@ -25,8 +27,10 @@ export const MembershipPreview = withCardStateProvider((props: { organization: O
2527
organization,
2628
});
2729

28-
if (sessionTasksContext?.navigateToTaskIfAvailable) {
29-
return sessionTasksContext?.navigateToTaskIfAvailable();
30+
if (sessionTasksContext) {
31+
return clerk.__internal_navigateToTaskIfAvailable({
32+
redirectUrlComplete: sessionTasksContext.redirectUrlComplete,
33+
});
3034
}
3135

3236
await navigateAfterSelectOrganization(organization);

packages/clerk-js/src/ui/components/SessionTasks/index.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ import { INTERNAL_SESSION_TASK_ROUTE_BY_KEY } from '../../../core/sessionTasks';
1010
import { SignInContext, SignUpContext } from '../../../ui/contexts';
1111
import { SessionTasksContext, useSessionTasksContext } from '../../contexts/components/SessionTasks';
1212
import { Route, Switch, useRouter } from '../../router';
13-
import { TaskSelectOrganization } from './tasks/ForceOrganizationSelection';
13+
import { TaskSelectOrganization } from './tasks/TaskSelectOrganization';
1414

1515
const SessionTasksStart = () => {
16-
const { navigateToTaskIfAvailable } = useSessionTasksContext();
16+
const clerk = useClerk();
17+
const { navigate } = useRouter();
18+
const { redirectUrlComplete } = useSessionTasksContext();
1719

1820
useEffect(() => {
1921
// Simulates additional latency to avoid a abrupt UI transition when navigating to the next task
2022
const timeoutId = setTimeout(() => {
21-
void navigateToTaskIfAvailable();
23+
void clerk.__internal_navigateToTaskIfAvailable({ redirectUrlComplete });
2224
}, 500);
2325
return () => clearTimeout(timeoutId);
24-
}, [navigateToTaskIfAvailable]);
26+
}, [navigate, clerk, redirectUrlComplete]);
2527

2628
return (
2729
<Card.Root>
@@ -91,12 +93,7 @@ export const SessionTask = withCardStateProvider(() => {
9193
}
9294

9395
return (
94-
<SessionTasksContext.Provider
95-
value={{
96-
redirectUrlComplete,
97-
currentTaskContainer,
98-
}}
99-
>
96+
<SessionTasksContext.Provider value={{ redirectUrlComplete, currentTaskContainer }}>
10097
<SessionTaskRoutes />
10198
</SessionTasksContext.Provider>
10299
);
Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,17 @@
1-
import { useClerk } from '@clerk/shared/react/index';
2-
import { createContext, useCallback, useContext } from 'react';
1+
import { createContext, useContext } from 'react';
32

43
import type { SessionTasksCtx, TaskSelectOrganizationCtx } from '../../types';
54

65
export const SessionTasksContext = createContext<SessionTasksCtx | null>(null);
76

8-
export type SessionTasksContextType = SessionTasksCtx & {
9-
navigateToTaskIfAvailable: () => Promise<void>;
10-
};
11-
12-
export const useSessionTasksContext = (): SessionTasksContextType => {
13-
const clerk = useClerk();
14-
const ctx = useContext(SessionTasksContext);
7+
export const useSessionTasksContext = (): SessionTasksCtx => {
8+
const context = useContext(SessionTasksContext);
159

16-
if (ctx === null) {
10+
if (context === null) {
1711
throw new Error('Clerk: useSessionTasksContext called outside of the mounted SessionTasks component.');
1812
}
1913

20-
const redirectUrlComplete = ctx.redirectUrlComplete;
21-
22-
const navigateToTaskIfAvailable = useCallback(() => {
23-
return clerk.__internal_navigateToTaskIfAvailable({ redirectUrlComplete });
24-
}, [clerk, redirectUrlComplete]);
25-
26-
return {
27-
...ctx,
28-
navigateToTaskIfAvailable,
29-
};
14+
return context;
3015
};
3116

3217
export const TaskSelectOrganizationContext = createContext<TaskSelectOrganizationCtx | null>(null);

packages/clerk-js/src/ui/lazyModules/components.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ const componentImportPaths = {
2121
Checkout: () => import(/* webpackChunkName: "checkout" */ '../components/Checkout'),
2222
SessionTasks: () => import(/* webpackChunkName: "sessionTasks" */ '../components/SessionTasks'),
2323
TaskSelectOrganization: () =>
24-
import(
25-
/* webpackChunkName: "taskSelectOrganization" */ '../components/SessionTasks/tasks/ForceOrganizationSelection'
26-
),
24+
import(/* webpackChunkName: "taskSelectOrganization" */ '../components/SessionTasks/tasks/TaskSelectOrganization'),
2725
PlanDetails: () => import(/* webpackChunkName: "planDetails" */ '../components/Plans/PlanDetails'),
2826
SubscriptionDetails: () => import(/* webpackChunkName: "subscriptionDetails" */ '../components/SubscriptionDetails'),
2927
APIKeys: () => import(/* webpackChunkName: "apiKeys" */ '../components/ApiKeys/ApiKeys'),

0 commit comments

Comments
 (0)