@clerk/ui 1.0.0-snapshot.v20251208202852 → 1.0.0-snapshot.v20251215203425
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{207_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 207_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{217_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 217_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{360_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 360_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{444_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 444_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{573_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 573_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{970_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 970_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/ClerkUi.js +2 -2
- package/dist/Components.js +7 -0
- package/dist/Components.js.map +1 -1
- package/dist/{apiKeys_ui_03abd0_1.0.0-snapshot.v20251208202852.js → apiKeys_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{checkout_ui_03abd0_1.0.0-snapshot.v20251208202852.js → checkout_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +2 -2
- package/dist/common/EmailLinkVerify.js +1 -1
- package/dist/common/Gate.js +1 -1
- package/dist/common/RemoveResourceForm.js +1 -1
- package/dist/common/SSOCallback.js +1 -1
- package/dist/common/withRedirect.js +1 -1
- package/dist/components/APIKeys/APIKeys.js +1 -1
- package/dist/components/APIKeys/RevokeAPIKeyConfirmationModal.js +1 -1
- package/dist/components/Checkout/CheckoutComplete.js +1 -1
- package/dist/components/Checkout/CheckoutForm.js +1 -1
- package/dist/components/Checkout/CheckoutPage.js +1 -1
- package/dist/components/Checkout/parts.js +1 -1
- package/dist/components/CreateOrganization/CreateOrganizationForm.js +1 -1
- package/dist/components/CreateOrganization/CreateOrganizationPage.js +1 -1
- package/dist/components/ImpersonationFab/index.js +1 -1
- package/dist/components/OAuthConsent/OAuthConsent.js +1 -1
- package/dist/components/OrganizationList/UserInvitationList.js +1 -1
- package/dist/components/OrganizationList/UserMembershipList.js +1 -1
- package/dist/components/OrganizationList/UserSuggestionList.js +1 -1
- package/dist/components/OrganizationProfile/ActionConfirmationPage.js +1 -1
- package/dist/components/OrganizationProfile/ActiveMembersList.js +1 -1
- package/dist/components/OrganizationProfile/AddDomainForm.js +1 -1
- package/dist/components/OrganizationProfile/DomainList.js +1 -1
- package/dist/components/OrganizationProfile/InviteMembersForm.js +3 -3
- package/dist/components/OrganizationProfile/InviteMembersForm.js.map +1 -1
- package/dist/components/OrganizationProfile/InviteMembersScreen.js +1 -1
- package/dist/components/OrganizationProfile/InvitedMembersList.js +1 -1
- package/dist/components/OrganizationProfile/MembersSearch.js.map +1 -1
- package/dist/components/OrganizationProfile/OrganizationAPIKeysPage.js +1 -1
- package/dist/components/OrganizationProfile/OrganizationGeneralPage.js +1 -1
- package/dist/components/OrganizationProfile/OrganizationMembers.js +1 -1
- package/dist/components/OrganizationProfile/OrganizationProfileNavbar.js +1 -1
- package/dist/components/OrganizationProfile/ProfileForm.js +1 -1
- package/dist/components/OrganizationProfile/RemoveDomainForm.js +1 -1
- package/dist/components/OrganizationProfile/RequestToJoinList.js +1 -1
- package/dist/components/OrganizationProfile/VerifiedDomainForm.js +1 -1
- package/dist/components/OrganizationProfile/VerifyDomainForm.js +1 -1
- package/dist/components/OrganizationProfile/index.js +1 -1
- package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js +6 -3
- package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js.map +1 -1
- package/dist/components/OrganizationSwitcher/OrganizationSwitcherTrigger.js +1 -1
- package/dist/components/OrganizationSwitcher/UserInvitationSuggestionList.js +1 -1
- package/dist/components/OrganizationSwitcher/UserMembershipList.js +1 -1
- package/dist/components/PaymentMethods/AddPaymentMethod.js +1 -1
- package/dist/components/PaymentMethods/PaymentMethods.js +1 -1
- package/dist/components/PricingTable/PricingTable.js +3 -2
- package/dist/components/PricingTable/PricingTable.js.map +1 -1
- package/dist/components/PricingTable/PricingTableDefault.js +1 -1
- package/dist/components/SessionTasks/index.js +1 -1
- package/dist/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.js +1 -1
- package/dist/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.js +1 -1
- package/dist/components/SessionTasks/tasks/TaskChooseOrganization/index.js +1 -1
- package/dist/components/SessionTasks/tasks/TaskResetPassword/index.js +2 -2
- package/dist/components/SessionTasks/tasks/TaskResetPassword/index.js.map +1 -1
- package/dist/components/SignIn/ResetPassword.js +1 -0
- package/dist/components/SignIn/ResetPassword.js.map +1 -1
- package/dist/components/SignIn/SignInClientTrust.js +49 -0
- package/dist/components/SignIn/SignInClientTrust.js.map +1 -0
- package/dist/components/SignIn/SignInFactorOne.js +1 -1
- package/dist/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.js +1 -1
- package/dist/components/SignIn/SignInFactorOneCodeForm.js +1 -1
- package/dist/components/SignIn/SignInFactorOneEmailLinkCard.js +1 -1
- package/dist/components/SignIn/SignInFactorOnePasswordCard.js +4 -3
- package/dist/components/SignIn/SignInFactorOnePasswordCard.js.map +1 -1
- package/dist/components/SignIn/SignInFactorTwo.js +3 -22
- package/dist/components/SignIn/SignInFactorTwo.js.map +1 -1
- package/dist/components/SignIn/SignInFactorTwoBackupCodeCard.js +1 -1
- package/dist/components/SignIn/SignInFactorTwoCodeForm.js +3 -3
- package/dist/components/SignIn/SignInFactorTwoCodeForm.js.map +1 -1
- package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js +2 -2
- package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js.map +1 -1
- package/dist/components/SignIn/SignInSocialButtons.js +1 -1
- package/dist/components/SignIn/SignInStart.js +3 -1
- package/dist/components/SignIn/SignInStart.js.map +1 -1
- package/dist/components/SignIn/index.js +6 -1
- package/dist/components/SignIn/index.js.map +1 -1
- package/dist/components/SignIn/shared.js +1 -1
- package/dist/components/SignIn/useSecondFactorSelection.js +35 -0
- package/dist/components/SignIn/useSecondFactorSelection.js.map +1 -0
- package/dist/components/SignUp/SignUpContinue.js +1 -1
- package/dist/components/SignUp/SignUpEmailLinkCard.js +1 -1
- package/dist/components/SignUp/SignUpRestrictedAccess.js +1 -1
- package/dist/components/SignUp/SignUpSocialButtons.js +1 -1
- package/dist/components/SignUp/SignUpStart.js +1 -1
- package/dist/components/SignUp/SignUpVerificationCodeForm.js +1 -1
- package/dist/components/SignUp/index.js +1 -1
- package/dist/components/SubscriptionDetails/index.js +1 -1
- package/dist/components/UserButton/UserButtonPopover.js +1 -1
- package/dist/components/UserButton/UserButtonTopLevelIdentifier.js +1 -1
- package/dist/components/UserButton/UserButtonTrigger.js +1 -1
- package/dist/components/UserButton/useMultisessionActions.js +7 -2
- package/dist/components/UserButton/useMultisessionActions.js.map +1 -1
- package/dist/components/UserProfile/APIKeysPage.js +1 -1
- package/dist/components/UserProfile/AccountPage.js +1 -1
- package/dist/components/UserProfile/ActiveDevicesSection.js +1 -1
- package/dist/components/UserProfile/AddAuthenticatorApp.js +1 -1
- package/dist/components/UserProfile/ConnectedAccountsMenu.js +1 -1
- package/dist/components/UserProfile/ConnectedAccountsSection.js +1 -1
- package/dist/components/UserProfile/DeleteUserForm.js +1 -1
- package/dist/components/UserProfile/EmailForm.js +1 -1
- package/dist/components/UserProfile/EmailsSection.js +1 -1
- package/dist/components/UserProfile/EnterpriseAccountsSection.js +1 -1
- package/dist/components/UserProfile/MfaBackupCodeCreateForm.js +1 -1
- package/dist/components/UserProfile/MfaBackupCodeList.js +1 -1
- package/dist/components/UserProfile/MfaForm.js +1 -1
- package/dist/components/UserProfile/MfaPhoneCodeScreen.js +1 -1
- package/dist/components/UserProfile/MfaSection.js +1 -1
- package/dist/components/UserProfile/PasskeySection.js +1 -1
- package/dist/components/UserProfile/PasswordForm.js +2 -1
- package/dist/components/UserProfile/PasswordForm.js.map +1 -1
- package/dist/components/UserProfile/PasswordSection.js +1 -1
- package/dist/components/UserProfile/PhoneForm.js +1 -1
- package/dist/components/UserProfile/PhoneSection.js +1 -1
- package/dist/components/UserProfile/ProfileForm.js +1 -1
- package/dist/components/UserProfile/RemoveResourceForm.js +1 -1
- package/dist/components/UserProfile/SecurityPage.js +1 -1
- package/dist/components/UserProfile/UserProfileSection.js +1 -1
- package/dist/components/UserProfile/UsernameForm.js +1 -1
- package/dist/components/UserProfile/UsernameSection.js +1 -1
- package/dist/components/UserProfile/VerifyTOTP.js +1 -1
- package/dist/components/UserProfile/Web3Form.js +1 -1
- package/dist/components/UserProfile/Web3Section.js +1 -1
- package/dist/components/UserVerification/UVFactorOneCodeForm.js +1 -1
- package/dist/components/UserVerification/UVFactorOnePasskeysCard.js +1 -1
- package/dist/components/UserVerification/UVFactorTwoBackupCodeCard.js +1 -1
- package/dist/components/UserVerification/UVFactorTwoCodeForm.js +1 -1
- package/dist/components/UserVerification/UVFactorTwoPhoneCodeCard.js +1 -1
- package/dist/components/UserVerification/UserVerificationFactorOnePassword.js +1 -1
- package/dist/components/UserVerification/UserVerificationFactorTwo.js +4 -20
- package/dist/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
- package/dist/components/UserVerification/useUserVerificationSession.js +1 -1
- package/dist/components/Waitlist/WaitlistForm.js +1 -1
- package/dist/components/Waitlist/index.js +1 -1
- package/dist/components/devPrompts/EnableOrganizationsPrompt/index.js +1 -1
- package/dist/components/devPrompts/KeylessPrompt/index.js +1 -1
- package/dist/contexts/CoreClerkContextWrapper.js +1 -1
- package/dist/contexts/CoreSessionContext.js +1 -1
- package/dist/contexts/CoreUserContext.js +1 -1
- package/dist/{createorganization_ui_03abd0_1.0.0-snapshot.v20251208202852.js → createorganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/customizables/AppearanceContext.js +1 -1
- package/dist/elements/Action/ActionRoot.js +1 -1
- package/dist/elements/AvatarUploader.js +14 -4
- package/dist/elements/AvatarUploader.js.map +1 -1
- package/dist/elements/CodeControl.js +1 -1
- package/dist/elements/Drawer.js +8 -2
- package/dist/elements/Drawer.js.map +1 -1
- package/dist/elements/Form.js +1 -1
- package/dist/elements/Menu.js +1 -1
- package/dist/elements/Modal.js +3 -2
- package/dist/elements/Modal.js.map +1 -1
- package/dist/elements/Navbar.js +1 -1
- package/dist/elements/PhoneInput/countryCodeData.js +34 -9
- package/dist/elements/PhoneInput/countryCodeData.js.map +1 -1
- package/dist/elements/PhoneInput/index.js +1 -1
- package/dist/elements/Popover.js +4 -1
- package/dist/elements/Popover.js.map +1 -1
- package/dist/elements/Select.js +1 -1
- package/dist/elements/SocialButtons.js +1 -1
- package/dist/elements/Tabs.js +1 -1
- package/dist/elements/TimerButton.js +1 -1
- package/dist/elements/Tooltip.js +29 -24
- package/dist/elements/Tooltip.js.map +1 -1
- package/dist/elements/contexts/index.js +1 -1
- package/dist/{enableOrganizationsPrompt_ui_03abd0_1.0.0-snapshot.v20251208202852.js → enableOrganizationsPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/foundations/defaultFoundations.d.ts +153 -153
- package/dist/hooks/useFetchRoles.js.map +1 -1
- package/dist/{impersonationfab_ui_03abd0_1.0.0-snapshot.v20251208202852.js → impersonationfab_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/index.js +2 -2
- package/dist/internal/index.js.map +1 -1
- package/dist/{keylessPrompt_ui_03abd0_1.0.0-snapshot.v20251208202852.js → keylessPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/lazyModules/MountedCheckoutDrawer.js +1 -1
- package/dist/lazyModules/MountedPlanDetailDrawer.js +1 -1
- package/dist/lazyModules/MountedSubscriptionDetailDrawer.js +1 -1
- package/dist/lazyModules/components.d.ts +20 -20
- package/dist/lazyModules/providers.js +24 -17
- package/dist/lazyModules/providers.js.map +1 -1
- package/dist/{oauthConsent_ui_03abd0_1.0.0-snapshot.v20251208202852.js → oauthConsent_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{onetap_ui_03abd0_1.0.0-snapshot.v20251208202852.js → onetap_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{op-api-keys-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → op-api-keys-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{organizationlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → organizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/organizationprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
- package/dist/organizationswitcher_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
- package/dist/{payment-attempt-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → payment-attempt-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{planDetails_ui_03abd0_1.0.0-snapshot.v20251208202852.js → planDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{prefetchorganizationlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → prefetchorganizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{pricingTable_ui_03abd0_1.0.0-snapshot.v20251208202852.js → pricingTable_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/primitives/hooks/useFormField.js +1 -1
- package/dist/{revoke-api-key-modal_ui_03abd0_1.0.0-snapshot.v20251208202852.js → revoke-api-key-modal_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/router/BaseRouter.js +1 -1
- package/dist/router/PathRouter.js +1 -1
- package/dist/router/Route.js +1 -1
- package/dist/router/VirtualRouter.js +1 -1
- package/dist/{sessionTasks_ui_03abd0_1.0.0-snapshot.v20251208202852.js → sessionTasks_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/signin_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
- package/dist/{signup_ui_03abd0_1.0.0-snapshot.v20251208202852.js → signup_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{statement-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → statement-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{subscriptionDetails_ui_03abd0_1.0.0-snapshot.v20251208202852.js → subscriptionDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{taskChooseOrganization_ui_03abd0_1.0.0-snapshot.v20251208202852.js → taskChooseOrganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/taskResetPassword_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
- package/dist/ui-common_ui_e1841e_1.0.0-snapshot.v20251215203425.js +122 -0
- package/dist/ui.browser.js +20 -3
- package/dist/{up-api-keys-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → up-api-keys-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{useravatar_ui_03abd0_1.0.0-snapshot.v20251208202852.js → useravatar_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{userbutton_ui_03abd0_1.0.0-snapshot.v20251208202852.js → userbutton_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/dist/{userprofile_ui_03abd0_1.0.0-snapshot.v20251208202852.js → userprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +2 -2
- package/dist/userverification_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
- package/dist/vendors_ui_e1841e_1.0.0-snapshot.v20251215203425.js +20 -0
- package/dist/{waitlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → waitlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
- package/package.json +5 -4
- package/dist/organizationprofile_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
- package/dist/organizationswitcher_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
- package/dist/signin_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
- package/dist/taskResetPassword_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
- package/dist/ui-common_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -139
- package/dist/userverification_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
- package/dist/vendors_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -20
- /package/dist/{blankcaptcha_ui_03abd0_1.0.0-snapshot.v20251208202852.js → blankcaptcha_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_03abd0_1.0.0-snapshot.v20251208202852.js → copy-api-key-modal_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{framework_ui_03abd0_1.0.0-snapshot.v20251208202852.js → framework_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{op-billing-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → op-billing-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{op-plans-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → op-plans-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{up-billing-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → up-billing-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
- /package/dist/{up-plans-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → up-plans-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResetPassword.js","names":["e: any"],"sources":["../../../src/components/SignIn/ResetPassword.tsx"],"sourcesContent":["import { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { createPasswordError } from '@/ui/utils/passwordUtils';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { useCoreSignIn, useEnvironment } from '../../contexts';\nimport { Col, descriptors, localizationKeys, useLocalizations } from '../../customizables';\nimport { useConfirmPassword } from '../../hooks';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router';\n\nconst ResetPasswordInternal = () => {\n const signIn = useCoreSignIn();\n const card = useCardState();\n const { navigate } = useRouter();\n const supportEmail = useSupportEmail();\n const {\n userSettings: { passwordSettings },\n } = useEnvironment();\n\n const { t, locale } = useLocalizations();\n\n const requiresNewPassword =\n signIn.status === 'needs_new_password' &&\n signIn.firstFactorVerification.strategy !== 'reset_password_email_code' &&\n signIn.firstFactorVerification.strategy !== 'reset_password_phone_code';\n\n React.useEffect(() => {\n if (requiresNewPassword) {\n card.setError(t(localizationKeys('signIn.resetPassword.requiredMessage')));\n }\n }, []);\n\n const passwordField = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__newPassword'),\n isRequired: true,\n validatePassword: true,\n buildErrorMessage: errors => createPasswordError(errors, { t, locale, passwordSettings }),\n });\n\n const confirmField = useFormControl('confirmPassword', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__confirmPassword'),\n isRequired: true,\n });\n\n const sessionsField = useFormControl('signOutOfOtherSessions', '', {\n type: 'checkbox',\n label: localizationKeys('formFieldLabel__signOutOfOtherSessions'),\n defaultChecked: true,\n });\n\n const { setConfirmPasswordFeedback, isPasswordMatch } = useConfirmPassword({\n passwordField,\n confirmPasswordField: confirmField,\n });\n\n const canSubmit = isPasswordMatch;\n\n const validateForm = () => {\n if (passwordField.value) {\n setConfirmPasswordFeedback(confirmField.value);\n }\n };\n\n const resetPassword = async () => {\n passwordField.clearFeedback();\n confirmField.clearFeedback();\n try {\n const { status, createdSessionId } = await signIn.resetPassword({\n password: passwordField.value,\n signOutOfOtherSessions: sessionsField.checked,\n });\n\n switch (status) {\n case 'complete':\n if (createdSessionId) {\n const queryParams = new URLSearchParams();\n queryParams.set('createdSessionId', createdSessionId);\n return navigate(`../reset-password-success?${queryParams.toString()}`);\n }\n return console.error(clerkInvalidFAPIResponse(status, supportEmail));\n case 'needs_second_factor':\n return navigate('../factor-two');\n default:\n return console.error(clerkInvalidFAPIResponse(status, supportEmail));\n }\n } catch (e: any) {\n return handleError(e, [passwordField, confirmField], card.setError);\n }\n };\n\n const goBack = () => {\n return navigate('../');\n };\n\n return (\n <Card.Root>\n <Card.Content>\n <Header.Root showLogo>\n <Header.Title localizationKey={localizationKeys('signIn.resetPassword.title')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n <Col\n elementDescriptor={descriptors.main}\n gap={8}\n >\n <Form.Root\n onSubmit={resetPassword}\n onBlur={validateForm}\n gap={8}\n >\n <Col gap={6}>\n {/* For password managers */}\n <input\n readOnly\n data-testid='hidden-identifier'\n id='identifier-field'\n name='identifier'\n value={signIn.identifier || ''}\n style={{ display: 'none' }}\n />\n <Form.ControlRow elementId={passwordField.id}>\n <Form.PasswordInput\n {...passwordField.props}\n isRequired\n autoFocus\n />\n </Form.ControlRow>\n <Form.ControlRow elementId={confirmField.id}>\n <Form.PasswordInput\n {...confirmField.props}\n onChange={e => {\n if (e.target.value) {\n setConfirmPasswordFeedback(e.target.value);\n }\n return confirmField.props.onChange(e);\n }}\n />\n </Form.ControlRow>\n {!requiresNewPassword && (\n <Form.ControlRow elementId={sessionsField.id}>\n <Form.Checkbox {...sessionsField.props} />\n </Form.ControlRow>\n )}\n </Col>\n <Col gap={3}>\n <Form.SubmitButton\n isDisabled={!canSubmit}\n localizationKey={localizationKeys('signIn.resetPassword.formButtonPrimary')}\n />\n <Card.Action elementId='alternativeMethods'>\n <Card.ActionLink\n elementDescriptor={descriptors.backLink}\n localizationKey={localizationKeys('backButton')}\n onClick={goBack}\n />\n </Card.Action>\n </Col>\n </Form.Root>\n </Col>\n </Card.Content>\n <Card.Footer />\n </Card.Root>\n );\n};\n\nexport const ResetPassword = withCardStateProvider(ResetPasswordInternal);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResetPassword.js","names":["e: any"],"sources":["../../../src/components/SignIn/ResetPassword.tsx"],"sourcesContent":["import { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { createPasswordError } from '@/ui/utils/passwordUtils';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { useCoreSignIn, useEnvironment } from '../../contexts';\nimport { Col, descriptors, localizationKeys, useLocalizations } from '../../customizables';\nimport { useConfirmPassword } from '../../hooks';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router';\n\nconst ResetPasswordInternal = () => {\n const signIn = useCoreSignIn();\n const card = useCardState();\n const { navigate } = useRouter();\n const supportEmail = useSupportEmail();\n const {\n userSettings: { passwordSettings },\n } = useEnvironment();\n\n const { t, locale } = useLocalizations();\n\n const requiresNewPassword =\n signIn.status === 'needs_new_password' &&\n signIn.firstFactorVerification.strategy !== 'reset_password_email_code' &&\n signIn.firstFactorVerification.strategy !== 'reset_password_phone_code';\n\n React.useEffect(() => {\n if (requiresNewPassword) {\n card.setError(t(localizationKeys('signIn.resetPassword.requiredMessage')));\n }\n }, []);\n\n const passwordField = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__newPassword'),\n isRequired: true,\n validatePassword: true,\n buildErrorMessage: errors => createPasswordError(errors, { t, locale, passwordSettings }),\n });\n\n const confirmField = useFormControl('confirmPassword', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__confirmPassword'),\n isRequired: true,\n });\n\n const sessionsField = useFormControl('signOutOfOtherSessions', '', {\n type: 'checkbox',\n label: localizationKeys('formFieldLabel__signOutOfOtherSessions'),\n defaultChecked: true,\n });\n\n const { setConfirmPasswordFeedback, isPasswordMatch } = useConfirmPassword({\n passwordField,\n confirmPasswordField: confirmField,\n });\n\n const canSubmit = isPasswordMatch;\n\n const validateForm = () => {\n if (passwordField.value) {\n setConfirmPasswordFeedback(confirmField.value);\n }\n };\n\n const resetPassword = async () => {\n if (!canSubmit) {\n return;\n }\n\n passwordField.clearFeedback();\n confirmField.clearFeedback();\n try {\n const { status, createdSessionId } = await signIn.resetPassword({\n password: passwordField.value,\n signOutOfOtherSessions: sessionsField.checked,\n });\n\n switch (status) {\n case 'complete':\n if (createdSessionId) {\n const queryParams = new URLSearchParams();\n queryParams.set('createdSessionId', createdSessionId);\n return navigate(`../reset-password-success?${queryParams.toString()}`);\n }\n return console.error(clerkInvalidFAPIResponse(status, supportEmail));\n case 'needs_second_factor':\n return navigate('../factor-two');\n default:\n return console.error(clerkInvalidFAPIResponse(status, supportEmail));\n }\n } catch (e: any) {\n return handleError(e, [passwordField, confirmField], card.setError);\n }\n };\n\n const goBack = () => {\n return navigate('../');\n };\n\n return (\n <Card.Root>\n <Card.Content>\n <Header.Root showLogo>\n <Header.Title localizationKey={localizationKeys('signIn.resetPassword.title')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n <Col\n elementDescriptor={descriptors.main}\n gap={8}\n >\n <Form.Root\n onSubmit={resetPassword}\n onBlur={validateForm}\n gap={8}\n >\n <Col gap={6}>\n {/* For password managers */}\n <input\n readOnly\n data-testid='hidden-identifier'\n id='identifier-field'\n name='identifier'\n value={signIn.identifier || ''}\n style={{ display: 'none' }}\n />\n <Form.ControlRow elementId={passwordField.id}>\n <Form.PasswordInput\n {...passwordField.props}\n isRequired\n autoFocus\n />\n </Form.ControlRow>\n <Form.ControlRow elementId={confirmField.id}>\n <Form.PasswordInput\n {...confirmField.props}\n onChange={e => {\n if (e.target.value) {\n setConfirmPasswordFeedback(e.target.value);\n }\n return confirmField.props.onChange(e);\n }}\n />\n </Form.ControlRow>\n {!requiresNewPassword && (\n <Form.ControlRow elementId={sessionsField.id}>\n <Form.Checkbox {...sessionsField.props} />\n </Form.ControlRow>\n )}\n </Col>\n <Col gap={3}>\n <Form.SubmitButton\n isDisabled={!canSubmit}\n localizationKey={localizationKeys('signIn.resetPassword.formButtonPrimary')}\n />\n <Card.Action elementId='alternativeMethods'>\n <Card.ActionLink\n elementDescriptor={descriptors.backLink}\n localizationKey={localizationKeys('backButton')}\n onClick={goBack}\n />\n </Card.Action>\n </Col>\n </Form.Root>\n </Col>\n </Card.Content>\n <Card.Footer />\n </Card.Root>\n );\n};\n\nexport const ResetPassword = withCardStateProvider(ResetPasswordInternal);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { useCoreSignIn } from "../../contexts/CoreClientContext.js";
|
|
2
|
+
import { withCardStateProvider } from "../../elements/contexts/index.js";
|
|
3
|
+
import { LoadingCard } from "../../elements/LoadingCard.js";
|
|
4
|
+
import { withRedirectToAfterSignIn, withRedirectToSignInTask } from "../../common/withRedirect.js";
|
|
5
|
+
import { SignInFactorTwoAlternativeMethods } from "./SignInFactorTwoAlternativeMethods.js";
|
|
6
|
+
import { SignInFactorTwoEmailCodeCard } from "./SignInFactorTwoEmailCodeCard.js";
|
|
7
|
+
import { SignInFactorTwoEmailLinkCard } from "./SignInFactorTwoEmailLinkCard.js";
|
|
8
|
+
import { SignInFactorTwoPhoneCodeCard } from "./SignInFactorTwoPhoneCodeCard.js";
|
|
9
|
+
import { useSecondFactorSelection } from "./useSecondFactorSelection.js";
|
|
10
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
11
|
+
|
|
12
|
+
//#region src/components/SignIn/SignInClientTrust.tsx
|
|
13
|
+
function SignInClientTrustInternal() {
|
|
14
|
+
const { currentFactor, factorAlreadyPrepared, handleFactorPrepare, selectFactor, showAllStrategies, toggleAllStrategies } = useSecondFactorSelection(useCoreSignIn().supportedSecondFactors);
|
|
15
|
+
if (!currentFactor) return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
16
|
+
if (showAllStrategies) return /* @__PURE__ */ jsx(SignInFactorTwoAlternativeMethods, {
|
|
17
|
+
onBackLinkClick: toggleAllStrategies,
|
|
18
|
+
onFactorSelected: selectFactor
|
|
19
|
+
});
|
|
20
|
+
switch (currentFactor?.strategy) {
|
|
21
|
+
case "phone_code": return /* @__PURE__ */ jsx(SignInFactorTwoPhoneCodeCard, {
|
|
22
|
+
showClientTrustNotice: true,
|
|
23
|
+
factorAlreadyPrepared,
|
|
24
|
+
onFactorPrepare: handleFactorPrepare,
|
|
25
|
+
factor: currentFactor,
|
|
26
|
+
onShowAlternativeMethodsClicked: toggleAllStrategies
|
|
27
|
+
});
|
|
28
|
+
case "email_code": return /* @__PURE__ */ jsx(SignInFactorTwoEmailCodeCard, {
|
|
29
|
+
showClientTrustNotice: true,
|
|
30
|
+
factorAlreadyPrepared,
|
|
31
|
+
onFactorPrepare: handleFactorPrepare,
|
|
32
|
+
factor: currentFactor,
|
|
33
|
+
onShowAlternativeMethodsClicked: toggleAllStrategies
|
|
34
|
+
});
|
|
35
|
+
case "email_link": return /* @__PURE__ */ jsx(SignInFactorTwoEmailLinkCard, {
|
|
36
|
+
showClientTrustNotice: true,
|
|
37
|
+
factorAlreadyPrepared,
|
|
38
|
+
onFactorPrepare: handleFactorPrepare,
|
|
39
|
+
factor: currentFactor,
|
|
40
|
+
onShowAlternativeMethodsClicked: toggleAllStrategies
|
|
41
|
+
});
|
|
42
|
+
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const SignInClientTrust = withRedirectToSignInTask(withRedirectToAfterSignIn(withCardStateProvider(SignInClientTrustInternal)));
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
export { SignInClientTrust };
|
|
49
|
+
//# sourceMappingURL=SignInClientTrust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignInClientTrust.js","names":[],"sources":["../../../src/components/SignIn/SignInClientTrust.tsx"],"sourcesContent":["import { withCardStateProvider } from '@/ui/elements/contexts';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { withRedirectToAfterSignIn, withRedirectToSignInTask } from '../../common';\nimport { useCoreSignIn } from '../../contexts';\nimport { SignInFactorTwoAlternativeMethods } from './SignInFactorTwoAlternativeMethods';\nimport { SignInFactorTwoEmailCodeCard } from './SignInFactorTwoEmailCodeCard';\nimport { SignInFactorTwoEmailLinkCard } from './SignInFactorTwoEmailLinkCard';\nimport { SignInFactorTwoPhoneCodeCard } from './SignInFactorTwoPhoneCodeCard';\nimport { useSecondFactorSelection } from './useSecondFactorSelection';\n\nfunction SignInClientTrustInternal(): JSX.Element {\n const signIn = useCoreSignIn();\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection(signIn.supportedSecondFactors);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies) {\n return (\n <SignInFactorTwoAlternativeMethods\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <SignInFactorTwoPhoneCodeCard\n showClientTrustNotice\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n case 'email_code':\n return (\n <SignInFactorTwoEmailCodeCard\n showClientTrustNotice\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n case 'email_link':\n return (\n <SignInFactorTwoEmailLinkCard\n showClientTrustNotice\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n default:\n return <LoadingCard />;\n }\n}\n\nexport const SignInClientTrust = withRedirectToSignInTask(\n withRedirectToAfterSignIn(withCardStateProvider(SignInClientTrustInternal)),\n);\n"],"mappings":";;;;;;;;;;;;AAWA,SAAS,4BAAyC;CAEhD,MAAM,EACJ,eACA,uBACA,qBACA,cACA,mBACA,wBACE,yBARW,eAAe,CAQM,uBAAuB;AAE3D,KAAI,CAAC,cACH,QAAO,oBAAC,gBAAc;AAGxB,KAAI,kBACF,QACE,oBAAC;EACC,iBAAiB;EACjB,kBAAkB;GAClB;AAIN,SAAQ,eAAe,UAAvB;EACE,KAAK,aACH,QACE,oBAAC;GACC;GACuB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,KAAK,aACH,QACE,oBAAC;GACC;GACuB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,KAAK,aACH,QACE,oBAAC;GACC;GACuB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,QACE,QAAO,oBAAC,gBAAc;;;AAI5B,MAAa,oBAAoB,yBAC/B,0BAA0B,sBAAsB,0BAA0B,CAAC,CAC5E"}
|
|
@@ -20,8 +20,8 @@ import { SignInFactorOnePasskey } from "./SignInFactorOnePasskey.js";
|
|
|
20
20
|
import { SignInFactorOnePasswordCard } from "./SignInFactorOnePasswordCard.js";
|
|
21
21
|
import { SignInFactorOnePhoneCodeCard } from "./SignInFactorOnePhoneCodeCard.js";
|
|
22
22
|
import React from "react";
|
|
23
|
-
import { jsx } from "@emotion/react/jsx-runtime";
|
|
24
23
|
import { useClerk } from "@clerk/shared/react";
|
|
24
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
25
25
|
|
|
26
26
|
//#region src/components/SignIn/SignInFactorOne.tsx
|
|
27
27
|
const factorKey = (factor) => {
|
|
@@ -7,9 +7,9 @@ import { handleError } from "../../utils/errorHandler.js";
|
|
|
7
7
|
import { useSupportEmail } from "../../hooks/useSupportEmail.js";
|
|
8
8
|
import { VerificationCodeCard } from "../../elements/VerificationCodeCard.js";
|
|
9
9
|
import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
|
|
10
|
+
import { useClerk } from "@clerk/shared/react";
|
|
10
11
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
11
12
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
12
|
-
import { useClerk } from "@clerk/shared/react";
|
|
13
13
|
|
|
14
14
|
//#region src/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.tsx
|
|
15
15
|
const SignInFactorOneAlternativeChannelCodeForm = (props) => {
|
|
@@ -8,9 +8,9 @@ import { useSupportEmail } from "../../hooks/useSupportEmail.js";
|
|
|
8
8
|
import { VerificationCodeCard } from "../../elements/VerificationCodeCard.js";
|
|
9
9
|
import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
|
|
10
10
|
import { useMemo } from "react";
|
|
11
|
+
import { useClerk } from "@clerk/shared/react";
|
|
11
12
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
12
13
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
13
|
-
import { useClerk } from "@clerk/shared/react";
|
|
14
14
|
|
|
15
15
|
//#region src/components/SignIn/SignInFactorOneCodeForm.tsx
|
|
16
16
|
const SignInFactorOneCodeForm = (props) => {
|
|
@@ -11,9 +11,9 @@ import { EmailLinkStatusCard } from "../../common/EmailLinkStatusCard.js";
|
|
|
11
11
|
import { handleError } from "../../utils/errorHandler.js";
|
|
12
12
|
import { VerificationLinkCard } from "../../elements/VerificationLinkCard.js";
|
|
13
13
|
import React from "react";
|
|
14
|
+
import { useClerk } from "@clerk/shared/react";
|
|
14
15
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
15
16
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
16
|
-
import { useClerk } from "@clerk/shared/react";
|
|
17
17
|
|
|
18
18
|
//#region src/components/SignIn/SignInFactorOneEmailLinkCard.tsx
|
|
19
19
|
const SignInFactorOneEmailLinkCard = (props) => {
|
|
@@ -13,13 +13,13 @@ import { handleError } from "../../utils/errorHandler.js";
|
|
|
13
13
|
import { Form } from "../../elements/Form.js";
|
|
14
14
|
import { IdentityPreview } from "../../elements/IdentityPreview.js";
|
|
15
15
|
import { useSupportEmail } from "../../hooks/useSupportEmail.js";
|
|
16
|
-
import { useResetPasswordFactor } from "./useResetPasswordFactor.js";
|
|
17
16
|
import { HavingTrouble } from "./HavingTrouble.js";
|
|
17
|
+
import { useResetPasswordFactor } from "./useResetPasswordFactor.js";
|
|
18
18
|
import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
|
|
19
19
|
import React from "react";
|
|
20
|
+
import { useClerk } from "@clerk/shared/react";
|
|
20
21
|
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
21
22
|
import { isPasswordCompromisedError, isPasswordPwnedError, isUserLockedError } from "@clerk/shared/error";
|
|
22
|
-
import { useClerk } from "@clerk/shared/react";
|
|
23
23
|
|
|
24
24
|
//#region src/components/SignIn/SignInFactorOnePasswordCard.tsx
|
|
25
25
|
const usePasswordControl = (props) => {
|
|
@@ -65,13 +65,14 @@ const SignInFactorOnePasswordCard = (props) => {
|
|
|
65
65
|
case "complete": return setActive({
|
|
66
66
|
session: res.createdSessionId,
|
|
67
67
|
navigate: ({ session }) => {
|
|
68
|
-
navigateOnSetActive({
|
|
68
|
+
return navigateOnSetActive({
|
|
69
69
|
session,
|
|
70
70
|
redirectUrl: afterSignInUrl
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
});
|
|
74
74
|
case "needs_second_factor": return navigate("../factor-two");
|
|
75
|
+
case "needs_client_trust": return navigate("../client-trust");
|
|
75
76
|
default: return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));
|
|
76
77
|
}
|
|
77
78
|
}).catch((err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInFactorOnePasswordCard.js","names":["handlePasswordSubmit: React.FormEventHandler<HTMLFormElement>"],"sources":["../../../src/components/SignIn/SignInFactorOnePasswordCard.tsx"],"sourcesContent":["import { isPasswordCompromisedError, isPasswordPwnedError, isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { useClerk } from '@clerk/shared/react';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { IdentityPreview } from '@/ui/elements/IdentityPreview';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router/RouteContext';\nimport { HavingTrouble } from './HavingTrouble';\nimport { useResetPasswordFactor } from './useResetPasswordFactor';\n\nexport type PasswordErrorCode = 'compromised' | 'pwned';\n\ntype SignInFactorOnePasswordProps = {\n onForgotPasswordMethodClick: React.MouseEventHandler | undefined;\n onShowAlternativeMethodsClick: React.MouseEventHandler | undefined;\n onPasswordError?: (errorCode: PasswordErrorCode) => void;\n};\n\nconst usePasswordControl = (props: SignInFactorOnePasswordProps) => {\n const { onForgotPasswordMethodClick, onShowAlternativeMethodsClick } = props;\n const resetPasswordFactor = useResetPasswordFactor();\n\n const passwordControl = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__password'),\n placeholder: localizationKeys('formFieldInputPlaceholder__password'),\n });\n\n return {\n ...passwordControl,\n props: {\n ...passwordControl.props,\n actionLabel:\n resetPasswordFactor || onShowAlternativeMethodsClick ? localizationKeys('formFieldAction__forgotPassword') : '',\n onActionClicked: onForgotPasswordMethodClick\n ? onForgotPasswordMethodClick\n : onShowAlternativeMethodsClick\n ? onShowAlternativeMethodsClick\n : () => null,\n },\n };\n};\n\nexport const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) => {\n const { onShowAlternativeMethodsClick, onPasswordError } = props;\n const passwordInputRef = React.useRef<HTMLInputElement>(null);\n const card = useCardState();\n const { setActive } = useClerk();\n const signIn = useCoreSignIn();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const supportEmail = useSupportEmail();\n const passwordControl = usePasswordControl(props);\n const { navigate } = useRouter();\n const [showHavingTrouble, setShowHavingTrouble] = React.useState(false);\n const toggleHavingTrouble = React.useCallback(() => setShowHavingTrouble(s => !s), [setShowHavingTrouble]);\n const clerk = useClerk();\n\n const goBack = () => {\n void navigate('../');\n };\n\n const handlePasswordSubmit: React.FormEventHandler<HTMLFormElement> = e => {\n e.preventDefault();\n void signIn\n .attemptFirstFactor({ strategy: 'password', password: passwordControl.value })\n .then(res => {\n switch (res.status) {\n case 'complete':\n return setActive({\n session: res.createdSessionId,\n navigate: ({ session }) => {\n
|
|
1
|
+
{"version":3,"file":"SignInFactorOnePasswordCard.js","names":["handlePasswordSubmit: React.FormEventHandler<HTMLFormElement>"],"sources":["../../../src/components/SignIn/SignInFactorOnePasswordCard.tsx"],"sourcesContent":["import { isPasswordCompromisedError, isPasswordPwnedError, isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { useClerk } from '@clerk/shared/react';\nimport React from 'react';\n\nimport { Card } from '@/ui/elements/Card';\nimport { useCardState } from '@/ui/elements/contexts';\nimport { Form } from '@/ui/elements/Form';\nimport { Header } from '@/ui/elements/Header';\nimport { IdentityPreview } from '@/ui/elements/IdentityPreview';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useRouter } from '../../router/RouteContext';\nimport { HavingTrouble } from './HavingTrouble';\nimport { useResetPasswordFactor } from './useResetPasswordFactor';\n\nexport type PasswordErrorCode = 'compromised' | 'pwned';\n\ntype SignInFactorOnePasswordProps = {\n onForgotPasswordMethodClick: React.MouseEventHandler | undefined;\n onShowAlternativeMethodsClick: React.MouseEventHandler | undefined;\n onPasswordError?: (errorCode: PasswordErrorCode) => void;\n};\n\nconst usePasswordControl = (props: SignInFactorOnePasswordProps) => {\n const { onForgotPasswordMethodClick, onShowAlternativeMethodsClick } = props;\n const resetPasswordFactor = useResetPasswordFactor();\n\n const passwordControl = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__password'),\n placeholder: localizationKeys('formFieldInputPlaceholder__password'),\n });\n\n return {\n ...passwordControl,\n props: {\n ...passwordControl.props,\n actionLabel:\n resetPasswordFactor || onShowAlternativeMethodsClick ? localizationKeys('formFieldAction__forgotPassword') : '',\n onActionClicked: onForgotPasswordMethodClick\n ? onForgotPasswordMethodClick\n : onShowAlternativeMethodsClick\n ? onShowAlternativeMethodsClick\n : () => null,\n },\n };\n};\n\nexport const SignInFactorOnePasswordCard = (props: SignInFactorOnePasswordProps) => {\n const { onShowAlternativeMethodsClick, onPasswordError } = props;\n const passwordInputRef = React.useRef<HTMLInputElement>(null);\n const card = useCardState();\n const { setActive } = useClerk();\n const signIn = useCoreSignIn();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const supportEmail = useSupportEmail();\n const passwordControl = usePasswordControl(props);\n const { navigate } = useRouter();\n const [showHavingTrouble, setShowHavingTrouble] = React.useState(false);\n const toggleHavingTrouble = React.useCallback(() => setShowHavingTrouble(s => !s), [setShowHavingTrouble]);\n const clerk = useClerk();\n\n const goBack = () => {\n void navigate('../');\n };\n\n const handlePasswordSubmit: React.FormEventHandler<HTMLFormElement> = e => {\n e.preventDefault();\n void signIn\n .attemptFirstFactor({ strategy: 'password', password: passwordControl.value })\n .then(res => {\n switch (res.status) {\n case 'complete':\n return setActive({\n session: res.createdSessionId,\n navigate: ({ session }) => {\n return navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n case 'needs_second_factor':\n return navigate('../factor-two');\n case 'needs_client_trust':\n return navigate('../client-trust');\n default:\n return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n }\n })\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n if (onPasswordError) {\n if (isPasswordPwnedError(err)) {\n card.setError({ ...err.errors[0], code: 'form_password_pwned__sign_in' });\n onPasswordError('pwned');\n return;\n }\n\n if (isPasswordCompromisedError(err)) {\n card.setError({ ...err.errors[0], code: 'form_password_compromised__sign_in' });\n onPasswordError('compromised');\n return;\n }\n }\n\n handleError(err, [passwordControl], card.setError);\n\n setTimeout(() => passwordInputRef.current?.focus(), 0);\n });\n };\n\n if (showHavingTrouble) {\n return <HavingTrouble onBackLinkClick={toggleHavingTrouble} />;\n }\n\n return (\n <Flow.Part part='password'>\n <Card.Root>\n <Card.Content>\n <Header.Root showLogo>\n <Header.Title localizationKey={localizationKeys('signIn.password.title')} />\n <Header.Subtitle localizationKey={localizationKeys('signIn.password.subtitle')} />\n <IdentityPreview\n identifier={signIn.identifier}\n avatarUrl={signIn.userData.imageUrl}\n onClick={goBack}\n />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n {/*TODO: extract main in its own component */}\n <Flex\n direction='col'\n elementDescriptor={descriptors.main}\n gap={4}\n >\n <Form.Root\n onSubmit={handlePasswordSubmit}\n gap={8}\n >\n {/* For password managers */}\n <input\n readOnly\n id='identifier-field'\n name='identifier'\n value={signIn.identifier || ''}\n style={{ display: 'none' }}\n />\n <Form.ControlRow elementId={passwordControl.id}>\n <Form.PasswordInput\n {...passwordControl.props}\n ref={passwordInputRef}\n autoFocus\n />\n </Form.ControlRow>\n <Form.SubmitButton hasArrow />\n </Form.Root>\n <Card.Action elementId={onShowAlternativeMethodsClick ? 'alternativeMethods' : 'havingTrouble'}>\n <Card.ActionLink\n localizationKey={localizationKeys(\n onShowAlternativeMethodsClick ? 'signIn.password.actionLink' : 'signIn.alternativeMethods.actionLink',\n )}\n onClick={onShowAlternativeMethodsClick || toggleHavingTrouble}\n />\n </Card.Action>\n </Flex>\n </Card.Content>\n\n <Card.Footer />\n </Card.Root>\n </Flow.Part>\n );\n};\n"],"mappings":"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"}
|
|
@@ -2,42 +2,23 @@ import { useCoreSignIn } from "../../contexts/CoreClientContext.js";
|
|
|
2
2
|
import { withCardStateProvider } from "../../elements/contexts/index.js";
|
|
3
3
|
import { LoadingCard } from "../../elements/LoadingCard.js";
|
|
4
4
|
import { withRedirectToAfterSignIn, withRedirectToSignInTask } from "../../common/withRedirect.js";
|
|
5
|
-
import { determineStartingSignInSecondFactor } from "./utils.js";
|
|
6
5
|
import { SignInFactorTwoAlternativeMethods } from "./SignInFactorTwoAlternativeMethods.js";
|
|
7
|
-
import { SignInFactorTwoBackupCodeCard } from "./SignInFactorTwoBackupCodeCard.js";
|
|
8
6
|
import { SignInFactorTwoEmailCodeCard } from "./SignInFactorTwoEmailCodeCard.js";
|
|
9
7
|
import { SignInFactorTwoEmailLinkCard } from "./SignInFactorTwoEmailLinkCard.js";
|
|
10
8
|
import { SignInFactorTwoPhoneCodeCard } from "./SignInFactorTwoPhoneCodeCard.js";
|
|
9
|
+
import { useSecondFactorSelection } from "./useSecondFactorSelection.js";
|
|
10
|
+
import { SignInFactorTwoBackupCodeCard } from "./SignInFactorTwoBackupCodeCard.js";
|
|
11
11
|
import { SignInFactorTwoTOTPCard } from "./SignInFactorTwoTOTPCard.js";
|
|
12
|
-
import React from "react";
|
|
13
12
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
14
13
|
|
|
15
14
|
//#region src/components/SignIn/SignInFactorTwo.tsx
|
|
16
|
-
const factorKey = (factor) => {
|
|
17
|
-
if (!factor) return "";
|
|
18
|
-
let key = factor.strategy;
|
|
19
|
-
if ("phoneNumberId" in factor) key += factor.phoneNumberId;
|
|
20
|
-
return key;
|
|
21
|
-
};
|
|
22
15
|
function SignInFactorTwoInternal() {
|
|
23
|
-
const
|
|
24
|
-
const lastPreparedFactorKeyRef = React.useRef("");
|
|
25
|
-
const [currentFactor, setCurrentFactor] = React.useState(() => determineStartingSignInSecondFactor(availableFactors));
|
|
26
|
-
const [showAllStrategies, setShowAllStrategies] = React.useState(!currentFactor);
|
|
27
|
-
const toggleAllStrategies = () => setShowAllStrategies((s) => !s);
|
|
28
|
-
const handleFactorPrepare = () => {
|
|
29
|
-
lastPreparedFactorKeyRef.current = factorKey(currentFactor);
|
|
30
|
-
};
|
|
31
|
-
const selectFactor = (factor) => {
|
|
32
|
-
setCurrentFactor(factor);
|
|
33
|
-
toggleAllStrategies();
|
|
34
|
-
};
|
|
16
|
+
const { currentFactor, factorAlreadyPrepared, handleFactorPrepare, selectFactor, showAllStrategies, toggleAllStrategies } = useSecondFactorSelection(useCoreSignIn().supportedSecondFactors);
|
|
35
17
|
if (!currentFactor) return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
36
18
|
if (showAllStrategies) return /* @__PURE__ */ jsx(SignInFactorTwoAlternativeMethods, {
|
|
37
19
|
onBackLinkClick: toggleAllStrategies,
|
|
38
20
|
onFactorSelected: selectFactor
|
|
39
21
|
});
|
|
40
|
-
const factorAlreadyPrepared = lastPreparedFactorKeyRef.current === factorKey(currentFactor);
|
|
41
22
|
switch (currentFactor?.strategy) {
|
|
42
23
|
case "phone_code": return /* @__PURE__ */ jsx(SignInFactorTwoPhoneCodeCard, {
|
|
43
24
|
factorAlreadyPrepared,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInFactorTwo.js","names":[],"sources":["../../../src/components/SignIn/SignInFactorTwo.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"SignInFactorTwo.js","names":[],"sources":["../../../src/components/SignIn/SignInFactorTwo.tsx"],"sourcesContent":["import { withCardStateProvider } from '@/ui/elements/contexts';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { withRedirectToAfterSignIn, withRedirectToSignInTask } from '../../common';\nimport { useCoreSignIn } from '../../contexts';\nimport { SignInFactorTwoAlternativeMethods } from './SignInFactorTwoAlternativeMethods';\nimport { SignInFactorTwoBackupCodeCard } from './SignInFactorTwoBackupCodeCard';\nimport { SignInFactorTwoEmailCodeCard } from './SignInFactorTwoEmailCodeCard';\nimport { SignInFactorTwoEmailLinkCard } from './SignInFactorTwoEmailLinkCard';\nimport { SignInFactorTwoPhoneCodeCard } from './SignInFactorTwoPhoneCodeCard';\nimport { SignInFactorTwoTOTPCard } from './SignInFactorTwoTOTPCard';\nimport { useSecondFactorSelection } from './useSecondFactorSelection';\n\nfunction SignInFactorTwoInternal(): JSX.Element {\n const signIn = useCoreSignIn();\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection(signIn.supportedSecondFactors);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies) {\n return (\n <SignInFactorTwoAlternativeMethods\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <SignInFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n case 'totp':\n return (\n <SignInFactorTwoTOTPCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n case 'backup_code':\n return <SignInFactorTwoBackupCodeCard onShowAlternativeMethodsClicked={toggleAllStrategies} />;\n case 'email_code':\n return (\n <SignInFactorTwoEmailCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n case 'email_link':\n return (\n <SignInFactorTwoEmailLinkCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n />\n );\n default:\n return <LoadingCard />;\n }\n}\n\nexport const SignInFactorTwo = withRedirectToSignInTask(\n withRedirectToAfterSignIn(withCardStateProvider(SignInFactorTwoInternal)),\n);\n"],"mappings":";;;;;;;;;;;;;;AAaA,SAAS,0BAAuC;CAE9C,MAAM,EACJ,eACA,uBACA,qBACA,cACA,mBACA,wBACE,yBARW,eAAe,CAQM,uBAAuB;AAE3D,KAAI,CAAC,cACH,QAAO,oBAAC,gBAAc;AAGxB,KAAI,kBACF,QACE,oBAAC;EACC,iBAAiB;EACjB,kBAAkB;GAClB;AAIN,SAAQ,eAAe,UAAvB;EACE,KAAK,aACH,QACE,oBAAC;GACwB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,KAAK,OACH,QACE,oBAAC;GACwB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,KAAK,cACH,QAAO,oBAAC,iCAA8B,iCAAiC,sBAAuB;EAChG,KAAK,aACH,QACE,oBAAC;GACwB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,KAAK,aACH,QACE,oBAAC;GACwB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;IACjC;EAEN,QACE,QAAO,oBAAC,gBAAc;;;AAI5B,MAAa,kBAAkB,yBAC7B,0BAA0B,sBAAsB,wBAAwB,CAAC,CAC1E"}
|
|
@@ -14,9 +14,9 @@ import { useSupportEmail } from "../../hooks/useSupportEmail.js";
|
|
|
14
14
|
import { isResetPasswordStrategy } from "./utils.js";
|
|
15
15
|
import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
|
|
16
16
|
import React from "react";
|
|
17
|
+
import { useClerk } from "@clerk/shared/react";
|
|
17
18
|
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
18
19
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
19
|
-
import { useClerk } from "@clerk/shared/react";
|
|
20
20
|
|
|
21
21
|
//#region src/components/SignIn/SignInFactorTwoBackupCodeCard.tsx
|
|
22
22
|
const SignInFactorTwoBackupCodeCard = (props) => {
|
|
@@ -7,13 +7,13 @@ import { useCardState } from "../../elements/contexts/index.js";
|
|
|
7
7
|
import { Text } from "../../customizables/index.js";
|
|
8
8
|
import { handleError } from "../../utils/errorHandler.js";
|
|
9
9
|
import { useSupportEmail } from "../../hooks/useSupportEmail.js";
|
|
10
|
-
import { isResetPasswordStrategy } from "./utils.js";
|
|
11
10
|
import { VerificationCodeCard } from "../../elements/VerificationCodeCard.js";
|
|
11
|
+
import { isResetPasswordStrategy } from "./utils.js";
|
|
12
12
|
import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
|
|
13
13
|
import React, { useMemo } from "react";
|
|
14
|
+
import { useClerk } from "@clerk/shared/react";
|
|
14
15
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
15
16
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
16
|
-
import { useClerk } from "@clerk/shared/react";
|
|
17
17
|
|
|
18
18
|
//#region src/components/SignIn/SignInFactorTwoCodeForm.tsx
|
|
19
19
|
const isResettingPassword = (resource) => isResetPasswordStrategy(resource.firstFactorVerification?.strategy) && resource.firstFactorVerification?.status === "verified";
|
|
@@ -72,7 +72,7 @@ const SignInFactorTwoCodeForm = (props) => {
|
|
|
72
72
|
return /* @__PURE__ */ jsx(VerificationCodeCard, {
|
|
73
73
|
cardTitle: props.cardTitle,
|
|
74
74
|
cardSubtitle: isResettingPassword(signIn) ? localizationKeys("signIn.forgotPassword.subtitle") : props.cardSubtitle,
|
|
75
|
-
cardNotice: showNewDeviceVerificationNotice ? localizationKeys("signIn.newDeviceVerificationNotice") : void 0,
|
|
75
|
+
cardNotice: props.showClientTrustNotice || showNewDeviceVerificationNotice ? localizationKeys("signIn.newDeviceVerificationNotice") : void 0,
|
|
76
76
|
resendButton: props.resendButton,
|
|
77
77
|
inputLabel: props.inputLabel,
|
|
78
78
|
onCodeEntryFinishedAction: action,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInFactorTwoCodeForm.js","names":["action: VerificationCodeCardProps['onCodeEntryFinishedAction']"],"sources":["../../../src/components/SignIn/SignInFactorTwoCodeForm.tsx"],"sourcesContent":["import { isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EmailCodeFactor, PhoneCodeFactor, SignInResource, TOTPFactor } from '@clerk/shared/types';\nimport React, { useMemo } from 'react';\n\nimport { useCardState } from '@/ui/elements/contexts';\nimport type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard';\nimport { VerificationCodeCard } from '@/ui/elements/VerificationCodeCard';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';\nimport { localizationKeys, Text } from '../../customizables';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport type { LocalizationKey } from '../../localization';\nimport { useRouter } from '../../router';\nimport { isResetPasswordStrategy } from './utils';\n\nexport type SignInFactorTwoCodeCard = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {\n factor: EmailCodeFactor | PhoneCodeFactor | TOTPFactor;\n factorAlreadyPrepared: boolean;\n onFactorPrepare: () => void;\n prepare?: () => Promise<SignInResource>;\n};\n\ntype SignInFactorTwoCodeFormProps = SignInFactorTwoCodeCard & {\n cardTitle: LocalizationKey;\n cardSubtitle: LocalizationKey;\n inputLabel: LocalizationKey;\n resendButton?: LocalizationKey;\n};\n\nconst isResettingPassword = (resource: SignInResource) =>\n isResetPasswordStrategy(resource.firstFactorVerification?.strategy) &&\n resource.firstFactorVerification?.status === 'verified';\n\nexport const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => {\n const env = useEnvironment();\n const signIn = useCoreSignIn();\n const card = useCardState();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const { setActive } = useClerk();\n const { navigate } = useRouter();\n const supportEmail = useSupportEmail();\n const clerk = useClerk();\n\n // Only show the new device verification notice if the user is new\n // and no attributes are explicitly used for second factor.\n const showNewDeviceVerificationNotice = useMemo(() => {\n const anyAttributeUsedForSecondFactor = Object.values(env.userSettings.attributes).some(\n attr => attr.used_for_second_factor,\n );\n return signIn.clientTrustState === 'new' && !anyAttributeUsedForSecondFactor;\n }, [signIn.clientTrustState, env.userSettings.attributes]);\n\n React.useEffect(() => {\n if (props.factorAlreadyPrepared) {\n return;\n }\n\n void prepare?.();\n }, []);\n\n const prepare = props.prepare\n ? () => {\n return props\n .prepare?.()\n .then(() => props.onFactorPrepare())\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n handleError(err, [], card.setError);\n });\n }\n : undefined;\n\n const action: VerificationCodeCardProps['onCodeEntryFinishedAction'] = (code, resolve, reject) => {\n signIn\n .attemptSecondFactor({ strategy: props.factor.strategy, code })\n .then(async res => {\n await resolve();\n switch (res.status) {\n case 'complete':\n if (isResettingPassword(res) && res.createdSessionId) {\n const queryParams = new URLSearchParams();\n queryParams.set('createdSessionId', res.createdSessionId);\n return navigate(`../reset-password-success?${queryParams.toString()}`);\n }\n return setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default:\n return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n }\n })\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n return reject(err);\n });\n };\n\n return (\n <VerificationCodeCard\n cardTitle={props.cardTitle}\n cardSubtitle={\n isResettingPassword(signIn) ? localizationKeys('signIn.forgotPassword.subtitle') : props.cardSubtitle\n }\n cardNotice={showNewDeviceVerificationNotice
|
|
1
|
+
{"version":3,"file":"SignInFactorTwoCodeForm.js","names":["action: VerificationCodeCardProps['onCodeEntryFinishedAction']"],"sources":["../../../src/components/SignIn/SignInFactorTwoCodeForm.tsx"],"sourcesContent":["import { isUserLockedError } from '@clerk/shared/error';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EmailCodeFactor, PhoneCodeFactor, SignInResource, TOTPFactor } from '@clerk/shared/types';\nimport React, { useMemo } from 'react';\n\nimport { useCardState } from '@/ui/elements/contexts';\nimport type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard';\nimport { VerificationCodeCard } from '@/ui/elements/VerificationCodeCard';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';\nimport { localizationKeys, Text } from '../../customizables';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport type { LocalizationKey } from '../../localization';\nimport { useRouter } from '../../router';\nimport { isResetPasswordStrategy } from './utils';\n\nexport type SignInFactorTwoCodeCard = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {\n showClientTrustNotice?: boolean;\n factor: EmailCodeFactor | PhoneCodeFactor | TOTPFactor;\n factorAlreadyPrepared: boolean;\n onFactorPrepare: () => void;\n prepare?: () => Promise<SignInResource>;\n};\n\ntype SignInFactorTwoCodeFormProps = SignInFactorTwoCodeCard & {\n cardTitle: LocalizationKey;\n cardSubtitle: LocalizationKey;\n inputLabel: LocalizationKey;\n resendButton?: LocalizationKey;\n};\n\nconst isResettingPassword = (resource: SignInResource) =>\n isResetPasswordStrategy(resource.firstFactorVerification?.strategy) &&\n resource.firstFactorVerification?.status === 'verified';\n\nexport const SignInFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => {\n const env = useEnvironment();\n const signIn = useCoreSignIn();\n const card = useCardState();\n const { afterSignInUrl, navigateOnSetActive } = useSignInContext();\n const { setActive } = useClerk();\n const { navigate } = useRouter();\n const supportEmail = useSupportEmail();\n const clerk = useClerk();\n\n // Only show the new device verification notice if the user is new\n // and no attributes are explicitly used for second factor.\n // Retained for backwards compatibility.\n const showNewDeviceVerificationNotice = useMemo(() => {\n const anyAttributeUsedForSecondFactor = Object.values(env.userSettings.attributes).some(\n attr => attr.used_for_second_factor,\n );\n return signIn.clientTrustState === 'new' && !anyAttributeUsedForSecondFactor;\n }, [signIn.clientTrustState, env.userSettings.attributes]);\n\n React.useEffect(() => {\n if (props.factorAlreadyPrepared) {\n return;\n }\n\n void prepare?.();\n }, []);\n\n const prepare = props.prepare\n ? () => {\n return props\n .prepare?.()\n .then(() => props.onFactorPrepare())\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n handleError(err, [], card.setError);\n });\n }\n : undefined;\n\n const action: VerificationCodeCardProps['onCodeEntryFinishedAction'] = (code, resolve, reject) => {\n signIn\n .attemptSecondFactor({ strategy: props.factor.strategy, code })\n .then(async res => {\n await resolve();\n switch (res.status) {\n case 'complete':\n if (isResettingPassword(res) && res.createdSessionId) {\n const queryParams = new URLSearchParams();\n queryParams.set('createdSessionId', res.createdSessionId);\n return navigate(`../reset-password-success?${queryParams.toString()}`);\n }\n return setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default:\n return console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n }\n })\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n return reject(err);\n });\n };\n\n return (\n <VerificationCodeCard\n cardTitle={props.cardTitle}\n cardSubtitle={\n isResettingPassword(signIn) ? localizationKeys('signIn.forgotPassword.subtitle') : props.cardSubtitle\n }\n cardNotice={\n props.showClientTrustNotice || showNewDeviceVerificationNotice\n ? localizationKeys('signIn.newDeviceVerificationNotice')\n : undefined\n }\n resendButton={props.resendButton}\n inputLabel={props.inputLabel}\n onCodeEntryFinishedAction={action}\n onResendCodeClicked={prepare}\n safeIdentifier={'safeIdentifier' in props.factor ? props.factor.safeIdentifier : undefined}\n profileImageUrl={signIn.userData.imageUrl}\n onShowAlternativeMethodsClicked={props.onShowAlternativeMethodsClicked}\n >\n {isResettingPassword(signIn) && (\n <Text\n localizationKey={localizationKeys('signIn.resetPasswordMfa.detailsLabel')}\n colorScheme='secondary'\n />\n )}\n </VerificationCodeCard>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiCA,MAAM,uBAAuB,aAC3B,wBAAwB,SAAS,yBAAyB,SAAS,IACnE,SAAS,yBAAyB,WAAW;AAE/C,MAAa,2BAA2B,UAAwC;CAC9E,MAAM,MAAM,gBAAgB;CAC5B,MAAM,SAAS,eAAe;CAC9B,MAAM,OAAO,cAAc;CAC3B,MAAM,EAAE,gBAAgB,wBAAwB,kBAAkB;CAClE,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,eAAe,iBAAiB;CACtC,MAAM,QAAQ,UAAU;CAKxB,MAAM,kCAAkC,cAAc;EACpD,MAAM,kCAAkC,OAAO,OAAO,IAAI,aAAa,WAAW,CAAC,MACjF,SAAQ,KAAK,uBACd;AACD,SAAO,OAAO,qBAAqB,SAAS,CAAC;IAC5C,CAAC,OAAO,kBAAkB,IAAI,aAAa,WAAW,CAAC;AAE1D,OAAM,gBAAgB;AACpB,MAAI,MAAM,sBACR;AAGF,EAAK,WAAW;IACf,EAAE,CAAC;CAEN,MAAM,UAAU,MAAM,gBACZ;AACJ,SAAO,MACJ,WAAW,CACX,WAAW,MAAM,iBAAiB,CAAC,CACnC,OAAM,QAAO;AACZ,OAAI,kBAAkB,IAAI,CAExB,QAAO,MAAM,6BAA6B,MAAM,IAAI,OAAO,GAAG;AAGhE,eAAY,KAAK,EAAE,EAAE,KAAK,SAAS;IACnC;KAEN;CAEJ,MAAMA,UAAkE,MAAM,SAAS,WAAW;AAChG,SACG,oBAAoB;GAAE,UAAU,MAAM,OAAO;GAAU;GAAM,CAAC,CAC9D,KAAK,OAAM,QAAO;AACjB,SAAM,SAAS;AACf,WAAQ,IAAI,QAAZ;IACE,KAAK;AACH,SAAI,oBAAoB,IAAI,IAAI,IAAI,kBAAkB;MACpD,MAAM,cAAc,IAAI,iBAAiB;AACzC,kBAAY,IAAI,oBAAoB,IAAI,iBAAiB;AACzD,aAAO,SAAS,6BAA6B,YAAY,UAAU,GAAG;;AAExE,YAAO,UAAU;MACf,SAAS,IAAI;MACb,UAAU,OAAO,EAAE,cAAc;AAC/B,aAAM,oBAAoB;QAAE;QAAS,aAAa;QAAgB,CAAC;;MAEtE,CAAC;IACJ,QACE,QAAO,QAAQ,MAAM,yBAAyB,IAAI,QAAQ,aAAa,CAAC;;IAE5E,CACD,OAAM,QAAO;AACZ,OAAI,kBAAkB,IAAI,CAExB,QAAO,MAAM,6BAA6B,MAAM,IAAI,OAAO,GAAG;AAGhE,UAAO,OAAO,IAAI;IAClB;;AAGN,QACE,oBAAC;EACC,WAAW,MAAM;EACjB,cACE,oBAAoB,OAAO,GAAG,iBAAiB,iCAAiC,GAAG,MAAM;EAE3F,YACE,MAAM,yBAAyB,kCAC3B,iBAAiB,qCAAqC,GACtD;EAEN,cAAc,MAAM;EACpB,YAAY,MAAM;EAClB,2BAA2B;EAC3B,qBAAqB;EACrB,gBAAgB,oBAAoB,MAAM,SAAS,MAAM,OAAO,iBAAiB;EACjF,iBAAiB,OAAO,SAAS;EACjC,iCAAiC,MAAM;YAEtC,oBAAoB,OAAO,IAC1B,oBAAC;GACC,iBAAiB,iBAAiB,uCAAuC;GACzE,aAAY;IACZ;GAEiB"}
|
|
@@ -10,9 +10,9 @@ import { EmailLinkStatusCard } from "../../common/EmailLinkStatusCard.js";
|
|
|
10
10
|
import { handleError } from "../../utils/errorHandler.js";
|
|
11
11
|
import { VerificationLinkCard } from "../../elements/VerificationLinkCard.js";
|
|
12
12
|
import React from "react";
|
|
13
|
+
import { useClerk } from "@clerk/shared/react";
|
|
13
14
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
14
15
|
import { isUserLockedError } from "@clerk/shared/error";
|
|
15
|
-
import { useClerk } from "@clerk/shared/react";
|
|
16
16
|
|
|
17
17
|
//#region src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx
|
|
18
18
|
const isNewDevice = (resource) => resource.clientTrustState === "new";
|
|
@@ -66,7 +66,7 @@ const SignInFactorTwoEmailLinkCard = (props) => {
|
|
|
66
66
|
children: /* @__PURE__ */ jsx(VerificationLinkCard, {
|
|
67
67
|
cardTitle: localizationKeys("signIn.emailLinkMfa.title"),
|
|
68
68
|
cardSubtitle: localizationKeys("signIn.emailLinkMfa.subtitle"),
|
|
69
|
-
cardNotice: isNewDevice(signIn) ? localizationKeys("signIn.newDeviceVerificationNotice") : void 0,
|
|
69
|
+
cardNotice: props.showClientTrustNotice || isNewDevice(signIn) ? localizationKeys("signIn.newDeviceVerificationNotice") : void 0,
|
|
70
70
|
formSubtitle: localizationKeys("signIn.emailLinkMfa.formSubtitle"),
|
|
71
71
|
resendButton: localizationKeys("signIn.emailLinkMfa.resendButton"),
|
|
72
72
|
onResendCodeClicked: restartVerification,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignInFactorTwoEmailLinkCard.js","names":[],"sources":["../../../src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx"],"sourcesContent":["import { isUserLockedError } from '@clerk/shared/error';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EmailLinkFactor, SignInResource } from '@clerk/shared/types';\nimport React from 'react';\n\nimport type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard';\nimport { VerificationLinkCard } from '@/ui/elements/VerificationLinkCard';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { EmailLinkStatusCard } from '../../common';\nimport { buildVerificationRedirectUrl } from '../../common/redirects';\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { Flow, localizationKeys, useLocalizations } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { useEmailLink } from '../../hooks/useEmailLink';\n\ntype SignInFactorTwoEmailLinkCardProps = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {\n factor: EmailLinkFactor;\n factorAlreadyPrepared: boolean;\n onFactorPrepare: () => void;\n};\n\nconst isNewDevice = (resource: SignInResource) => resource.clientTrustState === 'new';\n\nexport const SignInFactorTwoEmailLinkCard = (props: SignInFactorTwoEmailLinkCardProps) => {\n const { t } = useLocalizations();\n const card = useCardState();\n const signIn = useCoreSignIn();\n const signInContext = useSignInContext();\n const { signInUrl } = signInContext;\n const { afterSignInUrl } = useSignInContext();\n const { setActive } = useClerk();\n const { startEmailLinkFlow, cancelEmailLinkFlow } = useEmailLink(signIn);\n const [showVerifyModal, setShowVerifyModal] = React.useState(false);\n const clerk = useClerk();\n\n React.useEffect(() => {\n void startEmailLinkVerification();\n }, []);\n\n const restartVerification = () => {\n cancelEmailLinkFlow();\n void startEmailLinkVerification();\n };\n\n const startEmailLinkVerification = () => {\n startEmailLinkFlow({\n emailAddressId: props.factor.emailAddressId,\n redirectUrl: buildVerificationRedirectUrl({ ctx: signInContext, baseUrl: signInUrl, intent: 'sign-in' }),\n })\n .then(res => handleVerificationResult(res))\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n handleError(err, [], card.setError);\n });\n };\n\n const handleVerificationResult = async (si: SignInResource) => {\n const ver = si.secondFactorVerification;\n if (ver.status === 'expired') {\n card.setError(t(localizationKeys('formFieldError__verificationLinkExpired')));\n } else if (ver.verifiedFromTheSameClient()) {\n setShowVerifyModal(true);\n } else {\n await setActive({\n session: si.createdSessionId,\n redirectUrl: afterSignInUrl,\n });\n }\n };\n\n if (showVerifyModal) {\n return (\n <EmailLinkStatusCard\n title={localizationKeys('signIn.emailLink.verifiedSwitchTab.titleNewTab')}\n subtitle={localizationKeys('signIn.emailLink.verifiedSwitchTab.subtitleNewTab')}\n status='verified_switch_tab'\n />\n );\n }\n\n return (\n <Flow.Part part='emailLink'>\n <VerificationLinkCard\n cardTitle={localizationKeys('signIn.emailLinkMfa.title')}\n cardSubtitle={localizationKeys('signIn.emailLinkMfa.subtitle')}\n cardNotice={isNewDevice(signIn)
|
|
1
|
+
{"version":3,"file":"SignInFactorTwoEmailLinkCard.js","names":[],"sources":["../../../src/components/SignIn/SignInFactorTwoEmailLinkCard.tsx"],"sourcesContent":["import { isUserLockedError } from '@clerk/shared/error';\nimport { useClerk } from '@clerk/shared/react';\nimport type { EmailLinkFactor, SignInResource } from '@clerk/shared/types';\nimport React from 'react';\n\nimport type { VerificationCodeCardProps } from '@/ui/elements/VerificationCodeCard';\nimport { VerificationLinkCard } from '@/ui/elements/VerificationLinkCard';\nimport { handleError } from '@/ui/utils/errorHandler';\n\nimport { EmailLinkStatusCard } from '../../common';\nimport { buildVerificationRedirectUrl } from '../../common/redirects';\nimport { useCoreSignIn, useSignInContext } from '../../contexts';\nimport { Flow, localizationKeys, useLocalizations } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { useEmailLink } from '../../hooks/useEmailLink';\n\ntype SignInFactorTwoEmailLinkCardProps = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {\n showClientTrustNotice?: boolean;\n factor: EmailLinkFactor;\n factorAlreadyPrepared: boolean;\n onFactorPrepare: () => void;\n};\n\n// Retained for backwards compatibility.\nconst isNewDevice = (resource: SignInResource) => resource.clientTrustState === 'new';\n\nexport const SignInFactorTwoEmailLinkCard = (props: SignInFactorTwoEmailLinkCardProps) => {\n const { t } = useLocalizations();\n const card = useCardState();\n const signIn = useCoreSignIn();\n const signInContext = useSignInContext();\n const { signInUrl } = signInContext;\n const { afterSignInUrl } = useSignInContext();\n const { setActive } = useClerk();\n const { startEmailLinkFlow, cancelEmailLinkFlow } = useEmailLink(signIn);\n const [showVerifyModal, setShowVerifyModal] = React.useState(false);\n const clerk = useClerk();\n\n React.useEffect(() => {\n void startEmailLinkVerification();\n }, []);\n\n const restartVerification = () => {\n cancelEmailLinkFlow();\n void startEmailLinkVerification();\n };\n\n const startEmailLinkVerification = () => {\n startEmailLinkFlow({\n emailAddressId: props.factor.emailAddressId,\n redirectUrl: buildVerificationRedirectUrl({ ctx: signInContext, baseUrl: signInUrl, intent: 'sign-in' }),\n })\n .then(res => handleVerificationResult(res))\n .catch(err => {\n if (isUserLockedError(err)) {\n // @ts-expect-error -- private method for the time being\n return clerk.__internal_navigateWithError('..', err.errors[0]);\n }\n\n handleError(err, [], card.setError);\n });\n };\n\n const handleVerificationResult = async (si: SignInResource) => {\n const ver = si.secondFactorVerification;\n if (ver.status === 'expired') {\n card.setError(t(localizationKeys('formFieldError__verificationLinkExpired')));\n } else if (ver.verifiedFromTheSameClient()) {\n setShowVerifyModal(true);\n } else {\n await setActive({\n session: si.createdSessionId,\n redirectUrl: afterSignInUrl,\n });\n }\n };\n\n if (showVerifyModal) {\n return (\n <EmailLinkStatusCard\n title={localizationKeys('signIn.emailLink.verifiedSwitchTab.titleNewTab')}\n subtitle={localizationKeys('signIn.emailLink.verifiedSwitchTab.subtitleNewTab')}\n status='verified_switch_tab'\n />\n );\n }\n\n return (\n <Flow.Part part='emailLink'>\n <VerificationLinkCard\n cardTitle={localizationKeys('signIn.emailLinkMfa.title')}\n cardSubtitle={localizationKeys('signIn.emailLinkMfa.subtitle')}\n cardNotice={\n props.showClientTrustNotice || isNewDevice(signIn)\n ? localizationKeys('signIn.newDeviceVerificationNotice')\n : undefined\n }\n formSubtitle={localizationKeys('signIn.emailLinkMfa.formSubtitle')}\n resendButton={localizationKeys('signIn.emailLinkMfa.resendButton')}\n onResendCodeClicked={restartVerification}\n safeIdentifier={props.factor.safeIdentifier}\n profileImageUrl={signIn.userData.imageUrl}\n onShowAlternativeMethodsClicked={props.onShowAlternativeMethodsClicked}\n />\n </Flow.Part>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAwBA,MAAM,eAAe,aAA6B,SAAS,qBAAqB;AAEhF,MAAa,gCAAgC,UAA6C;CACxF,MAAM,EAAE,MAAM,kBAAkB;CAChC,MAAM,OAAO,cAAc;CAC3B,MAAM,SAAS,eAAe;CAC9B,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,EAAE,cAAc;CACtB,MAAM,EAAE,mBAAmB,kBAAkB;CAC7C,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,EAAE,oBAAoB,wBAAwB,aAAa,OAAO;CACxE,MAAM,CAAC,iBAAiB,sBAAsB,MAAM,SAAS,MAAM;CACnE,MAAM,QAAQ,UAAU;AAExB,OAAM,gBAAgB;AACpB,EAAK,4BAA4B;IAChC,EAAE,CAAC;CAEN,MAAM,4BAA4B;AAChC,uBAAqB;AACrB,EAAK,4BAA4B;;CAGnC,MAAM,mCAAmC;AACvC,qBAAmB;GACjB,gBAAgB,MAAM,OAAO;GAC7B,aAAa,6BAA6B;IAAE,KAAK;IAAe,SAAS;IAAW,QAAQ;IAAW,CAAC;GACzG,CAAC,CACC,MAAK,QAAO,yBAAyB,IAAI,CAAC,CAC1C,OAAM,QAAO;AACZ,OAAI,kBAAkB,IAAI,CAExB,QAAO,MAAM,6BAA6B,MAAM,IAAI,OAAO,GAAG;AAGhE,eAAY,KAAK,EAAE,EAAE,KAAK,SAAS;IACnC;;CAGN,MAAM,2BAA2B,OAAO,OAAuB;EAC7D,MAAM,MAAM,GAAG;AACf,MAAI,IAAI,WAAW,UACjB,MAAK,SAAS,EAAE,iBAAiB,0CAA0C,CAAC,CAAC;WACpE,IAAI,2BAA2B,CACxC,oBAAmB,KAAK;MAExB,OAAM,UAAU;GACd,SAAS,GAAG;GACZ,aAAa;GACd,CAAC;;AAIN,KAAI,gBACF,QACE,oBAAC;EACC,OAAO,iBAAiB,iDAAiD;EACzE,UAAU,iBAAiB,oDAAoD;EAC/E,QAAO;GACP;AAIN,QACE,oBAAC,KAAK;EAAK,MAAK;YACd,oBAAC;GACC,WAAW,iBAAiB,4BAA4B;GACxD,cAAc,iBAAiB,+BAA+B;GAC9D,YACE,MAAM,yBAAyB,YAAY,OAAO,GAC9C,iBAAiB,qCAAqC,GACtD;GAEN,cAAc,iBAAiB,mCAAmC;GAClE,cAAc,iBAAiB,mCAAmC;GAClE,qBAAqB;GACrB,gBAAgB,MAAM,OAAO;GAC7B,iBAAiB,OAAO,SAAS;GACjC,iCAAiC,MAAM;IACvC;GACQ"}
|
|
@@ -10,9 +10,9 @@ import { web3CallbackErrorHandler } from "../../utils/web3CallbackErrorHandler.j
|
|
|
10
10
|
import { SocialButtons } from "../../elements/SocialButtons.js";
|
|
11
11
|
import React from "react";
|
|
12
12
|
import { ERROR_CODES } from "@clerk/shared/internal/clerk-js/constants";
|
|
13
|
+
import { useClerk } from "@clerk/shared/react";
|
|
13
14
|
import { jsx } from "@emotion/react/jsx-runtime";
|
|
14
15
|
import { isClerkAPIResponseError } from "@clerk/shared/error";
|
|
15
|
-
import { useClerk } from "@clerk/shared/react";
|
|
16
16
|
|
|
17
17
|
//#region src/components/SignIn/SignInSocialButtons.tsx
|
|
18
18
|
const SignInSocialButtons = React.memo((props) => {
|
|
@@ -31,8 +31,8 @@ import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors
|
|
|
31
31
|
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
32
32
|
import { ERROR_CODES, SIGN_UP_MODES } from "@clerk/shared/internal/clerk-js/constants";
|
|
33
33
|
import { getClerkQueryParam, removeClerkQueryParam } from "@clerk/shared/internal/clerk-js/queryParams";
|
|
34
|
-
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
35
34
|
import { useClerk } from "@clerk/shared/react";
|
|
35
|
+
import { jsx, jsxs } from "@emotion/react/jsx-runtime";
|
|
36
36
|
import { getAlternativePhoneCodeProviderData } from "@clerk/shared/alternativePhoneCode";
|
|
37
37
|
import { isWebAuthnAutofillSupported, isWebAuthnSupported } from "@clerk/shared/webauthn";
|
|
38
38
|
|
|
@@ -152,6 +152,7 @@ function SignInStartInternal() {
|
|
|
152
152
|
if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) return navigate("factor-one");
|
|
153
153
|
return authenticateWithEnterpriseSSO();
|
|
154
154
|
case "needs_second_factor": return navigate("factor-two");
|
|
155
|
+
case "needs_client_trust": return navigate("client-trust");
|
|
155
156
|
case "complete":
|
|
156
157
|
removeClerkQueryParam("__clerk_ticket");
|
|
157
158
|
return clerk.setActive({
|
|
@@ -268,6 +269,7 @@ function SignInStartInternal() {
|
|
|
268
269
|
if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) return navigate("factor-one");
|
|
269
270
|
return authenticateWithEnterpriseSSO();
|
|
270
271
|
case "needs_second_factor": return navigate("factor-two");
|
|
272
|
+
case "needs_client_trust": return navigate("client-trust");
|
|
271
273
|
case "complete": return clerk.setActive({
|
|
272
274
|
session: res.createdSessionId,
|
|
273
275
|
navigate: async ({ session }) => {
|