Skip to content

Commit 52d20e2

Browse files
committed
chore: cherry-pick client trust msg fix for 2FA
1 parent 2515f93 commit 52d20e2

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

packages/ui/src/components/SignIn/SignInFactorTwoCodeForm.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { isUserLockedError } from '@clerk/shared/error';
22
import { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';
33
import { useClerk } from '@clerk/shared/react';
44
import type { EmailCodeFactor, PhoneCodeFactor, SignInResource, TOTPFactor } from '@clerk/shared/types';
5-
import React from 'react';
5+
import React, { useMemo } from 'react';
66

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

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)