Skip to content

Commit 959b35c

Browse files
committed
Rename to __experimental_Tasks
1 parent 4c0d27e commit 959b35c

File tree

11 files changed

+98
-10
lines changed

11 files changed

+98
-10
lines changed

.changeset/silent-terms-flow.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
---
22
'@clerk/clerk-js': patch
3+
'@clerk/react': patch
34
---
45

5-
Expose `__experimental_SessionTasks` component for after-auth custom flows out of `SignIn/SignUp` components
6+
Expose `__experimental_Tasks` component for after-auth custom flows out of `SignIn/SignUp` components

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,29 @@ export class Clerk implements ClerkInterface {
10371037
);
10381038
};
10391039

1040+
public mountTasks = (node: HTMLDivElement): void => {
1041+
this.assertComponentsReady(this.#componentControls);
1042+
1043+
void this.#componentControls.ensureMounted({ preloadHint: '__experimental_Tasks' }).then(controls =>
1044+
controls.mountComponent({
1045+
name: '__experimental_Tasks',
1046+
appearanceKey: 'tasks',
1047+
node,
1048+
}),
1049+
);
1050+
1051+
this.telemetry?.record(eventPrebuiltComponentMounted('__experimental_Tasks'));
1052+
};
1053+
1054+
public unmountTasks = (node: HTMLDivElement): void => {
1055+
this.assertComponentsReady(this.#componentControls);
1056+
void this.#componentControls.ensureMounted().then(controls =>
1057+
controls.unmountComponent({
1058+
node,
1059+
}),
1060+
);
1061+
};
1062+
10401063
/**
10411064
* `setActive` can be used to set the active session and/or organization.
10421065
*/

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ function SessionTasksRoutes(): JSX.Element {
5555
);
5656
}
5757

58-
export function __experimental_SessionTasks(): JSX.Element {
58+
export function __experimental_Tasks(): JSX.Element {
5959
const clerk = useClerk();
6060
const { navigate } = useRouter();
6161
const signInContext = useContext(SignInContext);

packages/clerk-js/src/ui/components/SignIn/SignIn.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useClerk } from '@clerk/shared/react';
22
import type { SignInModalProps, SignInProps } from '@clerk/types';
33
import React from 'react';
44

5-
import { __experimental_SessionTasks as LazySessionTasks } from '../../../ui/lazyModules/components';
5+
import { __experimental_Tasks as LazyTasks } from '../../../ui/lazyModules/components';
66
import { normalizeRoutingOptions } from '../../../utils/normalizeRoutingOptions';
77
import { SignInEmailLinkFlowComplete, SignUpEmailLinkFlowComplete } from '../../common/EmailLinkCompleteFlowCard';
88
import {
@@ -131,7 +131,7 @@ function SignInRoutes(): JSX.Element {
131131
<LazySignUpVerifyPhone />
132132
</Route>
133133
<Route path='tasks'>
134-
<LazySessionTasks />
134+
<LazyTasks />
135135
</Route>
136136
<Route index>
137137
<LazySignUpContinue />
@@ -143,7 +143,7 @@ function SignInRoutes(): JSX.Element {
143143
</Route>
144144
)}
145145
<Route path='tasks'>
146-
<LazySessionTasks />
146+
<LazyTasks />
147147
</Route>
148148
<Route index>
149149
<SignInStart />

packages/clerk-js/src/ui/components/SignUp/SignUp.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useClerk } from '@clerk/shared/react';
22
import type { SignUpModalProps, SignUpProps } from '@clerk/types';
33
import React from 'react';
44

5-
import { __experimental_SessionTasks as LazySessionTasks } from '../../../ui/lazyModules/components';
5+
import { __experimental_Tasks as LazyTasks } from '../../../ui/lazyModules/components';
66
import { SignUpEmailLinkFlowComplete } from '../../common/EmailLinkCompleteFlowCard';
77
import { SignUpContext, useSignUpContext, withCoreSessionSwitchGuard } from '../../contexts';
88
import { Flow } from '../../customizables';
@@ -85,7 +85,7 @@ function SignUpRoutes(): JSX.Element {
8585
</Route>
8686
</Route>
8787
<Route path='tasks'>
88-
<LazySessionTasks />
88+
<LazyTasks />
8989
</Route>
9090
<Route index>
9191
<SignUpStart />

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ export const PlanDetails = lazy(() =>
102102
componentImportPaths.PlanDetails().then(module => ({ default: module.PlanDetails })),
103103
);
104104

105-
export const __experimental_SessionTasks = lazy(() =>
106-
componentImportPaths.SessionTasks().then(module => ({ default: module.__experimental_SessionTasks })),
105+
export const __experimental_Tasks = lazy(() =>
106+
componentImportPaths.SessionTasks().then(module => ({ default: module.__experimental_Tasks })),
107107
);
108108

109109
export const preloadComponent = async (component: unknown) => {
@@ -133,7 +133,7 @@ export const ClerkComponents = {
133133
PricingTable,
134134
Checkout,
135135
PlanDetails,
136-
__experimental_SessionTasks,
136+
__experimental_Tasks,
137137
};
138138

139139
export type ClerkComponentName = keyof typeof ClerkComponents;

packages/react/src/components/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export {
1010
GoogleOneTap,
1111
Waitlist,
1212
PricingTable,
13+
__experimental_Tasks,
1314
} from './uiComponents';
1415

1516
export {

packages/react/src/components/uiComponents.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,3 +600,31 @@ export const PricingTable = withClerk(
600600
},
601601
{ component: 'PricingTable', renderWhileLoading: true },
602602
);
603+
604+
export const __experimental_Tasks = withClerk(
605+
({ clerk, component, fallback, ...props }: WithClerkProp<FallbackProp>) => {
606+
const mountingStatus = useWaitForComponentMount(component);
607+
const shouldShowFallback = mountingStatus === 'rendering' || !clerk.loaded;
608+
609+
const rendererRootProps = {
610+
...(shouldShowFallback && fallback && { style: { display: 'none' } }),
611+
};
612+
613+
return (
614+
<>
615+
{shouldShowFallback && fallback}
616+
{clerk.loaded && (
617+
<ClerkHostRenderer
618+
component={component}
619+
mount={clerk.mountTasks}
620+
unmount={clerk.unmountTasks}
621+
updateProps={(clerk as any).__unstable__updateProps}
622+
props={props}
623+
rootProps={rendererRootProps}
624+
/>
625+
)}
626+
</>
627+
);
628+
},
629+
{ component: '__experimental_Tasks', renderWhileLoading: true },
630+
);

packages/react/src/isomorphicClerk.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
131131
private premountMethodCalls = new Map<MethodName<BrowserClerk>, MethodCallback>();
132132
private premountWaitlistNodes = new Map<HTMLDivElement, WaitlistProps | undefined>();
133133
private premountPricingTableNodes = new Map<HTMLDivElement, PricingTableProps | undefined>();
134+
private premountTasksNodes = new Map<HTMLDivElement, undefined>();
134135
// A separate Map of `addListener` method calls to handle multiple listeners.
135136
private premountAddListenerCalls = new Map<
136137
ListenerCallback,
@@ -1050,6 +1051,22 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk {
10501051
}
10511052
};
10521053

1054+
mountTasks = (node: HTMLDivElement) => {
1055+
if (this.clerkjs && this.loaded) {
1056+
this.clerkjs.mountTasks(node);
1057+
} else {
1058+
this.premountTasksNodes.set(node, undefined);
1059+
}
1060+
};
1061+
1062+
unmountTasks = (node: HTMLDivElement) => {
1063+
if (this.clerkjs && this.loaded) {
1064+
this.clerkjs.unmountTasks(node);
1065+
} else {
1066+
this.premountTasksNodes.delete(node);
1067+
}
1068+
};
1069+
10531070
addListener = (listener: ListenerCallback): UnsubscribeCallback => {
10541071
if (this.clerkjs) {
10551072
return this.clerkjs.addListener(listener);

packages/types/src/appearance.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,4 +867,8 @@ export type Appearance<T = Theme> = T & {
867867
* Theme overrides that only apply to the `<Checkout />` component
868868
*/
869869
checkout?: T;
870+
/**
871+
* Theme overrides that only apply to the `<Tasks />` component
872+
*/
873+
tasks?: T;
870874
};

packages/types/src/clerk.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,20 @@ export interface Clerk {
458458
*/
459459
unmountPricingTable: (targetNode: HTMLDivElement) => void;
460460

461+
/**
462+
* Mounts tasks component at the target element.
463+
* @param targetNode Target node to mount the Tasks component.
464+
* @param props configuration parameters.
465+
*/
466+
mountTasks: (targetNode: HTMLDivElement) => void;
467+
/**
468+
* Unmount tasks component from the target element.
469+
* If there is no component mounted at the target node, results in a noop.
470+
*
471+
* @param targetNode Target node to unmount the Tasks component from.
472+
*/
473+
unmountTasks: (targetNode: HTMLDivElement) => void;
474+
461475
/**
462476
* Register a listener that triggers a callback each time important Clerk resources are changed.
463477
* Allows to hook up at different steps in the sign up, sign in processes.

0 commit comments

Comments
 (0)