Skip to content

Commit 9d2e414

Browse files
committed
Send enterprise connection ID on sign-in/sign-up
1 parent bd48187 commit 9d2e414

File tree

7 files changed

+57
-17
lines changed

7 files changed

+57
-17
lines changed

packages/clerk-js/src/ui/common/ChooseEnterpriseConnectionCard.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { InternalTheme, PropsOfComponent } from '@/ui/styledSystem';
88
type ChooseEnterpriseConnectionCardProps = {
99
title: LocalizationKey;
1010
subtitle: LocalizationKey;
11-
onClick: (id: string) => Promise<void>;
11+
onClick: (id: string) => void;
1212
enterpriseConnections: Array<{ id: string; name: string }>;
1313
};
1414

@@ -33,15 +33,15 @@ export const ChooseEnterpriseConnectionCard = ({
3333
<Card.Alert>{card.error}</Card.Alert>
3434

3535
<Grid
36-
elementDescriptor={descriptors.chooseEnterpriseConnectionRoot}
36+
elementDescriptor={descriptors.chooseEnterpriseConnectionsRoot}
3737
gap={2}
3838
>
3939
{enterpriseConnections?.map(({ id, name }) => (
4040
<ChooseEnterpriseConnectionButton
4141
key={id}
4242
id={id}
4343
label={name}
44-
onClick={onClick}
44+
onClick={() => onClick(id)}
4545
isLoading={card.isLoading}
4646
/>
4747
))}

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { ComponentType } from 'react';
22

3-
import { withRedirect } from '@/ui/common';
4-
import { useCoreSignIn, useSignInContext } from '@/ui/contexts';
3+
import { buildSSOCallbackURL, withRedirect } from '@/ui/common';
4+
import { ChooseEnterpriseConnectionCard } from '@/ui/common/ChooseEnterpriseConnectionCard';
5+
import { useCoreSignIn, useEnvironment, useSignInContext } from '@/ui/contexts';
56
import { Flow, localizationKeys } from '@/ui/customizables';
67
import type { AvailableComponentProps } from '@/ui/types';
78

@@ -12,6 +13,8 @@ import { hasMultipleEnterpriseConnections } from './shared';
1213
*/
1314
const SignInChooseEnterpriseConnectionInternal = () => {
1415
const signIn = useCoreSignIn();
16+
const ctx = useSignInContext();
17+
const { displayConfig } = useEnvironment();
1518

1619
if (!hasMultipleEnterpriseConnections(signIn.supportedFirstFactors)) {
1720
// This should not happen due to the HOC guard, but provides type safety
@@ -23,9 +26,18 @@ const SignInChooseEnterpriseConnectionInternal = () => {
2326
name: ff.enterpriseConnectionName,
2427
}));
2528

26-
const handleEnterpriseSSO = (connectionId: string) => {
27-
// TODO - Post sign-in with enterprise connection ID
28-
console.log('Signing in with enterprise connection:', connectionId);
29+
const handleEnterpriseSSO = (enterpriseConnectionId: string) => {
30+
const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);
31+
const redirectUrlComplete = ctx.afterSignInUrl || '/';
32+
33+
return signIn.authenticateWithRedirect({
34+
strategy: 'enterprise_sso',
35+
redirectUrl,
36+
redirectUrlComplete,
37+
oidcPrompt: ctx.oidcPrompt,
38+
continueSignIn: true,
39+
enterpriseConnectionId,
40+
});
2941
};
3042

3143
return (
Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ChooseEnterpriseConnectionCard } from '@/ui/common/ChooseEnterpriseConnectionCard';
2-
import { useCoreSignUp } from '@/ui/contexts';
2+
import { useCoreSignUp, useSignUpContext } from '@/ui/contexts';
33
import { Flow, localizationKeys } from '@/ui/customizables';
44
import { LoadingCard } from '@/ui/elements/LoadingCard';
55
import { useFetch } from '@/ui/hooks';
@@ -9,28 +9,45 @@ import { useFetch } from '@/ui/hooks';
99
*/
1010
export const SignUpChooseEnterpriseConnection = () => {
1111
const signUp = useCoreSignUp();
12+
const ctx = useSignUpContext();
1213
const { data: enterpriseConnections, isLoading } = useFetch(signUp?.__experimental_getEnterpriseConnections, {
1314
signUpId: signUp.id,
1415
});
1516

16-
const handleEnterpriseSSO = (connectionId: string) => {
17-
// TODO - Post sign-up with enterprise connection ID
18-
console.log('Signing up with enterprise connection:', connectionId);
17+
const handleEnterpriseSSO = (enterpriseConnectionId: string) => {
18+
if (!signUp.emailAddress) {
19+
return;
20+
}
21+
22+
const redirectUrl = ctx.ssoCallbackUrl;
23+
const redirectUrlComplete = ctx.afterSignUpUrl || '/';
24+
25+
void signUp.authenticateWithRedirect({
26+
strategy: 'enterprise_sso',
27+
identifier: signUp.emailAddress,
28+
redirectUrl,
29+
redirectUrlComplete,
30+
continueSignUp: true,
31+
enterpriseConnectionId,
32+
});
1933
};
2034

35+
if (!isLoading && !enterpriseConnections?.length) {
36+
return null;
37+
}
38+
2139
return (
22-
/* TODO - Add as a shared component to reuse between sign-in/sign-up */
2340
<Flow.Part part='chooseEnterpriseConnection'>
24-
{isLoading ? (
25-
<LoadingCard />
26-
) : (
41+
{enterpriseConnections?.length ? (
2742
<ChooseEnterpriseConnectionCard
2843
title={localizationKeys('signUp.chooseEnterpriseConnection.title')}
2944
subtitle={localizationKeys('signUp.chooseEnterpriseConnection.subtitle')}
3045
onClick={handleEnterpriseSSO}
3146
enterpriseConnections={enterpriseConnections}
3247
/>
33-
)}
48+
) : isLoading ? (
49+
<LoadingCard />
50+
) : null}
3451
</Flow.Part>
3552
);
3653
};

packages/clerk-js/src/ui/customizables/elementDescriptors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
506506
'subscriptionDetailsDetailRowLabel',
507507
'subscriptionDetailsDetailRowValue',
508508

509+
'chooseEnterpriseConnectionsRoot',
509510
'chooseEnterpriseConnectionButton',
510511
'chooseEnterpriseConnectionButtonText',
511512
] as const).map(camelize) as (keyof ElementsConfig)[];

packages/localizations/src/en-US.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ export const enUS: LocalizationResource = {
806806
title: 'Create your account',
807807
titleCombined: 'Create your account',
808808
},
809+
chooseEnterpriseConnection: {
810+
subtitle: 'Select the enterprise account with which you wish to continue.',
811+
title: 'Choose your enterprise account',
812+
},
809813
},
810814
socialButtonsBlockButton: 'Continue with {{provider|titleize}}',
811815
socialButtonsBlockButtonManyInView: '{{provider|titleize}}',

packages/types/src/appearance.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ export type ElementsConfig = {
641641
subscriptionDetailsDetailRowLabel: WithOptions;
642642
subscriptionDetailsDetailRowValue: WithOptions;
643643

644+
chooseEnterpriseConnectionsRoot: WithOptions;
644645
chooseEnterpriseConnectionButton: WithOptions;
645646
chooseEnterpriseConnectionButtonText: WithOptions;
646647
};

packages/types/src/redirects.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ export type AuthenticateWithRedirectParams = {
9191
* Optional for `oauth_<provider>` or `enterprise_sso` strategies. The value to pass to the [OIDC prompt parameter](https://openid.net/specs/openid-connect-core-1_0.html#:~:text=prompt,reauthentication%20and%20consent.) in the generated OAuth redirect URL.
9292
*/
9393
oidcPrompt?: string;
94+
95+
/**
96+
* @experimental
97+
*/
98+
enterpriseConnectionId?: string;
9499
};
95100

96101
export type AuthenticateWithPopupParams = AuthenticateWithRedirectParams & { popup: Window | null };

0 commit comments

Comments
 (0)