11import { isUserLockedError } from '@clerk/shared/error' ;
22import { useClerk } from '@clerk/shared/react' ;
33import type { EmailCodeFactor , PhoneCodeFactor , SignInResource , TOTPFactor } from '@clerk/shared/types' ;
4- import React from 'react' ;
4+ import React , { useMemo } from 'react' ;
55
66import { useCardState } from '@/ui/elements/contexts' ;
77import type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard' ;
88import { VerificationCodeCard } from '@/ui/elements/VerificationCodeCard' ;
99import { handleError } from '@/ui/utils/errorHandler' ;
1010
1111import { clerkInvalidFAPIResponse } from '../../../core/errors' ;
12- import { useCoreSignIn , useSignInContext } from '../../contexts' ;
12+ import { useCoreSignIn , useEnvironment , useSignInContext } from '../../contexts' ;
1313import { localizationKeys , Text } from '../../customizables' ;
1414import { useSupportEmail } from '../../hooks/useSupportEmail' ;
1515import 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-
3937export 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