Skip to content

Commit ef7b024

Browse files
authored
fix(clerk-js): Client trust msg only displayed if no 2FA opts are available (#7313)
1 parent cf66d07 commit ef7b024

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

.changeset/plenty-lights-eat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
---
4+
5+
Ensure client trust messaging is only displayed if no 2FA options are available

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { isUserLockedError } from '@clerk/shared/error';
22
import { useClerk } from '@clerk/shared/react';
33
import type { EmailCodeFactor, PhoneCodeFactor, SignInResource, TOTPFactor } from '@clerk/shared/types';
4-
import React from 'react';
4+
import React, { useMemo } from 'react';
55

66
import { useCardState } from '@/ui/elements/contexts';
77
import type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard';
88
import { VerificationCodeCard } from '@/ui/elements/VerificationCodeCard';
99
import { handleError } from '@/ui/utils/errorHandler';
1010

1111
import { clerkInvalidFAPIResponse } from '../../../core/errors';
12-
import { useCoreSignIn, useSignInContext } from '../../contexts';
12+
import { useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';
1313
import { localizationKeys, Text } from '../../customizables';
1414
import { useSupportEmail } from '../../hooks/useSupportEmail';
1515
import type { LocalizationKey } from '../../localization';
@@ -34,9 +34,8 @@ const isResettingPassword = (resource: SignInResource) =>
3434
isResetPasswordStrategy(resource.firstFactorVerification?.strategy) &&
3535
resource.firstFactorVerification?.status === 'verified';
3636

37-
const isNewDevice = (resource: SignInResource) => resource.clientTrustState === 'new';
38-
3937
export const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => {
38+
const env = useEnvironment();
4039
const signIn = useCoreSignIn();
4140
const card = useCardState();
4241
const { afterSignInUrl, navigateOnSetActive } = useSignInContext();
@@ -45,6 +44,15 @@ export const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) =>
4544
const supportEmail = useSupportEmail();
4645
const clerk = useClerk();
4746

47+
// Only show the new device verification notice if the user is new
48+
// and no attributes are explicitly used for second factor.
49+
const showNewDeviceVerificationNotice = useMemo(() => {
50+
const anyAttributeUsedForSecondFactor = Object.values(env.userSettings.attributes).some(
51+
attr => attr.used_for_second_factor,
52+
);
53+
return signIn.clientTrustState === 'new' && !anyAttributeUsedForSecondFactor;
54+
}, [signIn.clientTrustState, env.userSettings.attributes]);
55+
4856
React.useEffect(() => {
4957
if (props.factorAlreadyPrepared) {
5058
return;
@@ -107,7 +115,7 @@ export const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) =>
107115
cardSubtitle={
108116
isResettingPassword(signIn) ? localizationKeys('signIn.forgotPassword.subtitle') : props.cardSubtitle
109117
}
110-
cardNotice={isNewDevice(signIn) ? localizationKeys('signIn.newDeviceVerificationNotice') : undefined}
118+
cardNotice={showNewDeviceVerificationNotice ? localizationKeys('signIn.newDeviceVerificationNotice') : undefined}
111119
resendButton={props.resendButton}
112120
inputLabel={props.inputLabel}
113121
onCodeEntryFinishedAction={action}

0 commit comments

Comments
 (0)