Skip to content

Commit b747bf7

Browse files
committed
on session exists, complete sign in
1 parent 3a69292 commit b747bf7

File tree

5 files changed

+39
-6
lines changed

5 files changed

+39
-6
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const ERROR_CODES = {
2727
SAML_USER_ATTRIBUTE_MISSING: 'saml_user_attribute_missing',
2828
USER_LOCKED: 'user_locked',
2929
EXTERNAL_ACCOUNT_NOT_FOUND: 'external_account_not_found',
30+
SESSION_EXISTS: 'session_exists',
3031
SIGN_UP_MODE_RESTRICTED: 'sign_up_mode_restricted',
3132
SIGN_UP_MODE_RESTRICTED_WAITLIST: 'sign_up_restricted_waitlist',
3233
ENTERPRISE_SSO_USER_ATTRIBUTE_MISSING: 'enterprise_sso_user_attribute_missing',

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import { isClerkAPIResponseError } from '@clerk/shared/error';
12
import { useOrganizationList, useUser } from '@clerk/shared/react';
23
import type { OrganizationResource } from '@clerk/shared/types';
34

4-
import { isClerkAPIResponseError } from '@/index.headless';
55
import { sharedMainIdentifierSx } from '@/ui/common/organizations/OrganizationPreview';
66
import { localizationKeys, useLocalizations } from '@/ui/customizables';
77
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';

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

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import type { ClerkAPIError } from '@clerk/shared/error';
2+
import { isClerkAPIResponseError } from '@clerk/shared/error';
13
import { useClerk } from '@clerk/shared/react';
24
import type { PhoneCodeChannel } from '@clerk/shared/types';
35
import React from 'react';
46

5-
import { handleError } from '@/ui/utils/errorHandler';
7+
import { ERROR_CODES } from '@/core/constants';
8+
import { handleError as _handleError } from '@/ui/utils/errorHandler';
69
import { originPrefersPopup } from '@/ui/utils/originPrefersPopup';
710
import { web3CallbackErrorHandler } from '@/ui/utils/web3CallbackErrorHandler';
811

@@ -30,10 +33,29 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps)
3033
const shouldUsePopup = ctx.oauthFlow === 'popup' || (ctx.oauthFlow === 'auto' && originPrefersPopup());
3134
const { onAlternativePhoneCodeProviderClick, ...rest } = props;
3235

36+
const handleError = (err: any) => {
37+
if (isClerkAPIResponseError(err)) {
38+
const sessionAlreadyExistsError: ClerkAPIError | undefined = err.errors.find(
39+
(e: ClerkAPIError) => e.code === ERROR_CODES.SESSION_EXISTS,
40+
);
41+
42+
if (sessionAlreadyExistsError) {
43+
return clerk.setActive({
44+
session: clerk.client.lastActiveSessionId,
45+
navigate: async ({ session }) => {
46+
await ctx.navigateOnSetActive({ session, redirectUrl: ctx.afterSignInUrl });
47+
},
48+
});
49+
}
50+
}
51+
52+
return _handleError(err, [], card.setError);
53+
};
54+
3355
return (
3456
<SocialButtons
3557
{...rest}
36-
showLastAuthenticationStrategy={true}
58+
showLastAuthenticationStrategy
3759
idleAfterDelay={!shouldUsePopup}
3860
oauthCallback={strategy => {
3961
if (shouldUsePopup) {
@@ -50,12 +72,12 @@ export const SignInSocialButtons = React.memo((props: SignInSocialButtonsProps)
5072

5173
return signIn
5274
.authenticateWithPopup({ strategy, redirectUrl, redirectUrlComplete, popup, oidcPrompt: ctx.oidcPrompt })
53-
.catch(err => handleError(err, [], card.setError));
75+
.catch(err => handleError(err));
5476
}
5577

5678
return signIn
5779
.authenticateWithRedirect({ strategy, redirectUrl, redirectUrlComplete, oidcPrompt: ctx.oidcPrompt })
58-
.catch(err => handleError(err, [], card.setError));
80+
.catch(err => handleError(err));
5981
}}
6082
web3Callback={strategy => {
6183
return clerk

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,9 @@ function SignInStartInternal(): JSX.Element {
432432
e.code === ERROR_CODES.FORM_PASSWORD_PWNED,
433433
);
434434

435+
const sessionAlreadyExistsError: ClerkAPIError = e.errors.find(
436+
(e: ClerkAPIError) => e.code === ERROR_CODES.SESSION_EXISTS,
437+
);
435438
const alreadySignedInError: ClerkAPIError = e.errors.find(
436439
(e: ClerkAPIError) => e.code === 'identifier_already_signed_in',
437440
);
@@ -442,6 +445,13 @@ function SignInStartInternal(): JSX.Element {
442445

443446
if (instantPasswordError) {
444447
await signInWithFields(identifierField);
448+
} else if (sessionAlreadyExistsError) {
449+
await clerk.setActive({
450+
session: clerk.client.lastActiveSessionId,
451+
navigate: async ({ session }) => {
452+
await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });
453+
},
454+
});
445455
} else if (alreadySignedInError) {
446456
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
447457
const sid = alreadySignedInError.meta!.sessionId!;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { getAlternativePhoneCodeProviderData } from '@clerk/shared/alternativePhoneCode';
2+
import { isClerkAPIResponseError } from '@clerk/shared/error';
23
import { useClerk } from '@clerk/shared/react';
34
import type { PhoneCodeChannel, PhoneCodeChannelData, SignUpResource } from '@clerk/shared/types';
45
import React from 'react';
56

6-
import { isClerkAPIResponseError } from '@/index.headless';
77
import { Card } from '@/ui/elements/Card';
88
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
99
import { Header } from '@/ui/elements/Header';

0 commit comments

Comments
 (0)