@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.
Files changed (234) hide show
  1. package/dist/{207_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 207_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  2. package/dist/{217_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 217_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  3. package/dist/{360_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 360_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  4. package/dist/{444_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 444_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  5. package/dist/{573_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 573_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  6. package/dist/{970_ui_03abd0_1.0.0-snapshot.v20251208202852.js → 970_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  7. package/dist/ClerkUi.js +2 -2
  8. package/dist/Components.js +7 -0
  9. package/dist/Components.js.map +1 -1
  10. package/dist/{apiKeys_ui_03abd0_1.0.0-snapshot.v20251208202852.js → apiKeys_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  11. package/dist/{checkout_ui_03abd0_1.0.0-snapshot.v20251208202852.js → checkout_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +2 -2
  12. package/dist/common/EmailLinkVerify.js +1 -1
  13. package/dist/common/Gate.js +1 -1
  14. package/dist/common/RemoveResourceForm.js +1 -1
  15. package/dist/common/SSOCallback.js +1 -1
  16. package/dist/common/withRedirect.js +1 -1
  17. package/dist/components/APIKeys/APIKeys.js +1 -1
  18. package/dist/components/APIKeys/RevokeAPIKeyConfirmationModal.js +1 -1
  19. package/dist/components/Checkout/CheckoutComplete.js +1 -1
  20. package/dist/components/Checkout/CheckoutForm.js +1 -1
  21. package/dist/components/Checkout/CheckoutPage.js +1 -1
  22. package/dist/components/Checkout/parts.js +1 -1
  23. package/dist/components/CreateOrganization/CreateOrganizationForm.js +1 -1
  24. package/dist/components/CreateOrganization/CreateOrganizationPage.js +1 -1
  25. package/dist/components/ImpersonationFab/index.js +1 -1
  26. package/dist/components/OAuthConsent/OAuthConsent.js +1 -1
  27. package/dist/components/OrganizationList/UserInvitationList.js +1 -1
  28. package/dist/components/OrganizationList/UserMembershipList.js +1 -1
  29. package/dist/components/OrganizationList/UserSuggestionList.js +1 -1
  30. package/dist/components/OrganizationProfile/ActionConfirmationPage.js +1 -1
  31. package/dist/components/OrganizationProfile/ActiveMembersList.js +1 -1
  32. package/dist/components/OrganizationProfile/AddDomainForm.js +1 -1
  33. package/dist/components/OrganizationProfile/DomainList.js +1 -1
  34. package/dist/components/OrganizationProfile/InviteMembersForm.js +3 -3
  35. package/dist/components/OrganizationProfile/InviteMembersForm.js.map +1 -1
  36. package/dist/components/OrganizationProfile/InviteMembersScreen.js +1 -1
  37. package/dist/components/OrganizationProfile/InvitedMembersList.js +1 -1
  38. package/dist/components/OrganizationProfile/MembersSearch.js.map +1 -1
  39. package/dist/components/OrganizationProfile/OrganizationAPIKeysPage.js +1 -1
  40. package/dist/components/OrganizationProfile/OrganizationGeneralPage.js +1 -1
  41. package/dist/components/OrganizationProfile/OrganizationMembers.js +1 -1
  42. package/dist/components/OrganizationProfile/OrganizationProfileNavbar.js +1 -1
  43. package/dist/components/OrganizationProfile/ProfileForm.js +1 -1
  44. package/dist/components/OrganizationProfile/RemoveDomainForm.js +1 -1
  45. package/dist/components/OrganizationProfile/RequestToJoinList.js +1 -1
  46. package/dist/components/OrganizationProfile/VerifiedDomainForm.js +1 -1
  47. package/dist/components/OrganizationProfile/VerifyDomainForm.js +1 -1
  48. package/dist/components/OrganizationProfile/index.js +1 -1
  49. package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js +6 -3
  50. package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js.map +1 -1
  51. package/dist/components/OrganizationSwitcher/OrganizationSwitcherTrigger.js +1 -1
  52. package/dist/components/OrganizationSwitcher/UserInvitationSuggestionList.js +1 -1
  53. package/dist/components/OrganizationSwitcher/UserMembershipList.js +1 -1
  54. package/dist/components/PaymentMethods/AddPaymentMethod.js +1 -1
  55. package/dist/components/PaymentMethods/PaymentMethods.js +1 -1
  56. package/dist/components/PricingTable/PricingTable.js +3 -2
  57. package/dist/components/PricingTable/PricingTable.js.map +1 -1
  58. package/dist/components/PricingTable/PricingTableDefault.js +1 -1
  59. package/dist/components/SessionTasks/index.js +1 -1
  60. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.js +1 -1
  61. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.js +1 -1
  62. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/index.js +1 -1
  63. package/dist/components/SessionTasks/tasks/TaskResetPassword/index.js +2 -2
  64. package/dist/components/SessionTasks/tasks/TaskResetPassword/index.js.map +1 -1
  65. package/dist/components/SignIn/ResetPassword.js +1 -0
  66. package/dist/components/SignIn/ResetPassword.js.map +1 -1
  67. package/dist/components/SignIn/SignInClientTrust.js +49 -0
  68. package/dist/components/SignIn/SignInClientTrust.js.map +1 -0
  69. package/dist/components/SignIn/SignInFactorOne.js +1 -1
  70. package/dist/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.js +1 -1
  71. package/dist/components/SignIn/SignInFactorOneCodeForm.js +1 -1
  72. package/dist/components/SignIn/SignInFactorOneEmailLinkCard.js +1 -1
  73. package/dist/components/SignIn/SignInFactorOnePasswordCard.js +4 -3
  74. package/dist/components/SignIn/SignInFactorOnePasswordCard.js.map +1 -1
  75. package/dist/components/SignIn/SignInFactorTwo.js +3 -22
  76. package/dist/components/SignIn/SignInFactorTwo.js.map +1 -1
  77. package/dist/components/SignIn/SignInFactorTwoBackupCodeCard.js +1 -1
  78. package/dist/components/SignIn/SignInFactorTwoCodeForm.js +3 -3
  79. package/dist/components/SignIn/SignInFactorTwoCodeForm.js.map +1 -1
  80. package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js +2 -2
  81. package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js.map +1 -1
  82. package/dist/components/SignIn/SignInSocialButtons.js +1 -1
  83. package/dist/components/SignIn/SignInStart.js +3 -1
  84. package/dist/components/SignIn/SignInStart.js.map +1 -1
  85. package/dist/components/SignIn/index.js +6 -1
  86. package/dist/components/SignIn/index.js.map +1 -1
  87. package/dist/components/SignIn/shared.js +1 -1
  88. package/dist/components/SignIn/useSecondFactorSelection.js +35 -0
  89. package/dist/components/SignIn/useSecondFactorSelection.js.map +1 -0
  90. package/dist/components/SignUp/SignUpContinue.js +1 -1
  91. package/dist/components/SignUp/SignUpEmailLinkCard.js +1 -1
  92. package/dist/components/SignUp/SignUpRestrictedAccess.js +1 -1
  93. package/dist/components/SignUp/SignUpSocialButtons.js +1 -1
  94. package/dist/components/SignUp/SignUpStart.js +1 -1
  95. package/dist/components/SignUp/SignUpVerificationCodeForm.js +1 -1
  96. package/dist/components/SignUp/index.js +1 -1
  97. package/dist/components/SubscriptionDetails/index.js +1 -1
  98. package/dist/components/UserButton/UserButtonPopover.js +1 -1
  99. package/dist/components/UserButton/UserButtonTopLevelIdentifier.js +1 -1
  100. package/dist/components/UserButton/UserButtonTrigger.js +1 -1
  101. package/dist/components/UserButton/useMultisessionActions.js +7 -2
  102. package/dist/components/UserButton/useMultisessionActions.js.map +1 -1
  103. package/dist/components/UserProfile/APIKeysPage.js +1 -1
  104. package/dist/components/UserProfile/AccountPage.js +1 -1
  105. package/dist/components/UserProfile/ActiveDevicesSection.js +1 -1
  106. package/dist/components/UserProfile/AddAuthenticatorApp.js +1 -1
  107. package/dist/components/UserProfile/ConnectedAccountsMenu.js +1 -1
  108. package/dist/components/UserProfile/ConnectedAccountsSection.js +1 -1
  109. package/dist/components/UserProfile/DeleteUserForm.js +1 -1
  110. package/dist/components/UserProfile/EmailForm.js +1 -1
  111. package/dist/components/UserProfile/EmailsSection.js +1 -1
  112. package/dist/components/UserProfile/EnterpriseAccountsSection.js +1 -1
  113. package/dist/components/UserProfile/MfaBackupCodeCreateForm.js +1 -1
  114. package/dist/components/UserProfile/MfaBackupCodeList.js +1 -1
  115. package/dist/components/UserProfile/MfaForm.js +1 -1
  116. package/dist/components/UserProfile/MfaPhoneCodeScreen.js +1 -1
  117. package/dist/components/UserProfile/MfaSection.js +1 -1
  118. package/dist/components/UserProfile/PasskeySection.js +1 -1
  119. package/dist/components/UserProfile/PasswordForm.js +2 -1
  120. package/dist/components/UserProfile/PasswordForm.js.map +1 -1
  121. package/dist/components/UserProfile/PasswordSection.js +1 -1
  122. package/dist/components/UserProfile/PhoneForm.js +1 -1
  123. package/dist/components/UserProfile/PhoneSection.js +1 -1
  124. package/dist/components/UserProfile/ProfileForm.js +1 -1
  125. package/dist/components/UserProfile/RemoveResourceForm.js +1 -1
  126. package/dist/components/UserProfile/SecurityPage.js +1 -1
  127. package/dist/components/UserProfile/UserProfileSection.js +1 -1
  128. package/dist/components/UserProfile/UsernameForm.js +1 -1
  129. package/dist/components/UserProfile/UsernameSection.js +1 -1
  130. package/dist/components/UserProfile/VerifyTOTP.js +1 -1
  131. package/dist/components/UserProfile/Web3Form.js +1 -1
  132. package/dist/components/UserProfile/Web3Section.js +1 -1
  133. package/dist/components/UserVerification/UVFactorOneCodeForm.js +1 -1
  134. package/dist/components/UserVerification/UVFactorOnePasskeysCard.js +1 -1
  135. package/dist/components/UserVerification/UVFactorTwoBackupCodeCard.js +1 -1
  136. package/dist/components/UserVerification/UVFactorTwoCodeForm.js +1 -1
  137. package/dist/components/UserVerification/UVFactorTwoPhoneCodeCard.js +1 -1
  138. package/dist/components/UserVerification/UserVerificationFactorOnePassword.js +1 -1
  139. package/dist/components/UserVerification/UserVerificationFactorTwo.js +4 -20
  140. package/dist/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
  141. package/dist/components/UserVerification/useUserVerificationSession.js +1 -1
  142. package/dist/components/Waitlist/WaitlistForm.js +1 -1
  143. package/dist/components/Waitlist/index.js +1 -1
  144. package/dist/components/devPrompts/EnableOrganizationsPrompt/index.js +1 -1
  145. package/dist/components/devPrompts/KeylessPrompt/index.js +1 -1
  146. package/dist/contexts/CoreClerkContextWrapper.js +1 -1
  147. package/dist/contexts/CoreSessionContext.js +1 -1
  148. package/dist/contexts/CoreUserContext.js +1 -1
  149. package/dist/{createorganization_ui_03abd0_1.0.0-snapshot.v20251208202852.js → createorganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  150. package/dist/customizables/AppearanceContext.js +1 -1
  151. package/dist/elements/Action/ActionRoot.js +1 -1
  152. package/dist/elements/AvatarUploader.js +14 -4
  153. package/dist/elements/AvatarUploader.js.map +1 -1
  154. package/dist/elements/CodeControl.js +1 -1
  155. package/dist/elements/Drawer.js +8 -2
  156. package/dist/elements/Drawer.js.map +1 -1
  157. package/dist/elements/Form.js +1 -1
  158. package/dist/elements/Menu.js +1 -1
  159. package/dist/elements/Modal.js +3 -2
  160. package/dist/elements/Modal.js.map +1 -1
  161. package/dist/elements/Navbar.js +1 -1
  162. package/dist/elements/PhoneInput/countryCodeData.js +34 -9
  163. package/dist/elements/PhoneInput/countryCodeData.js.map +1 -1
  164. package/dist/elements/PhoneInput/index.js +1 -1
  165. package/dist/elements/Popover.js +4 -1
  166. package/dist/elements/Popover.js.map +1 -1
  167. package/dist/elements/Select.js +1 -1
  168. package/dist/elements/SocialButtons.js +1 -1
  169. package/dist/elements/Tabs.js +1 -1
  170. package/dist/elements/TimerButton.js +1 -1
  171. package/dist/elements/Tooltip.js +29 -24
  172. package/dist/elements/Tooltip.js.map +1 -1
  173. package/dist/elements/contexts/index.js +1 -1
  174. package/dist/{enableOrganizationsPrompt_ui_03abd0_1.0.0-snapshot.v20251208202852.js → enableOrganizationsPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  175. package/dist/foundations/defaultFoundations.d.ts +153 -153
  176. package/dist/hooks/useFetchRoles.js.map +1 -1
  177. package/dist/{impersonationfab_ui_03abd0_1.0.0-snapshot.v20251208202852.js → impersonationfab_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  178. package/dist/index.js +1 -1
  179. package/dist/internal/index.js +2 -2
  180. package/dist/internal/index.js.map +1 -1
  181. package/dist/{keylessPrompt_ui_03abd0_1.0.0-snapshot.v20251208202852.js → keylessPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  182. package/dist/lazyModules/MountedCheckoutDrawer.js +1 -1
  183. package/dist/lazyModules/MountedPlanDetailDrawer.js +1 -1
  184. package/dist/lazyModules/MountedSubscriptionDetailDrawer.js +1 -1
  185. package/dist/lazyModules/components.d.ts +20 -20
  186. package/dist/lazyModules/providers.js +24 -17
  187. package/dist/lazyModules/providers.js.map +1 -1
  188. package/dist/{oauthConsent_ui_03abd0_1.0.0-snapshot.v20251208202852.js → oauthConsent_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  189. package/dist/{onetap_ui_03abd0_1.0.0-snapshot.v20251208202852.js → onetap_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  190. 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
  191. package/dist/{organizationlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → organizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  192. package/dist/organizationprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  193. package/dist/organizationswitcher_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  194. 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
  195. package/dist/{planDetails_ui_03abd0_1.0.0-snapshot.v20251208202852.js → planDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  196. package/dist/{prefetchorganizationlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → prefetchorganizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  197. package/dist/{pricingTable_ui_03abd0_1.0.0-snapshot.v20251208202852.js → pricingTable_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  198. package/dist/primitives/hooks/useFormField.js +1 -1
  199. 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
  200. package/dist/router/BaseRouter.js +1 -1
  201. package/dist/router/PathRouter.js +1 -1
  202. package/dist/router/Route.js +1 -1
  203. package/dist/router/VirtualRouter.js +1 -1
  204. package/dist/{sessionTasks_ui_03abd0_1.0.0-snapshot.v20251208202852.js → sessionTasks_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  205. package/dist/signin_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  206. package/dist/{signup_ui_03abd0_1.0.0-snapshot.v20251208202852.js → signup_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  207. package/dist/{statement-page_ui_03abd0_1.0.0-snapshot.v20251208202852.js → statement-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  208. package/dist/{subscriptionDetails_ui_03abd0_1.0.0-snapshot.v20251208202852.js → subscriptionDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  209. package/dist/{taskChooseOrganization_ui_03abd0_1.0.0-snapshot.v20251208202852.js → taskChooseOrganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  210. package/dist/taskResetPassword_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  211. package/dist/ui-common_ui_e1841e_1.0.0-snapshot.v20251215203425.js +122 -0
  212. package/dist/ui.browser.js +20 -3
  213. 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
  214. package/dist/{useravatar_ui_03abd0_1.0.0-snapshot.v20251208202852.js → useravatar_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  215. package/dist/{userbutton_ui_03abd0_1.0.0-snapshot.v20251208202852.js → userbutton_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  216. package/dist/{userprofile_ui_03abd0_1.0.0-snapshot.v20251208202852.js → userprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +2 -2
  217. package/dist/userverification_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  218. package/dist/vendors_ui_e1841e_1.0.0-snapshot.v20251215203425.js +20 -0
  219. package/dist/{waitlist_ui_03abd0_1.0.0-snapshot.v20251208202852.js → waitlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  220. package/package.json +5 -4
  221. package/dist/organizationprofile_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
  222. package/dist/organizationswitcher_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
  223. package/dist/signin_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
  224. package/dist/taskResetPassword_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
  225. package/dist/ui-common_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -139
  226. package/dist/userverification_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -1
  227. package/dist/vendors_ui_03abd0_1.0.0-snapshot.v20251208202852.js +0 -20
  228. /package/dist/{blankcaptcha_ui_03abd0_1.0.0-snapshot.v20251208202852.js → blankcaptcha_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  229. /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
  230. /package/dist/{framework_ui_03abd0_1.0.0-snapshot.v20251208202852.js → framework_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  231. /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
  232. /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
  233. /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
  234. /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 void navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n case 'needs_second_factor':\n return navigate('../factor-two');\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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"}
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":";;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,sBAAsB,UAAwC;CAClE,MAAM,EAAE,6BAA6B,kCAAkC;CACvE,MAAM,sBAAsB,wBAAwB;CAEpD,MAAM,kBAAkB,eAAe,YAAY,IAAI;EACrD,MAAM;EACN,OAAO,iBAAiB,2BAA2B;EACnD,aAAa,iBAAiB,sCAAsC;EACrE,CAAC;AAEF,QAAO;EACL,GAAG;EACH,OAAO;GACL,GAAG,gBAAgB;GACnB,aACE,uBAAuB,gCAAgC,iBAAiB,kCAAkC,GAAG;GAC/G,iBAAiB,8BACb,8BACA,gCACE,sCACM;GACb;EACF;;AAGH,MAAa,+BAA+B,UAAwC;CAClF,MAAM,EAAE,+BAA+B,oBAAoB;CAC3D,MAAM,mBAAmB,MAAM,OAAyB,KAAK;CAC7D,MAAM,OAAO,cAAc;CAC3B,MAAM,EAAE,cAAc,UAAU;CAChC,MAAM,SAAS,eAAe;CAC9B,MAAM,EAAE,gBAAgB,wBAAwB,kBAAkB;CAClE,MAAM,eAAe,iBAAiB;CACtC,MAAM,kBAAkB,mBAAmB,MAAM;CACjD,MAAM,EAAE,aAAa,WAAW;CAChC,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,SAAS,MAAM;CACvE,MAAM,sBAAsB,MAAM,kBAAkB,sBAAqB,MAAK,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC;CAC1G,MAAM,QAAQ,UAAU;CAExB,MAAM,eAAe;AACnB,EAAK,SAAS,MAAM;;CAGtB,MAAMA,wBAAgE,MAAK;AACzE,IAAE,gBAAgB;AAClB,EAAK,OACF,mBAAmB;GAAE,UAAU;GAAY,UAAU,gBAAgB;GAAO,CAAC,CAC7E,MAAK,QAAO;AACX,WAAQ,IAAI,QAAZ;IACE,KAAK,WACH,QAAO,UAAU;KACf,SAAS,IAAI;KACb,WAAW,EAAE,cAAc;AACzB,aAAO,oBAAoB;OAAE;OAAS,aAAa;OAAgB,CAAC;;KAEvE,CAAC;IACJ,KAAK,sBACH,QAAO,SAAS,gBAAgB;IAClC,KAAK,qBACH,QAAO,SAAS,kBAAkB;IACpC,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,OAAI,iBAAiB;AACnB,QAAI,qBAAqB,IAAI,EAAE;AAC7B,UAAK,SAAS;MAAE,GAAG,IAAI,OAAO;MAAI,MAAM;MAAgC,CAAC;AACzE,qBAAgB,QAAQ;AACxB;;AAGF,QAAI,2BAA2B,IAAI,EAAE;AACnC,UAAK,SAAS;MAAE,GAAG,IAAI,OAAO;MAAI,MAAM;MAAsC,CAAC;AAC/E,qBAAgB,cAAc;AAC9B;;;AAIJ,eAAY,KAAK,CAAC,gBAAgB,EAAE,KAAK,SAAS;AAElD,oBAAiB,iBAAiB,SAAS,OAAO,EAAE,EAAE;IACtD;;AAGN,KAAI,kBACF,QAAO,oBAAC,iBAAc,iBAAiB,sBAAuB;AAGhE,QACE,oBAAC,KAAK;EAAK,MAAK;YACd,qBAAC,KAAK,mBACJ,qBAAC,KAAK;GACJ,qBAAC,OAAO;IAAK;;KACX,oBAAC,OAAO,SAAM,iBAAiB,iBAAiB,wBAAwB,GAAI;KAC5E,oBAAC,OAAO,YAAS,iBAAiB,iBAAiB,2BAA2B,GAAI;KAClF,oBAAC;MACC,YAAY,OAAO;MACnB,WAAW,OAAO,SAAS;MAC3B,SAAS;OACT;;KACU;GACd,oBAAC,KAAK,mBAAO,KAAK,QAAmB;GAErC,qBAAC;IACC,WAAU;IACV,mBAAmB,YAAY;IAC/B,KAAK;eAEL,qBAAC,KAAK;KACJ,UAAU;KACV,KAAK;;MAGL,oBAAC;OACC;OACA,IAAG;OACH,MAAK;OACL,OAAO,OAAO,cAAc;OAC5B,OAAO,EAAE,SAAS,QAAQ;QAC1B;MACF,oBAAC,KAAK;OAAW,WAAW,gBAAgB;iBAC1C,oBAAC,KAAK;QACJ,GAAI,gBAAgB;QACpB,KAAK;QACL;SACA;QACc;MAClB,oBAAC,KAAK,gBAAa,iBAAW;;MACpB,EACZ,oBAAC,KAAK;KAAO,WAAW,gCAAgC,uBAAuB;eAC7E,oBAAC,KAAK;MACJ,iBAAiB,iBACf,gCAAgC,+BAA+B,uCAChE;MACD,SAAS,iCAAiC;OAC1C;MACU;KACT;MACM,EAEf,oBAAC,KAAK,WAAS,IACL;GACF"}
@@ -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 availableFactors = useCoreSignIn().supportedSecondFactors;
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 type { SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { 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 { determineStartingSignInSecondFactor } from './utils';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nfunction SignInFactorTwoInternal(): JSX.Element {\n const signIn = useCoreSignIn();\n const availableFactors = signIn.supportedSecondFactors;\n\n const lastPreparedFactorKeyRef = React.useRef('');\n const [currentFactor, setCurrentFactor] = React.useState<SignInFactor | null>(() =>\n determineStartingSignInSecondFactor(availableFactors),\n );\n const [showAllStrategies, setShowAllStrategies] = React.useState<boolean>(!currentFactor);\n const toggleAllStrategies = () => setShowAllStrategies(s => !s);\n\n const handleFactorPrepare = () => {\n lastPreparedFactorKeyRef.current = factorKey(currentFactor);\n };\n\n const selectFactor = (factor: SignInFactor) => {\n setCurrentFactor(factor);\n toggleAllStrategies();\n };\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 const factorAlreadyPrepared = lastPreparedFactorKeyRef.current === factorKey(currentFactor);\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":";;;;;;;;;;;;;;;AAgBA,MAAM,aAAa,WAA4C;AAC7D,KAAI,CAAC,OACH,QAAO;CAET,IAAI,MAAM,OAAO;AACjB,KAAI,mBAAmB,OACrB,QAAO,OAAO;AAEhB,QAAO;;AAGT,SAAS,0BAAuC;CAE9C,MAAM,mBADS,eAAe,CACE;CAEhC,MAAM,2BAA2B,MAAM,OAAO,GAAG;CACjD,MAAM,CAAC,eAAe,oBAAoB,MAAM,eAC9C,oCAAoC,iBAAiB,CACtD;CACD,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,SAAkB,CAAC,cAAc;CACzF,MAAM,4BAA4B,sBAAqB,MAAK,CAAC,EAAE;CAE/D,MAAM,4BAA4B;AAChC,2BAAyB,UAAU,UAAU,cAAc;;CAG7D,MAAM,gBAAgB,WAAyB;AAC7C,mBAAiB,OAAO;AACxB,uBAAqB;;AAGvB,KAAI,CAAC,cACH,QAAO,oBAAC,gBAAc;AAGxB,KAAI,kBACF,QACE,oBAAC;EACC,iBAAiB;EACjB,kBAAkB;GAClB;CAIN,MAAM,wBAAwB,yBAAyB,YAAY,UAAU,cAAc;AAC3F,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"}
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 ? localizationKeys('signIn.newDeviceVerificationNotice') : undefined}\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":";;;;;;;;;;;;;;;;;;AAgCA,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;CAIxB,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,YAAY,kCAAkC,iBAAiB,qCAAqC,GAAG;EACvG,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"}
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) ? localizationKeys('signIn.newDeviceVerificationNotice') : undefined}\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":";;;;;;;;;;;;;;;;;AAsBA,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,YAAY,YAAY,OAAO,GAAG,iBAAiB,qCAAqC,GAAG;GAC3F,cAAc,iBAAiB,mCAAmC;GAClE,cAAc,iBAAiB,mCAAmC;GAClE,qBAAqB;GACrB,gBAAgB,MAAM,OAAO;GAC7B,iBAAiB,OAAO,SAAS;GACjC,iCAAiC,MAAM;IACvC;GACQ"}
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 }) => {