-
Notifications
You must be signed in to change notification settings - Fork 334
/
Copy pathindex.tsx
92 lines (80 loc) · 2.73 KB
/
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { useClerk } from '@clerk/shared/react';
import { eventComponentMounted } from '@clerk/shared/telemetry';
import type { SessionTask } from '@clerk/types';
import { useCallback, useContext, useEffect } from 'react';
import { SESSION_TASK_ROUTE_BY_KEY } from '../../../core/sessionTasks';
import { OrganizationListContext, SignInContext, SignUpContext } from '../../../ui/contexts';
import { Card, LoadingCardContainer, withCardStateProvider } from '../../../ui/elements';
import {
SessionTasksContext as SessionTasksContext,
useSessionTasksContext,
} from '../../contexts/components/SessionTasks';
import { Route, Switch, useRouter } from '../../router';
import { OrganizationList } from '../OrganizationList';
const SessionTasksStart = withCardStateProvider(() => {
const clerk = useClerk();
const { navigate } = useRouter();
const { redirectUrlComplete } = useSessionTasksContext();
useEffect(() => {
// Simulates additional latency to avoid a abrupt UI transition when navigating to the next task
const timeoutId = setTimeout(() => {
void clerk.__experimental_nextTask({ redirectUrlComplete });
}, 500);
return () => clearTimeout(timeoutId);
}, [navigate, clerk, redirectUrlComplete]);
return (
<Card.Root>
<Card.Content>
<LoadingCardContainer />
</Card.Content>
<Card.Footer />
</Card.Root>
);
});
function SessionTaskRoutes(): JSX.Element {
return (
<Switch>
<Route path={SESSION_TASK_ROUTE_BY_KEY['org']}>
<OrganizationListContext.Provider
value={{
componentName: 'OrganizationList',
skipInvitationScreen: true,
}}
>
<OrganizationList />
</OrganizationListContext.Provider>
</Route>
<Route index>
<SessionTasksStart />
</Route>
</Switch>
);
}
/**
* @internal
*/
export function SessionTask(): JSX.Element {
const clerk = useClerk();
const { navigate } = useRouter();
const signInContext = useContext(SignInContext);
const signUpContext = useContext(SignUpContext);
const redirectUrlComplete =
signInContext?.afterSignInUrl ?? signUpContext?.afterSignUpUrl ?? clerk?.buildAfterSignInUrl();
useEffect(() => {
const task = clerk.session?.currentTask;
if (!task) {
void navigate(redirectUrlComplete);
return;
}
clerk.telemetry?.record(eventComponentMounted('SessionTask', { task: task.key }));
}, [clerk, navigate, redirectUrlComplete]);
const nextTask = useCallback(
() => clerk.__experimental_nextTask({ redirectUrlComplete }),
[clerk, redirectUrlComplete],
);
return (
<SessionTasksContext.Provider value={{ nextTask, redirectUrlComplete }}>
<SessionTaskRoutes />
</SessionTasksContext.Provider>
);
}