Skip to content

Commit

Permalink
Render select-organization route
Browse files Browse the repository at this point in the history
  • Loading branch information
LauraBeatris committed Feb 18, 2025
1 parent 573b5d5 commit a1c1c39
Show file tree
Hide file tree
Showing 13 changed files with 78 additions and 35 deletions.
19 changes: 19 additions & 0 deletions packages/clerk-js/src/core/clerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ import type {
Web3Provider,
} from '@clerk/types';

import { sessionTaskRoutePaths } from '../ui/common/tasks';
import type { MountComponentRenderer } from '../ui/Components';
import {
ALLOWED_PROTOCOLS,
Expand Down Expand Up @@ -1064,6 +1065,24 @@ export class Clerk implements ClerkInterface {
return this.#authService.decorateUrlWithDevBrowserToken(toURL).href;
}

public buildTaskUrl(): string {
const [pendingTask] = this.session?.tasks ?? [];

if (!pendingTask || !this.environment) {
return '';
}

const signInOrUpUrl = this.#options.signInUrl!;

return buildURL(
{
base: signInOrUpUrl,
hashPath: sessionTaskRoutePaths[pendingTask.key],
},
{ stringify: true },
);
}

public buildSignInUrl(options?: SignInRedirectOptions): string {
return this.#buildUrl(
'signInUrl',
Expand Down
4 changes: 4 additions & 0 deletions packages/clerk-js/src/core/resources/Session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,4 +303,8 @@ export class Session extends BaseResource implements SessionResource {
return token.getRawString() || null;
});
}

get hasPendingTasks() {
return (this.tasks ?? []).length > 0;
}
}
Empty file.
8 changes: 8 additions & 0 deletions packages/clerk-js/src/ui/common/tasks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { SessionTask } from '@clerk/types';

/**
* @internal
*/
export const sessionTaskRoutePaths: Record<SessionTask['key'], string> = {
org: 'select-organization',
};
42 changes: 13 additions & 29 deletions packages/clerk-js/src/ui/components/PendingTask/PendingTask.tsx
Original file line number Diff line number Diff line change
@@ -1,46 +1,30 @@
import { useSessionContext } from '@clerk/shared/react/index';
import type { SessionTask } from '@clerk/types';
import type { ComponentType } from 'react';
import { withRedirectToAfterSignIn } from 'ui/common';

import { Route } from '../../../ui/router';
import { OrganizationListContext } from '../../../ui/contexts';
import { OrganizationList } from '../OrganizationList';

const paths: Record<SessionTask['key'], string> = {
orgs: 'select-organization',
};

const TaskRegistry: Record<SessionTask['key'], ComponentType> = {
orgs: OrganizationList,
org: () => (
<OrganizationListContext.Provider value={{ componentName: 'OrganizationList' }}>
<OrganizationList />
</OrganizationListContext.Provider>
),
};

function usePendingTask() {
/**
* @internal
*/
export function PendingTask(): React.ReactNode {
const session = useSessionContext();

if (!session) {
if (!session?.hasPendingTasks) {
return null;
}

const [pendingTask] = session.tasks ?? [];
const Task = TaskRegistry[pendingTask.key];

return pendingTask;
}

export function _PendingTask() {
const pendingTask = usePendingTask();

if (!pendingTask) {
return null;
}

const Task = TaskRegistry['orgs'];
const path = paths[pendingTask.key];

return (
<Route path={path}>
<Task />
</Route>
);
return <Task />;
}

export const PendingTask = withRedirectToAfterSignIn(_PendingTask);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// todo
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// todo
1 change: 0 additions & 1 deletion packages/clerk-js/src/ui/components/PendingTask/index.ts

This file was deleted.

Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { useSessionContext } from '@clerk/shared/react/index';
import type { Route } from '@clerk/shared/router';
import type { ComponentProps } from 'react';

import { sessionTaskRoutePaths } from '../../../ui/common/tasks';
import { PendingTask } from './PendingTask';

/**
* Maps a session task key to routing props and content
* @internal
*/
export function usePendingTaskRoute(): ComponentProps<typeof Route> | null {
const session = useSessionContext();

if (!session?.hasPendingTasks) {
return null;
}

const [pendingTask] = session.tasks ?? [];

return {
children: <PendingTask />,
path: sessionTaskRoutePaths[pendingTask.key],
};
}
5 changes: 3 additions & 2 deletions packages/clerk-js/src/ui/components/SignIn/SignIn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from '../../contexts';
import { Flow } from '../../customizables';
import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../router';
import { PendingTask } from '../PendingTask';
import { usePendingTaskRoute } from '../PendingTask/usePendingTaskRoute';
import { SignUpContinue } from '../SignUp/SignUpContinue';
import { SignUpSSOCallback } from '../SignUp/SignUpSSOCallback';
import { SignUpStart } from '../SignUp/SignUpStart';
Expand All @@ -39,10 +39,12 @@ function RedirectToSignIn() {
function SignInRoutes(): JSX.Element {
const signInContext = useSignInContext();
const signUpContext = useSignUpContext();
const pendingTaskRoute = usePendingTaskRoute();

return (
<Flow.Root flow='signIn'>
<Switch>
{pendingTaskRoute && <Route {...pendingTaskRoute} />}
<Route path='factor-one'>
<SignInFactorOne />
</Route>
Expand Down Expand Up @@ -139,7 +141,6 @@ function SignInRoutes(): JSX.Element {
<Route>
<RedirectToSignIn />
</Route>
<PendingTask />
</Switch>
</Flow.Root>
);
Expand Down
5 changes: 3 additions & 2 deletions packages/clerk-js/src/ui/components/SignUp/SignUp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { SignUpEmailLinkFlowComplete } from '../../common/EmailLinkCompleteFlowC
import { SignUpContext, useSignUpContext, withCoreSessionSwitchGuard } from '../../contexts';
import { Flow } from '../../customizables';
import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../router';
import { PendingTask } from '../PendingTask';
import { usePendingTaskRoute } from '../PendingTask/usePendingTaskRoute';
import { SignUpContinue } from './SignUpContinue';
import { SignUpSSOCallback } from './SignUpSSOCallback';
import { SignUpStart } from './SignUpStart';
Expand All @@ -23,10 +23,12 @@ function RedirectToSignUp() {

function SignUpRoutes(): JSX.Element {
const signUpContext = useSignUpContext();
const pendingTaskRoute = usePendingTaskRoute();

return (
<Flow.Root flow='signUp'>
<Switch>
{pendingTaskRoute && <Route {...pendingTaskRoute} />}
<Route
path='verify-email-address'
canActivate={clerk => !!clerk.client.signUp.emailAddress}
Expand Down Expand Up @@ -81,7 +83,6 @@ function SignUpRoutes(): JSX.Element {
<Route>
<RedirectToSignUp />
</Route>
<PendingTask />
</Switch>
</Flow.Root>
);
Expand Down
2 changes: 1 addition & 1 deletion packages/clerk-js/src/utils/componentGuards.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export type ComponentGuard = (
) => boolean;

export const sessionExistsAndSingleSessionModeEnabled: ComponentGuard = (clerk, environment) => {
return !!(clerk.session?.status === 'active' && environment?.authConfig.singleSessionMode);
return !!(clerk.isSignedIn && !clerk.session?.hasPendingTasks && environment?.authConfig.singleSessionMode);
};

export const noUserExists: ComponentGuard = clerk => {
Expand Down

0 comments on commit a1c1c39

Please sign in to comment.