Skip to content

Commit 336604a

Browse files
committed
Introduce root route to resolve tasks
1 parent a8a6526 commit 336604a

File tree

9 files changed

+59
-20
lines changed

9 files changed

+59
-20
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function navigateToTask(
3030
const taskRoute = `/tasks/${SESSION_TASK_ROUTE_BY_KEY[routeKey]}`;
3131

3232
if (componentNavigationContext) {
33-
return componentNavigationContext.navigate(componentNavigationContext.indexPath + routeKey);
33+
return componentNavigationContext.navigate(componentNavigationContext.indexPath + taskRoute);
3434
}
3535

3636
const signInUrl = options['signInUrl'] || environment.displayConfig.signInUrl;

packages/clerk-js/src/ui/common/redirects.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { SessionTask } from '@clerk/types';
22

3+
import { SESSION_TASK_ROUTE_BY_KEY } from '../../core/sessionTasks';
34
import { buildURL } from '../../utils/url';
45
import type { SignInContextType, SignUpContextType, UserProfileContextType } from './../contexts';
56

@@ -44,7 +45,7 @@ export function buildSessionTaskRedirectUrl({
4445
routing,
4546
baseUrl,
4647
path,
47-
endpoint: '/tasks',
48+
endpoint: `/tasks/${SESSION_TASK_ROUTE_BY_KEY[task.key]}`,
4849
authQueryString: null,
4950
});
5051
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useOrganizationList, useUser } from '@clerk/shared/react';
22
import { useContext, useState } from 'react';
33

44
import { useEnvironment, useOrganizationListContext } from '../../contexts';
5-
import { SessionTaskContext } from '../../contexts/components/SessionTask';
5+
import { SessionTasksContext } from '../../contexts/components/SessionTasks';
66
import { Box, Col, descriptors, Flex, localizationKeys, Spinner } from '../../customizables';
77
import { Action, Actions, Card, Header, useCardState, withCardStateProvider } from '../../elements';
88
import { useInView } from '../../hooks';
@@ -112,7 +112,7 @@ export const OrganizationListPage = withCardStateProvider(() => {
112112
const OrganizationListFlows = ({ showListInitially }: { showListInitially: boolean }) => {
113113
const { navigateAfterCreateOrganization, skipInvitationScreen, hideSlug } = useOrganizationListContext();
114114
const [isCreateOrganizationFlow, setCreateOrganizationFlow] = useState(!showListInitially);
115-
const sessionTaskContext = useContext(SessionTaskContext);
115+
const sessionTasksContext = useContext(SessionTasksContext);
116116
return (
117117
<>
118118
{!isCreateOrganizationFlow && (
@@ -127,7 +127,7 @@ const OrganizationListFlows = ({ showListInitially }: { showListInitially: boole
127127
>
128128
<CreateOrganizationForm
129129
flow='organizationList'
130-
onComplete={sessionTaskContext?.nextTask}
130+
onComplete={sessionTasksContext?.nextTask}
131131
startPage={{ headerTitle: localizationKeys('organizationList.createOrganization') }}
132132
skipInvitationScreen={skipInvitationScreen}
133133
navigateAfterCreateOrganization={org =>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { OrganizationResource } from '@clerk/types';
33
import { useContext } from 'react';
44

55
import { useOrganizationListContext } from '../../contexts';
6-
import { SessionTaskContext } from '../../contexts/components/SessionTask';
6+
import { SessionTasksContext } from '../../contexts/components/SessionTasks';
77
import { OrganizationPreview, PersonalWorkspacePreview, useCardState, withCardStateProvider } from '../../elements';
88
import { localizationKeys } from '../../localization';
99
import { OrganizationListPreviewButton, sharedMainIdentifierSx } from './shared';
@@ -12,7 +12,7 @@ export const MembershipPreview = withCardStateProvider((props: { organization: O
1212
const card = useCardState();
1313
const { navigateAfterSelectOrganization } = useOrganizationListContext();
1414
const { isLoaded, setActive } = useOrganizationList();
15-
const sessionTaskContext = useContext(SessionTaskContext);
15+
const sessionTasksContext = useContext(SessionTasksContext);
1616

1717
if (!isLoaded) {
1818
return null;
@@ -23,8 +23,8 @@ export const MembershipPreview = withCardStateProvider((props: { organization: O
2323
organization,
2424
});
2525

26-
if (sessionTaskContext?.nextTask) {
27-
return sessionTaskContext?.nextTask();
26+
if (sessionTasksContext?.nextTask) {
27+
return sessionTasksContext?.nextTask();
2828
}
2929

3030
await navigateAfterSelectOrganization(organization);

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

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,54 @@ import type { SessionTask } from '@clerk/types';
44
import { useCallback, useEffect } from 'react';
55

66
import { SESSION_TASK_ROUTE_BY_KEY } from '../../../core/sessionTasks';
7-
import { SessionTaskContext as SessionTaskContext } from '../../contexts/components/SessionTask';
7+
import { Card, LoadingCardContainer, withCardStateProvider } from '../../../ui/elements';
8+
import { SessionTasksContext as SessionTasksContext } from '../../contexts/components/SessionTasks';
89
import { Route, Switch, useRouter } from '../../router';
910
import { LazyOrganizationSelectionTask } from './lazyTasks';
1011
import { usePreloadTasks } from './usePreloadTasks';
1112

13+
const SessionTasksStart = withCardStateProvider(() => {
14+
const clerk = useClerk();
15+
const { navigate } = useRouter();
16+
17+
useEffect(() => {
18+
if (!clerk.session) {
19+
void navigate(clerk.buildSignInUrl());
20+
return;
21+
}
22+
23+
const timeoutId = setTimeout(() => {
24+
void clerk.session?.reload().then(session => {
25+
if (!session.currentTask?.key) {
26+
void navigate(clerk.buildSignInUrl());
27+
return;
28+
}
29+
30+
void navigate(`${SESSION_TASK_ROUTE_BY_KEY[session.currentTask?.key]}`);
31+
});
32+
}, 1000);
33+
return () => clearTimeout(timeoutId);
34+
}, [navigate, clerk]);
35+
36+
return (
37+
<Card.Root>
38+
<Card.Content>
39+
<LoadingCardContainer />
40+
</Card.Content>
41+
<Card.Footer />
42+
</Card.Root>
43+
);
44+
});
45+
1246
function SessionTaskRoutes(): JSX.Element {
1347
return (
1448
<Switch>
1549
<Route path={SESSION_TASK_ROUTE_BY_KEY['org']}>
1650
<LazyOrganizationSelectionTask />
1751
</Route>
52+
<Route index>
53+
<SessionTasksStart />
54+
</Route>
1855
</Switch>
1956
);
2057
}
@@ -23,6 +60,8 @@ function SessionTaskRoutes(): JSX.Element {
2360
* @internal
2461
*/
2562
export function SessionTask({ redirectUrlComplete }: { redirectUrlComplete: string }): JSX.Element {
63+
// TODO - Besides dynamically importing components, also prefetch subresources to avoid cascade of
64+
// requests for each task component
2665
usePreloadTasks();
2766

2867
const { __experimental_nextTask, session, telemetry } = useClerk();
@@ -45,8 +84,8 @@ export function SessionTask({ redirectUrlComplete }: { redirectUrlComplete: stri
4584
);
4685

4786
return (
48-
<SessionTaskContext.Provider value={{ nextTask }}>
87+
<SessionTasksContext.Provider value={{ nextTask }}>
4988
<SessionTaskRoutes />
50-
</SessionTaskContext.Provider>
89+
</SessionTasksContext.Provider>
5190
);
5291
}

packages/clerk-js/src/ui/contexts/components/SessionTask.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createContext } from 'react';
2+
3+
import type { SessionTasksCtx } from '../../types';
4+
5+
export const SessionTasksContext = createContext<SessionTasksCtx | null>(null);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ export const PricingTable = lazy(() =>
9595
componentImportPaths.PricingTable().then(module => ({ default: module.__experimental_PricingTable })),
9696
);
9797

98-
export const preloadSessionTasks = () => import(/* webpackChunkName: "sessionTasks" */ '../components/SessionTasks');
9998
export const SessionTasks = lazy(() =>
10099
componentImportPaths.SessionTasks().then(module => ({ default: module.SessionTask })),
101100
);

packages/clerk-js/src/ui/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ export type __experimental_CheckoutCtx = __experimental_CheckoutProps & {
112112
setIsOpen?: (open: boolean) => void;
113113
};
114114

115-
export type SessionTaskCtx = {
116-
nextTask: () => void;
115+
export type SessionTasksCtx = {
116+
nextTask: () => Promise<void>;
117117
};
118118

119119
export type AvailableComponentCtx =

0 commit comments

Comments
 (0)