@clerk/ui 1.0.0-snapshot.v20251211120550 → 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 (219) hide show
  1. package/dist/{207_ui_a492c4_1.0.0-snapshot.v20251211120550.js → 207_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  2. package/dist/{217_ui_a492c4_1.0.0-snapshot.v20251211120550.js → 217_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  3. package/dist/{360_ui_a492c4_1.0.0-snapshot.v20251211120550.js → 360_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  4. package/dist/{444_ui_a492c4_1.0.0-snapshot.v20251211120550.js → 444_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  5. package/dist/{573_ui_a492c4_1.0.0-snapshot.v20251211120550.js → 573_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  6. package/dist/{970_ui_a492c4_1.0.0-snapshot.v20251211120550.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_a492c4_1.0.0-snapshot.v20251211120550.js → apiKeys_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  11. package/dist/{checkout_ui_a492c4_1.0.0-snapshot.v20251211120550.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 +1 -1
  35. package/dist/components/OrganizationProfile/InviteMembersScreen.js +1 -1
  36. package/dist/components/OrganizationProfile/InvitedMembersList.js +1 -1
  37. package/dist/components/OrganizationProfile/OrganizationAPIKeysPage.js +1 -1
  38. package/dist/components/OrganizationProfile/OrganizationGeneralPage.js +1 -1
  39. package/dist/components/OrganizationProfile/OrganizationMembers.js +1 -1
  40. package/dist/components/OrganizationProfile/OrganizationProfileNavbar.js +1 -1
  41. package/dist/components/OrganizationProfile/ProfileForm.js +1 -1
  42. package/dist/components/OrganizationProfile/RemoveDomainForm.js +1 -1
  43. package/dist/components/OrganizationProfile/RequestToJoinList.js +1 -1
  44. package/dist/components/OrganizationProfile/VerifiedDomainForm.js +1 -1
  45. package/dist/components/OrganizationProfile/VerifyDomainForm.js +1 -1
  46. package/dist/components/OrganizationProfile/index.js +1 -1
  47. package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js +6 -3
  48. package/dist/components/OrganizationSwitcher/OrganizationSwitcherPopover.js.map +1 -1
  49. package/dist/components/OrganizationSwitcher/OrganizationSwitcherTrigger.js +1 -1
  50. package/dist/components/OrganizationSwitcher/UserInvitationSuggestionList.js +1 -1
  51. package/dist/components/OrganizationSwitcher/UserMembershipList.js +1 -1
  52. package/dist/components/PaymentMethods/AddPaymentMethod.js +1 -1
  53. package/dist/components/PaymentMethods/PaymentMethods.js +1 -1
  54. package/dist/components/PricingTable/PricingTable.js +3 -2
  55. package/dist/components/PricingTable/PricingTable.js.map +1 -1
  56. package/dist/components/PricingTable/PricingTableDefault.js +1 -1
  57. package/dist/components/SessionTasks/index.js +1 -1
  58. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/ChooseOrganizationScreen.js +1 -1
  59. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/CreateOrganizationScreen.js +1 -1
  60. package/dist/components/SessionTasks/tasks/TaskChooseOrganization/index.js +1 -1
  61. package/dist/components/SessionTasks/tasks/TaskResetPassword/index.js +1 -1
  62. package/dist/components/SignIn/SignInClientTrust.js +49 -0
  63. package/dist/components/SignIn/SignInClientTrust.js.map +1 -0
  64. package/dist/components/SignIn/SignInFactorOne.js +1 -1
  65. package/dist/components/SignIn/SignInFactorOneAlternativeChannelCodeForm.js +1 -1
  66. package/dist/components/SignIn/SignInFactorOneCodeForm.js +1 -1
  67. package/dist/components/SignIn/SignInFactorOneEmailLinkCard.js +1 -1
  68. package/dist/components/SignIn/SignInFactorOnePasswordCard.js +4 -3
  69. package/dist/components/SignIn/SignInFactorOnePasswordCard.js.map +1 -1
  70. package/dist/components/SignIn/SignInFactorTwo.js +3 -22
  71. package/dist/components/SignIn/SignInFactorTwo.js.map +1 -1
  72. package/dist/components/SignIn/SignInFactorTwoBackupCodeCard.js +1 -1
  73. package/dist/components/SignIn/SignInFactorTwoCodeForm.js +3 -3
  74. package/dist/components/SignIn/SignInFactorTwoCodeForm.js.map +1 -1
  75. package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js +2 -2
  76. package/dist/components/SignIn/SignInFactorTwoEmailLinkCard.js.map +1 -1
  77. package/dist/components/SignIn/SignInSocialButtons.js +1 -1
  78. package/dist/components/SignIn/SignInStart.js +3 -1
  79. package/dist/components/SignIn/SignInStart.js.map +1 -1
  80. package/dist/components/SignIn/index.js +6 -1
  81. package/dist/components/SignIn/index.js.map +1 -1
  82. package/dist/components/SignIn/shared.js +1 -1
  83. package/dist/components/SignIn/useSecondFactorSelection.js +35 -0
  84. package/dist/components/SignIn/useSecondFactorSelection.js.map +1 -0
  85. package/dist/components/SignUp/SignUpContinue.js +1 -1
  86. package/dist/components/SignUp/SignUpEmailLinkCard.js +1 -1
  87. package/dist/components/SignUp/SignUpRestrictedAccess.js +1 -1
  88. package/dist/components/SignUp/SignUpSocialButtons.js +1 -1
  89. package/dist/components/SignUp/SignUpStart.js +1 -1
  90. package/dist/components/SignUp/SignUpVerificationCodeForm.js +1 -1
  91. package/dist/components/SignUp/index.js +1 -1
  92. package/dist/components/SubscriptionDetails/index.js +1 -1
  93. package/dist/components/UserButton/UserButtonPopover.js +1 -1
  94. package/dist/components/UserButton/UserButtonTopLevelIdentifier.js +1 -1
  95. package/dist/components/UserButton/UserButtonTrigger.js +1 -1
  96. package/dist/components/UserButton/useMultisessionActions.js +7 -2
  97. package/dist/components/UserButton/useMultisessionActions.js.map +1 -1
  98. package/dist/components/UserProfile/APIKeysPage.js +1 -1
  99. package/dist/components/UserProfile/AccountPage.js +1 -1
  100. package/dist/components/UserProfile/ActiveDevicesSection.js +1 -1
  101. package/dist/components/UserProfile/AddAuthenticatorApp.js +1 -1
  102. package/dist/components/UserProfile/ConnectedAccountsMenu.js +1 -1
  103. package/dist/components/UserProfile/ConnectedAccountsSection.js +1 -1
  104. package/dist/components/UserProfile/DeleteUserForm.js +1 -1
  105. package/dist/components/UserProfile/EmailForm.js +1 -1
  106. package/dist/components/UserProfile/EmailsSection.js +1 -1
  107. package/dist/components/UserProfile/EnterpriseAccountsSection.js +1 -1
  108. package/dist/components/UserProfile/MfaBackupCodeCreateForm.js +1 -1
  109. package/dist/components/UserProfile/MfaBackupCodeList.js +1 -1
  110. package/dist/components/UserProfile/MfaForm.js +1 -1
  111. package/dist/components/UserProfile/MfaPhoneCodeScreen.js +1 -1
  112. package/dist/components/UserProfile/MfaSection.js +1 -1
  113. package/dist/components/UserProfile/PasskeySection.js +1 -1
  114. package/dist/components/UserProfile/PasswordForm.js +1 -1
  115. package/dist/components/UserProfile/PasswordSection.js +1 -1
  116. package/dist/components/UserProfile/PhoneForm.js +1 -1
  117. package/dist/components/UserProfile/PhoneSection.js +1 -1
  118. package/dist/components/UserProfile/ProfileForm.js +1 -1
  119. package/dist/components/UserProfile/RemoveResourceForm.js +1 -1
  120. package/dist/components/UserProfile/SecurityPage.js +1 -1
  121. package/dist/components/UserProfile/UserProfileSection.js +1 -1
  122. package/dist/components/UserProfile/UsernameForm.js +1 -1
  123. package/dist/components/UserProfile/UsernameSection.js +1 -1
  124. package/dist/components/UserProfile/VerifyTOTP.js +1 -1
  125. package/dist/components/UserProfile/Web3Form.js +1 -1
  126. package/dist/components/UserProfile/Web3Section.js +1 -1
  127. package/dist/components/UserVerification/UVFactorOneCodeForm.js +1 -1
  128. package/dist/components/UserVerification/UVFactorOnePasskeysCard.js +1 -1
  129. package/dist/components/UserVerification/UVFactorTwoBackupCodeCard.js +1 -1
  130. package/dist/components/UserVerification/UVFactorTwoCodeForm.js +1 -1
  131. package/dist/components/UserVerification/UVFactorTwoPhoneCodeCard.js +1 -1
  132. package/dist/components/UserVerification/UserVerificationFactorOnePassword.js +1 -1
  133. package/dist/components/UserVerification/UserVerificationFactorTwo.js +4 -20
  134. package/dist/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
  135. package/dist/components/UserVerification/useUserVerificationSession.js +1 -1
  136. package/dist/components/Waitlist/WaitlistForm.js +1 -1
  137. package/dist/components/Waitlist/index.js +1 -1
  138. package/dist/components/devPrompts/EnableOrganizationsPrompt/index.js +1 -1
  139. package/dist/components/devPrompts/KeylessPrompt/index.js +1 -1
  140. package/dist/contexts/CoreClerkContextWrapper.js +1 -1
  141. package/dist/contexts/CoreSessionContext.js +1 -1
  142. package/dist/contexts/CoreUserContext.js +1 -1
  143. package/dist/{createorganization_ui_a492c4_1.0.0-snapshot.v20251211120550.js → createorganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  144. package/dist/customizables/AppearanceContext.js +1 -1
  145. package/dist/elements/Action/ActionRoot.js +1 -1
  146. package/dist/elements/CodeControl.js +1 -1
  147. package/dist/elements/Drawer.js +8 -2
  148. package/dist/elements/Drawer.js.map +1 -1
  149. package/dist/elements/Form.js +1 -1
  150. package/dist/elements/Menu.js +1 -1
  151. package/dist/elements/Modal.js +3 -2
  152. package/dist/elements/Modal.js.map +1 -1
  153. package/dist/elements/Navbar.js +1 -1
  154. package/dist/elements/PhoneInput/index.js +1 -1
  155. package/dist/elements/Popover.js +4 -1
  156. package/dist/elements/Popover.js.map +1 -1
  157. package/dist/elements/Select.js +1 -1
  158. package/dist/elements/SocialButtons.js +1 -1
  159. package/dist/elements/Tabs.js +1 -1
  160. package/dist/elements/TimerButton.js +1 -1
  161. package/dist/elements/Tooltip.js +29 -24
  162. package/dist/elements/Tooltip.js.map +1 -1
  163. package/dist/elements/contexts/index.js +1 -1
  164. package/dist/{enableOrganizationsPrompt_ui_a492c4_1.0.0-snapshot.v20251211120550.js → enableOrganizationsPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  165. package/dist/{impersonationfab_ui_a492c4_1.0.0-snapshot.v20251211120550.js → impersonationfab_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  166. package/dist/index.js +1 -1
  167. package/dist/internal/index.js +1 -1
  168. package/dist/{keylessPrompt_ui_a492c4_1.0.0-snapshot.v20251211120550.js → keylessPrompt_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  169. package/dist/lazyModules/MountedCheckoutDrawer.js +1 -1
  170. package/dist/lazyModules/MountedPlanDetailDrawer.js +1 -1
  171. package/dist/lazyModules/MountedSubscriptionDetailDrawer.js +1 -1
  172. package/dist/lazyModules/providers.js +24 -17
  173. package/dist/lazyModules/providers.js.map +1 -1
  174. package/dist/{oauthConsent_ui_a492c4_1.0.0-snapshot.v20251211120550.js → oauthConsent_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  175. package/dist/{onetap_ui_a492c4_1.0.0-snapshot.v20251211120550.js → onetap_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  176. package/dist/{op-api-keys-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → op-api-keys-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  177. package/dist/{organizationlist_ui_a492c4_1.0.0-snapshot.v20251211120550.js → organizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  178. package/dist/organizationprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  179. package/dist/organizationswitcher_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  180. package/dist/{payment-attempt-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → payment-attempt-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  181. package/dist/{planDetails_ui_a492c4_1.0.0-snapshot.v20251211120550.js → planDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  182. package/dist/{prefetchorganizationlist_ui_a492c4_1.0.0-snapshot.v20251211120550.js → prefetchorganizationlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  183. package/dist/{pricingTable_ui_a492c4_1.0.0-snapshot.v20251211120550.js → pricingTable_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  184. package/dist/primitives/hooks/useFormField.js +1 -1
  185. package/dist/{revoke-api-key-modal_ui_a492c4_1.0.0-snapshot.v20251211120550.js → revoke-api-key-modal_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  186. package/dist/router/BaseRouter.js +1 -1
  187. package/dist/router/PathRouter.js +1 -1
  188. package/dist/router/Route.js +1 -1
  189. package/dist/router/VirtualRouter.js +1 -1
  190. package/dist/{sessionTasks_ui_a492c4_1.0.0-snapshot.v20251211120550.js → sessionTasks_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  191. package/dist/signin_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  192. package/dist/{signup_ui_a492c4_1.0.0-snapshot.v20251211120550.js → signup_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  193. package/dist/{statement-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → statement-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  194. package/dist/{subscriptionDetails_ui_a492c4_1.0.0-snapshot.v20251211120550.js → subscriptionDetails_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  195. package/dist/{taskChooseOrganization_ui_a492c4_1.0.0-snapshot.v20251211120550.js → taskChooseOrganization_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  196. package/dist/{taskResetPassword_ui_a492c4_1.0.0-snapshot.v20251211120550.js → taskResetPassword_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  197. package/dist/ui-common_ui_e1841e_1.0.0-snapshot.v20251215203425.js +122 -0
  198. package/dist/ui.browser.js +20 -3
  199. package/dist/{up-api-keys-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → up-api-keys-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  200. package/dist/{useravatar_ui_a492c4_1.0.0-snapshot.v20251211120550.js → useravatar_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  201. package/dist/{userbutton_ui_a492c4_1.0.0-snapshot.v20251211120550.js → userbutton_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  202. package/dist/{userprofile_ui_a492c4_1.0.0-snapshot.v20251211120550.js → userprofile_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +2 -2
  203. package/dist/userverification_ui_e1841e_1.0.0-snapshot.v20251215203425.js +1 -0
  204. package/dist/vendors_ui_e1841e_1.0.0-snapshot.v20251215203425.js +20 -0
  205. package/dist/{waitlist_ui_a492c4_1.0.0-snapshot.v20251211120550.js → waitlist_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +1 -1
  206. package/package.json +3 -3
  207. package/dist/organizationprofile_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -1
  208. package/dist/organizationswitcher_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -1
  209. package/dist/signin_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -1
  210. package/dist/ui-common_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -139
  211. package/dist/userverification_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -1
  212. package/dist/vendors_ui_a492c4_1.0.0-snapshot.v20251211120550.js +0 -20
  213. /package/dist/{blankcaptcha_ui_a492c4_1.0.0-snapshot.v20251211120550.js → blankcaptcha_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  214. /package/dist/{copy-api-key-modal_ui_a492c4_1.0.0-snapshot.v20251211120550.js → copy-api-key-modal_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  215. /package/dist/{framework_ui_a492c4_1.0.0-snapshot.v20251211120550.js → framework_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  216. /package/dist/{op-billing-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → op-billing-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  217. /package/dist/{op-plans-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → op-plans-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  218. /package/dist/{up-billing-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → up-billing-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
  219. /package/dist/{up-plans-page_ui_a492c4_1.0.0-snapshot.v20251211120550.js → up-plans-page_ui_e1841e_1.0.0-snapshot.v20251215203425.js} +0 -0
@@ -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":"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"}
@@ -2,42 +2,23 @@ import { useCoreSignIn } from "../../contexts/CoreClientContext.js";
2
2
  import { withCardStateProvider } from "../../elements/contexts/index.js";
3
3
  import { LoadingCard } from "../../elements/LoadingCard.js";
4
4
  import { withRedirectToAfterSignIn, withRedirectToSignInTask } from "../../common/withRedirect.js";
5
- import { determineStartingSignInSecondFactor } from "./utils.js";
6
5
  import { SignInFactorTwoAlternativeMethods } from "./SignInFactorTwoAlternativeMethods.js";
7
- import { SignInFactorTwoBackupCodeCard } from "./SignInFactorTwoBackupCodeCard.js";
8
6
  import { SignInFactorTwoEmailCodeCard } from "./SignInFactorTwoEmailCodeCard.js";
9
7
  import { SignInFactorTwoEmailLinkCard } from "./SignInFactorTwoEmailLinkCard.js";
10
8
  import { SignInFactorTwoPhoneCodeCard } from "./SignInFactorTwoPhoneCodeCard.js";
9
+ import { useSecondFactorSelection } from "./useSecondFactorSelection.js";
10
+ import { SignInFactorTwoBackupCodeCard } from "./SignInFactorTwoBackupCodeCard.js";
11
11
  import { SignInFactorTwoTOTPCard } from "./SignInFactorTwoTOTPCard.js";
12
- import React from "react";
13
12
  import { jsx } from "@emotion/react/jsx-runtime";
14
13
 
15
14
  //#region src/components/SignIn/SignInFactorTwo.tsx
16
- const factorKey = (factor) => {
17
- if (!factor) return "";
18
- let key = factor.strategy;
19
- if ("phoneNumberId" in factor) key += factor.phoneNumberId;
20
- return key;
21
- };
22
15
  function SignInFactorTwoInternal() {
23
- const 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 }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SignInStart.js","names":["initialValues: Record<SignInStartIdentifier, string | undefined>","e: any","instantPasswordError: ClerkAPIError","e","sessionAlreadyExistsError: ClerkAPIError","alreadySignedInError: ClerkAPIError","accountDoesNotExistError: ClerkAPIError","isWebAuthnAutofillSupported","autofilled"],"sources":["../../../src/components/SignIn/SignInStart.tsx"],"sourcesContent":["import { getAlternativePhoneCodeProviderData } from '@clerk/shared/alternativePhoneCode';\nimport { ERROR_CODES, SIGN_UP_MODES } from '@clerk/shared/internal/clerk-js/constants';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { getClerkQueryParam, removeClerkQueryParam } from '@clerk/shared/internal/clerk-js/queryParams';\nimport { useClerk } from '@clerk/shared/react';\nimport type {\n ClerkAPIError,\n PhoneCodeChannel,\n PhoneCodeChannelData,\n SignInCreateParams,\n SignInResource,\n} from '@clerk/shared/types';\nimport { isWebAuthnAutofillSupported, isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } 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 { LoadingCard } from '@/ui/elements/LoadingCard';\nimport { SocialButtonsReversibleContainerWithDivider } from '@/ui/elements/ReversibleContainer';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { isMobileDevice } from '@/ui/utils/isMobileDevice';\nimport type { FormControlState } from '@/ui/utils/useFormControl';\nimport { buildRequest, useFormControl } from '@/ui/utils/useFormControl';\n\nimport type { SignInStartIdentifier } from '../../common';\nimport {\n buildSSOCallbackURL,\n getIdentifierControlDisplayValues,\n groupIdentifiers,\n withRedirectToAfterSignIn,\n withRedirectToSignInTask,\n} from '../../common';\nimport { useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';\nimport { Col, descriptors, Flow, localizationKeys } from '../../customizables';\nimport { CaptchaElement } from '../../elements/CaptchaElement';\nimport { useLoadingStatus } from '../../hooks';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useTotalEnabledAuthMethods } from '../../hooks/useTotalEnabledAuthMethods';\nimport { useRouter } from '../../router';\nimport { handleCombinedFlowTransfer } from './handleCombinedFlowTransfer';\nimport { hasMultipleEnterpriseConnections, useHandleAuthenticateWithPasskey } from './shared';\nimport { SignInAlternativePhoneCodePhoneNumberCard } from './SignInAlternativePhoneCodePhoneNumberCard';\nimport { SignInSocialButtons } from './SignInSocialButtons';\nimport {\n getPreferredAlternativePhoneChannel,\n getPreferredAlternativePhoneChannelForCombinedFlow,\n getSignUpAttributeFromIdentifier,\n} from './utils';\n\nconst useAutoFillPasskey = () => {\n const [isSupported, setIsSupported] = useState(false);\n const { navigate } = useRouter();\n const onSecondFactor = () => navigate('factor-two');\n const authenticateWithPasskey = useHandleAuthenticateWithPasskey(onSecondFactor);\n const { userSettings } = useEnvironment();\n const { passkeySettings, attributes } = userSettings;\n\n useEffect(() => {\n async function runAutofillPasskey() {\n const _isSupported = await isWebAuthnAutofillSupported();\n setIsSupported(_isSupported);\n if (!_isSupported) {\n return;\n }\n\n await authenticateWithPasskey({ flow: 'autofill' });\n }\n\n if (passkeySettings.allow_autofill && attributes.passkey?.enabled) {\n runAutofillPasskey();\n }\n }, []);\n\n return {\n isWebAuthnAutofillSupported: isSupported,\n };\n};\n\nfunction SignInStartInternal(): JSX.Element {\n const card = useCardState();\n const clerk = useClerk();\n const status = useLoadingStatus();\n const { displayConfig, userSettings, authConfig } = useEnvironment();\n const signIn = useCoreSignIn();\n const { navigate } = useRouter();\n const ctx = useSignInContext();\n const { afterSignInUrl, signUpUrl, waitlistUrl, isCombinedFlow, navigateOnSetActive } = ctx;\n const supportEmail = useSupportEmail();\n const totalEnabledAuthMethods = useTotalEnabledAuthMethods();\n const identifierAttributes = useMemo<SignInStartIdentifier[]>(\n () => groupIdentifiers(userSettings.enabledFirstFactorIdentifiers),\n [userSettings.enabledFirstFactorIdentifiers],\n );\n const alternativePhoneCodeChannels = userSettings.alternativePhoneCodeChannels;\n\n /**\n * Passkeys\n */\n const { isWebAuthnAutofillSupported } = useAutoFillPasskey();\n const onSecondFactor = () => navigate('factor-two');\n const authenticateWithPasskey = useHandleAuthenticateWithPasskey(onSecondFactor);\n const isWebSupported = isWebAuthnSupported();\n\n const onlyPhoneNumberInitialValueExists =\n !!ctx.initialValues?.phoneNumber && !(ctx.initialValues.emailAddress || ctx.initialValues.username);\n const shouldStartWithPhoneNumberIdentifier =\n onlyPhoneNumberInitialValueExists && identifierAttributes.includes('phone_number');\n const [identifierAttribute, setIdentifierAttribute] = useState<SignInStartIdentifier>(\n shouldStartWithPhoneNumberIdentifier ? 'phone_number' : identifierAttributes[0] || '',\n );\n const [hasSwitchedByAutofill, setHasSwitchedByAutofill] = useState(false);\n\n const organizationTicket = getClerkQueryParam('__clerk_ticket') || '';\n const clerkStatus = getClerkQueryParam('__clerk_status') || '';\n\n const standardFormAttributes = userSettings.enabledFirstFactorIdentifiers;\n const web3FirstFactors = userSettings.web3FirstFactors;\n const authenticatableSocialStrategies = userSettings.authenticatableSocialStrategies;\n const passwordBasedInstance = userSettings.instanceIsPasswordBased;\n const { currentIdentifier, nextIdentifier } = getIdentifierControlDisplayValues(\n identifierAttributes,\n identifierAttribute,\n );\n const instantPasswordField = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__password'),\n placeholder: localizationKeys('formFieldInputPlaceholder__password') as any,\n });\n\n const [alternativePhoneCodeProvider, setAlternativePhoneCodeProvider] = useState<PhoneCodeChannelData | null>(null);\n\n const showAlternativePhoneCodeProviders = userSettings.alternativePhoneCodeChannels.length > 0;\n\n const onAlternativePhoneCodeUseAnotherMethod = () => {\n setAlternativePhoneCodeProvider(null);\n };\n const onAlternativePhoneCodeProviderClick = (phoneCodeChannel: PhoneCodeChannel) => {\n const provider: PhoneCodeChannelData | null = getAlternativePhoneCodeProviderData(phoneCodeChannel) || null;\n setAlternativePhoneCodeProvider(provider);\n };\n\n const ctxInitialValues = ctx.initialValues || {};\n const initialValues: Record<SignInStartIdentifier, string | undefined> = useMemo(\n () => ({\n email_address: ctxInitialValues.emailAddress,\n email_address_username: ctxInitialValues.emailAddress || ctxInitialValues.username,\n username: ctxInitialValues.username,\n phone_number: ctxInitialValues.phoneNumber,\n }),\n [ctx.initialValues],\n );\n\n const hasSocialOrWeb3Buttons =\n !!authenticatableSocialStrategies.length || !!web3FirstFactors.length || !!alternativePhoneCodeChannels.length;\n const [shouldAutofocus, setShouldAutofocus] = useState(!isMobileDevice() && !hasSocialOrWeb3Buttons);\n const textIdentifierField = useFormControl('identifier', initialValues[identifierAttribute] || '', {\n ...currentIdentifier,\n isRequired: true,\n transformer: value => value.trim(),\n });\n\n const phoneIdentifierField = useFormControl('identifier', initialValues['phone_number'] || '', {\n ...currentIdentifier,\n isRequired: true,\n });\n\n const identifierField = identifierAttribute === 'phone_number' ? phoneIdentifierField : textIdentifierField;\n\n const switchToNextIdentifier = () => {\n setIdentifierAttribute(\n i => identifierAttributes[(identifierAttributes.indexOf(i) + 1) % identifierAttributes.length],\n );\n setShouldAutofocus(true);\n setHasSwitchedByAutofill(false);\n };\n\n const handlePhoneNumberPaste = (value: string) => {\n textIdentifierField.setValue(initialValues[identifierAttribute] || '');\n phoneIdentifierField.setValue(value);\n setIdentifierAttribute('phone_number');\n setShouldAutofocus(true);\n };\n\n // switch to the phone input (if available) if a \"+\" is entered\n // (either by the browser or the user)\n // this does not work in chrome as it does not fire the change event and the value is\n // not available via js\n useLayoutEffect(() => {\n if (\n identifierField.value.startsWith('+') &&\n identifierAttributes.includes('phone_number') &&\n identifierAttribute !== 'phone_number' &&\n !hasSwitchedByAutofill\n ) {\n handlePhoneNumberPaste(identifierField.value);\n // do not switch automatically on subsequent autofills\n // by the browser to avoid a switch loop\n setHasSwitchedByAutofill(true);\n }\n }, [identifierField.value, identifierAttributes]);\n\n useEffect(() => {\n if (!organizationTicket) {\n return;\n }\n\n if (clerkStatus === 'sign_up') {\n const paramsToForward = new URLSearchParams();\n if (organizationTicket) {\n paramsToForward.set('__clerk_ticket', organizationTicket);\n }\n // We explicitly navigate to 'create' in the combined flow to trigger a client-side navigation. Navigating to\n // signUpUrl triggers a full page reload when used with the hash router.\n void navigate(isCombinedFlow ? `create` : signUpUrl, { searchParams: paramsToForward });\n return;\n }\n\n status.setLoading();\n card.setLoading();\n signIn\n .create({\n strategy: 'ticket',\n ticket: organizationTicket,\n })\n .then(res => {\n switch (res.status) {\n case 'needs_first_factor': {\n if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) {\n return navigate('factor-one');\n }\n\n return authenticateWithEnterpriseSSO();\n }\n case 'needs_second_factor':\n return navigate('factor-two');\n case 'complete':\n removeClerkQueryParam('__clerk_ticket');\n return clerk.setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default: {\n console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n return;\n }\n }\n })\n .catch(err => {\n return attemptToRecoverFromSignInError(err);\n })\n .finally(() => {\n // Keep the card in loading state during SSO redirect to prevent UI flicker\n // This is necessary because there's a brief delay between initiating the SSO flow\n // and the actual redirect to the external Identity Provider\n const isRedirectingToSSOProvider = !!hasOnlyEnterpriseSSOFirstFactors(signIn);\n if (isRedirectingToSSOProvider) {\n return;\n }\n\n status.setIdle();\n card.setIdle();\n });\n }, []);\n\n useEffect(() => {\n async function handleOauthError() {\n const defaultErrorHandler = () => {\n // Error from server may be too much information for the end user, so set a generic error\n card.setError('Unable to complete action at this time. If the problem persists please contact support.');\n };\n\n const error = signIn?.firstFactorVerification?.error;\n if (error) {\n switch (error.code) {\n case ERROR_CODES.NOT_ALLOWED_TO_SIGN_UP:\n case ERROR_CODES.OAUTH_ACCESS_DENIED:\n case ERROR_CODES.NOT_ALLOWED_ACCESS:\n case ERROR_CODES.SAML_USER_ATTRIBUTE_MISSING:\n case ERROR_CODES.OAUTH_EMAIL_DOMAIN_RESERVED_BY_SAML:\n case ERROR_CODES.USER_LOCKED:\n case ERROR_CODES.EXTERNAL_ACCOUNT_NOT_FOUND:\n case ERROR_CODES.SIGN_UP_MODE_RESTRICTED:\n case ERROR_CODES.SIGN_UP_MODE_RESTRICTED_WAITLIST:\n case ERROR_CODES.ENTERPRISE_SSO_USER_ATTRIBUTE_MISSING:\n case ERROR_CODES.ENTERPRISE_SSO_EMAIL_ADDRESS_DOMAIN_MISMATCH:\n case ERROR_CODES.ENTERPRISE_SSO_HOSTED_DOMAIN_MISMATCH:\n case ERROR_CODES.SAML_EMAIL_ADDRESS_DOMAIN_MISMATCH:\n case ERROR_CODES.ORGANIZATION_MEMBERSHIP_QUOTA_EXCEEDED_FOR_SSO:\n case ERROR_CODES.CAPTCHA_INVALID:\n case ERROR_CODES.FRAUD_DEVICE_BLOCKED:\n case ERROR_CODES.FRAUD_ACTION_BLOCKED:\n case ERROR_CODES.SIGNUP_RATE_LIMIT_EXCEEDED:\n case ERROR_CODES.USER_BANNED:\n card.setError(error);\n break;\n default:\n defaultErrorHandler();\n }\n\n // TODO: This is a workaround in order to reset the sign in attempt\n // so that the oauth error does not persist on full page reloads.\n void (await signIn.create({}));\n }\n }\n\n void handleOauthError();\n }, []);\n\n const buildSignInParams = (fields: Array<FormControlState<string>>): SignInCreateParams => {\n const hasPassword = fields.some(f => f.name === 'password' && !!f.value);\n\n /**\n * FAPI will return an error when password is submitted but the user's email matches requires enterprise sso authentication.\n * We need to strip password from the create request, and reconstruct it later.\n */\n if (!hasPassword || userSettings.enterpriseSSO.enabled) {\n fields = fields.filter(f => f.name !== 'password');\n }\n return {\n ...buildRequest(fields),\n ...(hasPassword && !userSettings.enterpriseSSO.enabled && { strategy: 'password' }),\n } as SignInCreateParams;\n };\n\n const safePasswordSignInForEnterpriseSSOInstance = (\n signInCreatePromise: Promise<SignInResource>,\n fields: Array<FormControlState<string>>,\n ) => {\n return signInCreatePromise.then(signInResource => {\n if (!userSettings.enterpriseSSO.enabled) {\n return signInResource;\n }\n /**\n * For instances with Enterprise SSO enabled, perform sign in with password only when it is allowed for the identified user.\n */\n const passwordField = fields.find(f => f.name === 'password')?.value;\n if (!passwordField || signInResource.supportedFirstFactors?.some(ff => ff.strategy === 'enterprise_sso')) {\n return signInResource;\n }\n return signInResource.attemptFirstFactor({ strategy: 'password', password: passwordField });\n });\n };\n\n const signInWithFields = async (...fields: Array<FormControlState<string>>) => {\n // If the user has already selected an alternative phone code provider, we use that.\n const preferredAlternativePhoneChannel =\n alternativePhoneCodeProvider?.channel ||\n getPreferredAlternativePhoneChannel(fields, authConfig.preferredChannels, 'identifier');\n if (preferredAlternativePhoneChannel) {\n // We need to send the alternative phone code provider channel in the sign in request\n // together with the phone_code strategy, in order for FAPI to create a Verification upon this first request.\n const noop = () => {};\n fields.push({\n id: 'strategy',\n value: 'phone_code',\n clearFeedback: noop,\n setValue: noop,\n onChange: noop,\n setError: noop,\n } as any);\n fields.push({\n id: 'channel',\n value: preferredAlternativePhoneChannel,\n clearFeedback: noop,\n setValue: noop,\n onChange: noop,\n setError: noop,\n } as any);\n }\n try {\n const res = await safePasswordSignInForEnterpriseSSOInstance(signIn.create(buildSignInParams(fields)), fields);\n\n switch (res.status) {\n case 'needs_identifier':\n // Check if we need to initiate an enterprise sso flow\n if (res.supportedFirstFactors?.some(ff => ff.strategy === 'enterprise_sso')) {\n await authenticateWithEnterpriseSSO();\n }\n break;\n case 'needs_first_factor': {\n if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) {\n return navigate('factor-one');\n }\n\n return authenticateWithEnterpriseSSO();\n }\n case 'needs_second_factor':\n return navigate('factor-two');\n case 'complete':\n return clerk.setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default: {\n console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n return;\n }\n }\n } catch (e: any) {\n return attemptToRecoverFromSignInError(e);\n }\n };\n\n const authenticateWithEnterpriseSSO = async () => {\n const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);\n const redirectUrlComplete = ctx.afterSignInUrl || '/';\n\n return signIn.authenticateWithRedirect({\n strategy: 'enterprise_sso',\n redirectUrl,\n redirectUrlComplete,\n oidcPrompt: ctx.oidcPrompt,\n continueSignIn: true,\n });\n };\n\n const attemptToRecoverFromSignInError = async (e: any) => {\n if (!e.errors) {\n return;\n }\n const instantPasswordError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) =>\n e.code === ERROR_CODES.INVALID_STRATEGY_FOR_USER ||\n e.code === ERROR_CODES.FORM_PASSWORD_INCORRECT ||\n e.code === ERROR_CODES.FORM_PASSWORD_PWNED,\n );\n\n const sessionAlreadyExistsError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) => e.code === ERROR_CODES.SESSION_EXISTS,\n );\n const alreadySignedInError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) => e.code === 'identifier_already_signed_in',\n );\n const accountDoesNotExistError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) =>\n e.code === ERROR_CODES.INVITATION_ACCOUNT_NOT_EXISTS || e.code === ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND,\n );\n\n if (instantPasswordError) {\n await signInWithFields(identifierField);\n } else if (sessionAlreadyExistsError) {\n await clerk.setActive({\n session: clerk.client.lastActiveSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n } else if (alreadySignedInError) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sid = alreadySignedInError.meta!.sessionId!;\n await clerk.setActive({\n session: sid,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n } else if (isCombinedFlow && accountDoesNotExistError) {\n const attribute = getSignUpAttributeFromIdentifier(identifierField);\n\n if (userSettings.signUp.mode === SIGN_UP_MODES.WAITLIST) {\n const waitlistUrl = clerk.buildWaitlistUrl(\n attribute === 'emailAddress'\n ? {\n initialValues: {\n [attribute]: identifierField.value,\n },\n }\n : {},\n );\n return navigate(waitlistUrl);\n }\n\n clerk.client.signUp[attribute] = identifierField.value;\n\n const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);\n const redirectUrlComplete = ctx.afterSignUpUrl || '/';\n\n return handleCombinedFlowTransfer({\n afterSignUpUrl: ctx.afterSignUpUrl || '/',\n clerk,\n handleError: e => handleError(e, [identifierField, instantPasswordField], card.setError),\n identifierAttribute: attribute,\n identifierValue: identifierField.value,\n navigate,\n organizationTicket,\n signUpMode: userSettings.signUp.mode,\n redirectUrl,\n redirectUrlComplete,\n navigateOnSetActive,\n passwordEnabled: userSettings.attributes.password?.required ?? false,\n alternativePhoneCodeChannel:\n alternativePhoneCodeProvider?.channel ||\n getPreferredAlternativePhoneChannelForCombinedFlow(\n authConfig.preferredChannels,\n attribute,\n identifierField.value,\n ),\n });\n } else {\n handleError(e, [identifierField, instantPasswordField], card.setError);\n }\n };\n\n const handleFirstPartySubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n return signInWithFields(identifierField, instantPasswordField);\n };\n\n const DynamicField = useMemo(() => {\n const components = {\n tel: Form.PhoneInput,\n password: Form.PasswordInput,\n text: Form.PlainInput,\n email: Form.PlainInput,\n };\n\n return components[identifierField.type as keyof typeof components];\n }, [identifierField.type]);\n\n if (status.isLoading || clerkStatus === 'sign_up') {\n // clerkStatus being sign_up will trigger a navigation to the sign up flow, so show a loading card instead of\n // rendering the sign in flow.\n return <LoadingCard />;\n }\n\n // @ts-expect-error `action` is not typed\n const { action, validLastAuthenticationStrategies, ...identifierFieldProps } = identifierField.props;\n\n const lastAuthenticationStrategy = clerk.client?.lastAuthenticationStrategy;\n const isIdentifierLastAuthenticationStrategy =\n lastAuthenticationStrategy && totalEnabledAuthMethods > 1\n ? validLastAuthenticationStrategies?.has(lastAuthenticationStrategy)\n : false;\n\n return (\n <Flow.Part part='start'>\n {!alternativePhoneCodeProvider ? (\n <Card.Root>\n <Card.Content>\n <Header.Root showLogo>\n <Header.Title\n localizationKey={\n isCombinedFlow\n ? localizationKeys('signIn.start.titleCombined')\n : localizationKeys('signIn.start.title')\n }\n />\n <Header.Subtitle\n localizationKey={\n isCombinedFlow\n ? localizationKeys('signIn.start.subtitleCombined')\n : localizationKeys('signIn.start.subtitle')\n }\n sx={{\n '&:empty': {\n display: 'none',\n },\n }}\n />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n {/*TODO: extract main in its own component */}\n <Col\n elementDescriptor={descriptors.main}\n gap={6}\n >\n <SocialButtonsReversibleContainerWithDivider>\n {hasSocialOrWeb3Buttons && (\n <SignInSocialButtons\n enableWeb3Providers\n enableOAuthProviders\n enableAlternativePhoneCodeProviders={showAlternativePhoneCodeProviders}\n onAlternativePhoneCodeProviderClick={onAlternativePhoneCodeProviderClick}\n />\n )}\n {standardFormAttributes.length ? (\n <Form.Root\n onSubmit={handleFirstPartySubmit}\n gap={8}\n >\n <Col gap={6}>\n <Form.ControlRow elementId={identifierField.id}>\n <DynamicField\n actionLabel={nextIdentifier?.action}\n onActionClicked={switchToNextIdentifier}\n {...identifierFieldProps}\n autoFocus={shouldAutofocus}\n autoComplete={isWebAuthnAutofillSupported ? 'webauthn' : undefined}\n isLastAuthenticationStrategy={isIdentifierLastAuthenticationStrategy}\n />\n </Form.ControlRow>\n <InstantPasswordRow field={passwordBasedInstance ? instantPasswordField : undefined} />\n </Col>\n <Col center>\n <CaptchaElement />\n <Form.SubmitButton hasArrow />\n </Col>\n </Form.Root>\n ) : null}\n </SocialButtonsReversibleContainerWithDivider>\n {!standardFormAttributes.length && <CaptchaElement />}\n {userSettings.attributes.passkey?.enabled &&\n userSettings.passkeySettings.show_sign_in_button &&\n isWebSupported && (\n <Card.Action elementId={'usePasskey'}>\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink__use_passkey')}\n onClick={() => authenticateWithPasskey({ flow: 'discoverable' })}\n />\n </Card.Action>\n )}\n </Col>\n </Card.Content>\n <Card.Footer>\n {userSettings.signUp.mode === SIGN_UP_MODES.PUBLIC && !isCombinedFlow && (\n <Card.Action elementId='signIn'>\n <Card.ActionText localizationKey={localizationKeys('signIn.start.actionText')} />\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink')}\n to={clerk.buildUrlWithAuth(signUpUrl)}\n />\n </Card.Action>\n )}\n {userSettings.signUp.mode === SIGN_UP_MODES.WAITLIST && (\n <Card.Action elementId='signIn'>\n <Card.ActionText localizationKey={localizationKeys('signIn.start.actionText__join_waitlist')} />\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink__join_waitlist')}\n to={clerk.buildUrlWithAuth(waitlistUrl)}\n />\n </Card.Action>\n )}\n </Card.Footer>\n </Card.Root>\n ) : (\n <SignInAlternativePhoneCodePhoneNumberCard\n handleSubmit={handleFirstPartySubmit}\n phoneNumberFormState={phoneIdentifierField}\n onUseAnotherMethod={onAlternativePhoneCodeUseAnotherMethod}\n phoneCodeProvider={alternativePhoneCodeProvider}\n />\n )}\n </Flow.Part>\n );\n}\n\nconst hasOnlyEnterpriseSSOFirstFactors = (signIn: SignInResource): boolean => {\n if (!signIn.supportedFirstFactors?.length) {\n return false;\n }\n\n return signIn.supportedFirstFactors.every(ff => ff.strategy === 'enterprise_sso');\n};\n\nconst InstantPasswordRow = ({ field }: { field?: FormControlState<'password'> }) => {\n const [autofilled, setAutofilled] = useState(false);\n const ref = useRef<HTMLInputElement>(null);\n const show = !!(autofilled || field?.value);\n\n // show password if it's autofilled by the browser\n useLayoutEffect(() => {\n const intervalId = setInterval(() => {\n if (ref?.current) {\n const autofilled =\n window.getComputedStyle(ref.current, ':autofill').animationName === 'onAutoFillStart' ||\n // https://github.com/facebook/react/issues/1159#issuecomment-1025423604\n !!ref.current?.matches('*:-webkit-autofill');\n if (autofilled) {\n setAutofilled(autofilled);\n clearInterval(intervalId);\n }\n }\n }, 500);\n\n return () => {\n clearInterval(intervalId);\n };\n }, []);\n\n useEffect(() => {\n //if the field receives a value, we default to normal behaviour\n if (field?.value && field.value !== '') {\n setAutofilled(false);\n }\n }, [field?.value]);\n\n if (!field) {\n return null;\n }\n\n return (\n <Form.ControlRow\n elementId={field.id}\n sx={show ? undefined : { position: 'absolute', opacity: 0, height: 0, pointerEvents: 'none', marginTop: '-1rem' }}\n >\n <Form.PasswordInput\n {...field.props}\n ref={ref}\n tabIndex={show ? undefined : -1}\n />\n </Form.ControlRow>\n );\n};\n\nexport const SignInStart = withRedirectToSignInTask(\n withRedirectToAfterSignIn(withCardStateProvider(SignInStartInternal)),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"SignInStart.js","names":["initialValues: Record<SignInStartIdentifier, string | undefined>","e: any","instantPasswordError: ClerkAPIError","e","sessionAlreadyExistsError: ClerkAPIError","alreadySignedInError: ClerkAPIError","accountDoesNotExistError: ClerkAPIError","isWebAuthnAutofillSupported","autofilled"],"sources":["../../../src/components/SignIn/SignInStart.tsx"],"sourcesContent":["import { getAlternativePhoneCodeProviderData } from '@clerk/shared/alternativePhoneCode';\nimport { ERROR_CODES, SIGN_UP_MODES } from '@clerk/shared/internal/clerk-js/constants';\nimport { clerkInvalidFAPIResponse } from '@clerk/shared/internal/clerk-js/errors';\nimport { getClerkQueryParam, removeClerkQueryParam } from '@clerk/shared/internal/clerk-js/queryParams';\nimport { useClerk } from '@clerk/shared/react';\nimport type {\n ClerkAPIError,\n PhoneCodeChannel,\n PhoneCodeChannelData,\n SignInCreateParams,\n SignInResource,\n} from '@clerk/shared/types';\nimport { isWebAuthnAutofillSupported, isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } 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 { LoadingCard } from '@/ui/elements/LoadingCard';\nimport { SocialButtonsReversibleContainerWithDivider } from '@/ui/elements/ReversibleContainer';\nimport { handleError } from '@/ui/utils/errorHandler';\nimport { isMobileDevice } from '@/ui/utils/isMobileDevice';\nimport type { FormControlState } from '@/ui/utils/useFormControl';\nimport { buildRequest, useFormControl } from '@/ui/utils/useFormControl';\n\nimport type { SignInStartIdentifier } from '../../common';\nimport {\n buildSSOCallbackURL,\n getIdentifierControlDisplayValues,\n groupIdentifiers,\n withRedirectToAfterSignIn,\n withRedirectToSignInTask,\n} from '../../common';\nimport { useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';\nimport { Col, descriptors, Flow, localizationKeys } from '../../customizables';\nimport { CaptchaElement } from '../../elements/CaptchaElement';\nimport { useLoadingStatus } from '../../hooks';\nimport { useSupportEmail } from '../../hooks/useSupportEmail';\nimport { useTotalEnabledAuthMethods } from '../../hooks/useTotalEnabledAuthMethods';\nimport { useRouter } from '../../router';\nimport { handleCombinedFlowTransfer } from './handleCombinedFlowTransfer';\nimport { hasMultipleEnterpriseConnections, useHandleAuthenticateWithPasskey } from './shared';\nimport { SignInAlternativePhoneCodePhoneNumberCard } from './SignInAlternativePhoneCodePhoneNumberCard';\nimport { SignInSocialButtons } from './SignInSocialButtons';\nimport {\n getPreferredAlternativePhoneChannel,\n getPreferredAlternativePhoneChannelForCombinedFlow,\n getSignUpAttributeFromIdentifier,\n} from './utils';\n\nconst useAutoFillPasskey = () => {\n const [isSupported, setIsSupported] = useState(false);\n const { navigate } = useRouter();\n const onSecondFactor = () => navigate('factor-two');\n const authenticateWithPasskey = useHandleAuthenticateWithPasskey(onSecondFactor);\n const { userSettings } = useEnvironment();\n const { passkeySettings, attributes } = userSettings;\n\n useEffect(() => {\n async function runAutofillPasskey() {\n const _isSupported = await isWebAuthnAutofillSupported();\n setIsSupported(_isSupported);\n if (!_isSupported) {\n return;\n }\n\n await authenticateWithPasskey({ flow: 'autofill' });\n }\n\n if (passkeySettings.allow_autofill && attributes.passkey?.enabled) {\n runAutofillPasskey();\n }\n }, []);\n\n return {\n isWebAuthnAutofillSupported: isSupported,\n };\n};\n\nfunction SignInStartInternal(): JSX.Element {\n const card = useCardState();\n const clerk = useClerk();\n const status = useLoadingStatus();\n const { displayConfig, userSettings, authConfig } = useEnvironment();\n const signIn = useCoreSignIn();\n const { navigate } = useRouter();\n const ctx = useSignInContext();\n const { afterSignInUrl, signUpUrl, waitlistUrl, isCombinedFlow, navigateOnSetActive } = ctx;\n const supportEmail = useSupportEmail();\n const totalEnabledAuthMethods = useTotalEnabledAuthMethods();\n const identifierAttributes = useMemo<SignInStartIdentifier[]>(\n () => groupIdentifiers(userSettings.enabledFirstFactorIdentifiers),\n [userSettings.enabledFirstFactorIdentifiers],\n );\n const alternativePhoneCodeChannels = userSettings.alternativePhoneCodeChannels;\n\n /**\n * Passkeys\n */\n const { isWebAuthnAutofillSupported } = useAutoFillPasskey();\n const onSecondFactor = () => navigate('factor-two');\n const authenticateWithPasskey = useHandleAuthenticateWithPasskey(onSecondFactor);\n const isWebSupported = isWebAuthnSupported();\n\n const onlyPhoneNumberInitialValueExists =\n !!ctx.initialValues?.phoneNumber && !(ctx.initialValues.emailAddress || ctx.initialValues.username);\n const shouldStartWithPhoneNumberIdentifier =\n onlyPhoneNumberInitialValueExists && identifierAttributes.includes('phone_number');\n const [identifierAttribute, setIdentifierAttribute] = useState<SignInStartIdentifier>(\n shouldStartWithPhoneNumberIdentifier ? 'phone_number' : identifierAttributes[0] || '',\n );\n const [hasSwitchedByAutofill, setHasSwitchedByAutofill] = useState(false);\n\n const organizationTicket = getClerkQueryParam('__clerk_ticket') || '';\n const clerkStatus = getClerkQueryParam('__clerk_status') || '';\n\n const standardFormAttributes = userSettings.enabledFirstFactorIdentifiers;\n const web3FirstFactors = userSettings.web3FirstFactors;\n const authenticatableSocialStrategies = userSettings.authenticatableSocialStrategies;\n const passwordBasedInstance = userSettings.instanceIsPasswordBased;\n const { currentIdentifier, nextIdentifier } = getIdentifierControlDisplayValues(\n identifierAttributes,\n identifierAttribute,\n );\n const instantPasswordField = useFormControl('password', '', {\n type: 'password',\n label: localizationKeys('formFieldLabel__password'),\n placeholder: localizationKeys('formFieldInputPlaceholder__password') as any,\n });\n\n const [alternativePhoneCodeProvider, setAlternativePhoneCodeProvider] = useState<PhoneCodeChannelData | null>(null);\n\n const showAlternativePhoneCodeProviders = userSettings.alternativePhoneCodeChannels.length > 0;\n\n const onAlternativePhoneCodeUseAnotherMethod = () => {\n setAlternativePhoneCodeProvider(null);\n };\n const onAlternativePhoneCodeProviderClick = (phoneCodeChannel: PhoneCodeChannel) => {\n const provider: PhoneCodeChannelData | null = getAlternativePhoneCodeProviderData(phoneCodeChannel) || null;\n setAlternativePhoneCodeProvider(provider);\n };\n\n const ctxInitialValues = ctx.initialValues || {};\n const initialValues: Record<SignInStartIdentifier, string | undefined> = useMemo(\n () => ({\n email_address: ctxInitialValues.emailAddress,\n email_address_username: ctxInitialValues.emailAddress || ctxInitialValues.username,\n username: ctxInitialValues.username,\n phone_number: ctxInitialValues.phoneNumber,\n }),\n [ctx.initialValues],\n );\n\n const hasSocialOrWeb3Buttons =\n !!authenticatableSocialStrategies.length || !!web3FirstFactors.length || !!alternativePhoneCodeChannels.length;\n const [shouldAutofocus, setShouldAutofocus] = useState(!isMobileDevice() && !hasSocialOrWeb3Buttons);\n const textIdentifierField = useFormControl('identifier', initialValues[identifierAttribute] || '', {\n ...currentIdentifier,\n isRequired: true,\n transformer: value => value.trim(),\n });\n\n const phoneIdentifierField = useFormControl('identifier', initialValues['phone_number'] || '', {\n ...currentIdentifier,\n isRequired: true,\n });\n\n const identifierField = identifierAttribute === 'phone_number' ? phoneIdentifierField : textIdentifierField;\n\n const switchToNextIdentifier = () => {\n setIdentifierAttribute(\n i => identifierAttributes[(identifierAttributes.indexOf(i) + 1) % identifierAttributes.length],\n );\n setShouldAutofocus(true);\n setHasSwitchedByAutofill(false);\n };\n\n const handlePhoneNumberPaste = (value: string) => {\n textIdentifierField.setValue(initialValues[identifierAttribute] || '');\n phoneIdentifierField.setValue(value);\n setIdentifierAttribute('phone_number');\n setShouldAutofocus(true);\n };\n\n // switch to the phone input (if available) if a \"+\" is entered\n // (either by the browser or the user)\n // this does not work in chrome as it does not fire the change event and the value is\n // not available via js\n useLayoutEffect(() => {\n if (\n identifierField.value.startsWith('+') &&\n identifierAttributes.includes('phone_number') &&\n identifierAttribute !== 'phone_number' &&\n !hasSwitchedByAutofill\n ) {\n handlePhoneNumberPaste(identifierField.value);\n // do not switch automatically on subsequent autofills\n // by the browser to avoid a switch loop\n setHasSwitchedByAutofill(true);\n }\n }, [identifierField.value, identifierAttributes]);\n\n useEffect(() => {\n if (!organizationTicket) {\n return;\n }\n\n if (clerkStatus === 'sign_up') {\n const paramsToForward = new URLSearchParams();\n if (organizationTicket) {\n paramsToForward.set('__clerk_ticket', organizationTicket);\n }\n // We explicitly navigate to 'create' in the combined flow to trigger a client-side navigation. Navigating to\n // signUpUrl triggers a full page reload when used with the hash router.\n void navigate(isCombinedFlow ? `create` : signUpUrl, { searchParams: paramsToForward });\n return;\n }\n\n status.setLoading();\n card.setLoading();\n signIn\n .create({\n strategy: 'ticket',\n ticket: organizationTicket,\n })\n .then(res => {\n switch (res.status) {\n case 'needs_first_factor': {\n if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) {\n return navigate('factor-one');\n }\n\n return authenticateWithEnterpriseSSO();\n }\n case 'needs_second_factor':\n return navigate('factor-two');\n case 'needs_client_trust':\n return navigate('client-trust');\n case 'complete':\n removeClerkQueryParam('__clerk_ticket');\n return clerk.setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default: {\n console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n return;\n }\n }\n })\n .catch(err => {\n return attemptToRecoverFromSignInError(err);\n })\n .finally(() => {\n // Keep the card in loading state during SSO redirect to prevent UI flicker\n // This is necessary because there's a brief delay between initiating the SSO flow\n // and the actual redirect to the external Identity Provider\n const isRedirectingToSSOProvider = !!hasOnlyEnterpriseSSOFirstFactors(signIn);\n if (isRedirectingToSSOProvider) {\n return;\n }\n\n status.setIdle();\n card.setIdle();\n });\n }, []);\n\n useEffect(() => {\n async function handleOauthError() {\n const defaultErrorHandler = () => {\n // Error from server may be too much information for the end user, so set a generic error\n card.setError('Unable to complete action at this time. If the problem persists please contact support.');\n };\n\n const error = signIn?.firstFactorVerification?.error;\n if (error) {\n switch (error.code) {\n case ERROR_CODES.NOT_ALLOWED_TO_SIGN_UP:\n case ERROR_CODES.OAUTH_ACCESS_DENIED:\n case ERROR_CODES.NOT_ALLOWED_ACCESS:\n case ERROR_CODES.SAML_USER_ATTRIBUTE_MISSING:\n case ERROR_CODES.OAUTH_EMAIL_DOMAIN_RESERVED_BY_SAML:\n case ERROR_CODES.USER_LOCKED:\n case ERROR_CODES.EXTERNAL_ACCOUNT_NOT_FOUND:\n case ERROR_CODES.SIGN_UP_MODE_RESTRICTED:\n case ERROR_CODES.SIGN_UP_MODE_RESTRICTED_WAITLIST:\n case ERROR_CODES.ENTERPRISE_SSO_USER_ATTRIBUTE_MISSING:\n case ERROR_CODES.ENTERPRISE_SSO_EMAIL_ADDRESS_DOMAIN_MISMATCH:\n case ERROR_CODES.ENTERPRISE_SSO_HOSTED_DOMAIN_MISMATCH:\n case ERROR_CODES.SAML_EMAIL_ADDRESS_DOMAIN_MISMATCH:\n case ERROR_CODES.ORGANIZATION_MEMBERSHIP_QUOTA_EXCEEDED_FOR_SSO:\n case ERROR_CODES.CAPTCHA_INVALID:\n case ERROR_CODES.FRAUD_DEVICE_BLOCKED:\n case ERROR_CODES.FRAUD_ACTION_BLOCKED:\n case ERROR_CODES.SIGNUP_RATE_LIMIT_EXCEEDED:\n case ERROR_CODES.USER_BANNED:\n card.setError(error);\n break;\n default:\n defaultErrorHandler();\n }\n\n // TODO: This is a workaround in order to reset the sign in attempt\n // so that the oauth error does not persist on full page reloads.\n void (await signIn.create({}));\n }\n }\n\n void handleOauthError();\n }, []);\n\n const buildSignInParams = (fields: Array<FormControlState<string>>): SignInCreateParams => {\n const hasPassword = fields.some(f => f.name === 'password' && !!f.value);\n\n /**\n * FAPI will return an error when password is submitted but the user's email matches requires enterprise sso authentication.\n * We need to strip password from the create request, and reconstruct it later.\n */\n if (!hasPassword || userSettings.enterpriseSSO.enabled) {\n fields = fields.filter(f => f.name !== 'password');\n }\n return {\n ...buildRequest(fields),\n ...(hasPassword && !userSettings.enterpriseSSO.enabled && { strategy: 'password' }),\n } as SignInCreateParams;\n };\n\n const safePasswordSignInForEnterpriseSSOInstance = (\n signInCreatePromise: Promise<SignInResource>,\n fields: Array<FormControlState<string>>,\n ) => {\n return signInCreatePromise.then(signInResource => {\n if (!userSettings.enterpriseSSO.enabled) {\n return signInResource;\n }\n /**\n * For instances with Enterprise SSO enabled, perform sign in with password only when it is allowed for the identified user.\n */\n const passwordField = fields.find(f => f.name === 'password')?.value;\n if (!passwordField || signInResource.supportedFirstFactors?.some(ff => ff.strategy === 'enterprise_sso')) {\n return signInResource;\n }\n return signInResource.attemptFirstFactor({ strategy: 'password', password: passwordField });\n });\n };\n\n const signInWithFields = async (...fields: Array<FormControlState<string>>) => {\n // If the user has already selected an alternative phone code provider, we use that.\n const preferredAlternativePhoneChannel =\n alternativePhoneCodeProvider?.channel ||\n getPreferredAlternativePhoneChannel(fields, authConfig.preferredChannels, 'identifier');\n if (preferredAlternativePhoneChannel) {\n // We need to send the alternative phone code provider channel in the sign in request\n // together with the phone_code strategy, in order for FAPI to create a Verification upon this first request.\n const noop = () => {};\n fields.push({\n id: 'strategy',\n value: 'phone_code',\n clearFeedback: noop,\n setValue: noop,\n onChange: noop,\n setError: noop,\n } as any);\n fields.push({\n id: 'channel',\n value: preferredAlternativePhoneChannel,\n clearFeedback: noop,\n setValue: noop,\n onChange: noop,\n setError: noop,\n } as any);\n }\n try {\n const res = await safePasswordSignInForEnterpriseSSOInstance(signIn.create(buildSignInParams(fields)), fields);\n\n switch (res.status) {\n case 'needs_identifier':\n // Check if we need to initiate an enterprise sso flow\n if (res.supportedFirstFactors?.some(ff => ff.strategy === 'enterprise_sso')) {\n await authenticateWithEnterpriseSSO();\n }\n break;\n case 'needs_first_factor': {\n if (!hasOnlyEnterpriseSSOFirstFactors(res) || hasMultipleEnterpriseConnections(res.supportedFirstFactors)) {\n return navigate('factor-one');\n }\n\n return authenticateWithEnterpriseSSO();\n }\n case 'needs_second_factor':\n return navigate('factor-two');\n case 'needs_client_trust':\n return navigate('client-trust');\n case 'complete':\n return clerk.setActive({\n session: res.createdSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n default: {\n console.error(clerkInvalidFAPIResponse(res.status, supportEmail));\n return;\n }\n }\n } catch (e: any) {\n return attemptToRecoverFromSignInError(e);\n }\n };\n\n const authenticateWithEnterpriseSSO = async () => {\n const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signInUrl);\n const redirectUrlComplete = ctx.afterSignInUrl || '/';\n\n return signIn.authenticateWithRedirect({\n strategy: 'enterprise_sso',\n redirectUrl,\n redirectUrlComplete,\n oidcPrompt: ctx.oidcPrompt,\n continueSignIn: true,\n });\n };\n\n const attemptToRecoverFromSignInError = async (e: any) => {\n if (!e.errors) {\n return;\n }\n const instantPasswordError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) =>\n e.code === ERROR_CODES.INVALID_STRATEGY_FOR_USER ||\n e.code === ERROR_CODES.FORM_PASSWORD_INCORRECT ||\n e.code === ERROR_CODES.FORM_PASSWORD_PWNED,\n );\n\n const sessionAlreadyExistsError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) => e.code === ERROR_CODES.SESSION_EXISTS,\n );\n const alreadySignedInError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) => e.code === 'identifier_already_signed_in',\n );\n const accountDoesNotExistError: ClerkAPIError = e.errors.find(\n (e: ClerkAPIError) =>\n e.code === ERROR_CODES.INVITATION_ACCOUNT_NOT_EXISTS || e.code === ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND,\n );\n\n if (instantPasswordError) {\n await signInWithFields(identifierField);\n } else if (sessionAlreadyExistsError) {\n await clerk.setActive({\n session: clerk.client.lastActiveSessionId,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n } else if (alreadySignedInError) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sid = alreadySignedInError.meta!.sessionId!;\n await clerk.setActive({\n session: sid,\n navigate: async ({ session }) => {\n await navigateOnSetActive({ session, redirectUrl: afterSignInUrl });\n },\n });\n } else if (isCombinedFlow && accountDoesNotExistError) {\n const attribute = getSignUpAttributeFromIdentifier(identifierField);\n\n if (userSettings.signUp.mode === SIGN_UP_MODES.WAITLIST) {\n const waitlistUrl = clerk.buildWaitlistUrl(\n attribute === 'emailAddress'\n ? {\n initialValues: {\n [attribute]: identifierField.value,\n },\n }\n : {},\n );\n return navigate(waitlistUrl);\n }\n\n clerk.client.signUp[attribute] = identifierField.value;\n\n const redirectUrl = buildSSOCallbackURL(ctx, displayConfig.signUpUrl);\n const redirectUrlComplete = ctx.afterSignUpUrl || '/';\n\n return handleCombinedFlowTransfer({\n afterSignUpUrl: ctx.afterSignUpUrl || '/',\n clerk,\n handleError: e => handleError(e, [identifierField, instantPasswordField], card.setError),\n identifierAttribute: attribute,\n identifierValue: identifierField.value,\n navigate,\n organizationTicket,\n signUpMode: userSettings.signUp.mode,\n redirectUrl,\n redirectUrlComplete,\n navigateOnSetActive,\n passwordEnabled: userSettings.attributes.password?.required ?? false,\n alternativePhoneCodeChannel:\n alternativePhoneCodeProvider?.channel ||\n getPreferredAlternativePhoneChannelForCombinedFlow(\n authConfig.preferredChannels,\n attribute,\n identifierField.value,\n ),\n });\n } else {\n handleError(e, [identifierField, instantPasswordField], card.setError);\n }\n };\n\n const handleFirstPartySubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n return signInWithFields(identifierField, instantPasswordField);\n };\n\n const DynamicField = useMemo(() => {\n const components = {\n tel: Form.PhoneInput,\n password: Form.PasswordInput,\n text: Form.PlainInput,\n email: Form.PlainInput,\n };\n\n return components[identifierField.type as keyof typeof components];\n }, [identifierField.type]);\n\n if (status.isLoading || clerkStatus === 'sign_up') {\n // clerkStatus being sign_up will trigger a navigation to the sign up flow, so show a loading card instead of\n // rendering the sign in flow.\n return <LoadingCard />;\n }\n\n // @ts-expect-error `action` is not typed\n const { action, validLastAuthenticationStrategies, ...identifierFieldProps } = identifierField.props;\n\n const lastAuthenticationStrategy = clerk.client?.lastAuthenticationStrategy;\n const isIdentifierLastAuthenticationStrategy =\n lastAuthenticationStrategy && totalEnabledAuthMethods > 1\n ? validLastAuthenticationStrategies?.has(lastAuthenticationStrategy)\n : false;\n\n return (\n <Flow.Part part='start'>\n {!alternativePhoneCodeProvider ? (\n <Card.Root>\n <Card.Content>\n <Header.Root showLogo>\n <Header.Title\n localizationKey={\n isCombinedFlow\n ? localizationKeys('signIn.start.titleCombined')\n : localizationKeys('signIn.start.title')\n }\n />\n <Header.Subtitle\n localizationKey={\n isCombinedFlow\n ? localizationKeys('signIn.start.subtitleCombined')\n : localizationKeys('signIn.start.subtitle')\n }\n sx={{\n '&:empty': {\n display: 'none',\n },\n }}\n />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n {/*TODO: extract main in its own component */}\n <Col\n elementDescriptor={descriptors.main}\n gap={6}\n >\n <SocialButtonsReversibleContainerWithDivider>\n {hasSocialOrWeb3Buttons && (\n <SignInSocialButtons\n enableWeb3Providers\n enableOAuthProviders\n enableAlternativePhoneCodeProviders={showAlternativePhoneCodeProviders}\n onAlternativePhoneCodeProviderClick={onAlternativePhoneCodeProviderClick}\n />\n )}\n {standardFormAttributes.length ? (\n <Form.Root\n onSubmit={handleFirstPartySubmit}\n gap={8}\n >\n <Col gap={6}>\n <Form.ControlRow elementId={identifierField.id}>\n <DynamicField\n actionLabel={nextIdentifier?.action}\n onActionClicked={switchToNextIdentifier}\n {...identifierFieldProps}\n autoFocus={shouldAutofocus}\n autoComplete={isWebAuthnAutofillSupported ? 'webauthn' : undefined}\n isLastAuthenticationStrategy={isIdentifierLastAuthenticationStrategy}\n />\n </Form.ControlRow>\n <InstantPasswordRow field={passwordBasedInstance ? instantPasswordField : undefined} />\n </Col>\n <Col center>\n <CaptchaElement />\n <Form.SubmitButton hasArrow />\n </Col>\n </Form.Root>\n ) : null}\n </SocialButtonsReversibleContainerWithDivider>\n {!standardFormAttributes.length && <CaptchaElement />}\n {userSettings.attributes.passkey?.enabled &&\n userSettings.passkeySettings.show_sign_in_button &&\n isWebSupported && (\n <Card.Action elementId={'usePasskey'}>\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink__use_passkey')}\n onClick={() => authenticateWithPasskey({ flow: 'discoverable' })}\n />\n </Card.Action>\n )}\n </Col>\n </Card.Content>\n <Card.Footer>\n {userSettings.signUp.mode === SIGN_UP_MODES.PUBLIC && !isCombinedFlow && (\n <Card.Action elementId='signIn'>\n <Card.ActionText localizationKey={localizationKeys('signIn.start.actionText')} />\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink')}\n to={clerk.buildUrlWithAuth(signUpUrl)}\n />\n </Card.Action>\n )}\n {userSettings.signUp.mode === SIGN_UP_MODES.WAITLIST && (\n <Card.Action elementId='signIn'>\n <Card.ActionText localizationKey={localizationKeys('signIn.start.actionText__join_waitlist')} />\n <Card.ActionLink\n localizationKey={localizationKeys('signIn.start.actionLink__join_waitlist')}\n to={clerk.buildUrlWithAuth(waitlistUrl)}\n />\n </Card.Action>\n )}\n </Card.Footer>\n </Card.Root>\n ) : (\n <SignInAlternativePhoneCodePhoneNumberCard\n handleSubmit={handleFirstPartySubmit}\n phoneNumberFormState={phoneIdentifierField}\n onUseAnotherMethod={onAlternativePhoneCodeUseAnotherMethod}\n phoneCodeProvider={alternativePhoneCodeProvider}\n />\n )}\n </Flow.Part>\n );\n}\n\nconst hasOnlyEnterpriseSSOFirstFactors = (signIn: SignInResource): boolean => {\n if (!signIn.supportedFirstFactors?.length) {\n return false;\n }\n\n return signIn.supportedFirstFactors.every(ff => ff.strategy === 'enterprise_sso');\n};\n\nconst InstantPasswordRow = ({ field }: { field?: FormControlState<'password'> }) => {\n const [autofilled, setAutofilled] = useState(false);\n const ref = useRef<HTMLInputElement>(null);\n const show = !!(autofilled || field?.value);\n\n // show password if it's autofilled by the browser\n useLayoutEffect(() => {\n const intervalId = setInterval(() => {\n if (ref?.current) {\n const autofilled =\n window.getComputedStyle(ref.current, ':autofill').animationName === 'onAutoFillStart' ||\n // https://github.com/facebook/react/issues/1159#issuecomment-1025423604\n !!ref.current?.matches('*:-webkit-autofill');\n if (autofilled) {\n setAutofilled(autofilled);\n clearInterval(intervalId);\n }\n }\n }, 500);\n\n return () => {\n clearInterval(intervalId);\n };\n }, []);\n\n useEffect(() => {\n //if the field receives a value, we default to normal behaviour\n if (field?.value && field.value !== '') {\n setAutofilled(false);\n }\n }, [field?.value]);\n\n if (!field) {\n return null;\n }\n\n return (\n <Form.ControlRow\n elementId={field.id}\n sx={show ? undefined : { position: 'absolute', opacity: 0, height: 0, pointerEvents: 'none', marginTop: '-1rem' }}\n >\n <Form.PasswordInput\n {...field.props}\n ref={ref}\n tabIndex={show ? undefined : -1}\n />\n </Form.ControlRow>\n );\n};\n\nexport const SignInStart = withRedirectToSignInTask(\n withRedirectToAfterSignIn(withCardStateProvider(SignInStartInternal)),\n);\n"],"mappings":"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"}
@@ -14,13 +14,14 @@ import { LazySignUpContinue, LazySignUpSSOCallback, LazySignUpStart, LazySignUpV
14
14
  import { ResetPassword } from "./ResetPassword.js";
15
15
  import { ResetPasswordSuccess } from "./ResetPasswordSuccess.js";
16
16
  import { SignInAccountSwitcher } from "./SignInAccountSwitcher.js";
17
+ import { SignInClientTrust } from "./SignInClientTrust.js";
17
18
  import { SignInFactorOne } from "./SignInFactorOne.js";
18
19
  import { SignInFactorTwo } from "./SignInFactorTwo.js";
19
20
  import { SignInSSOCallback } from "./SignInSSOCallback.js";
20
21
  import { SignInStart } from "./SignInStart.js";
21
22
  import React from "react";
22
- import { jsx, jsxs } from "@emotion/react/jsx-runtime";
23
23
  import { useClerk } from "@clerk/shared/react";
24
+ import { jsx, jsxs } from "@emotion/react/jsx-runtime";
24
25
 
25
26
  //#region src/components/SignIn/index.tsx
26
27
  function RedirectToSignIn() {
@@ -44,6 +45,10 @@ function SignInRoutes() {
44
45
  path: "factor-two",
45
46
  children: /* @__PURE__ */ jsx(SignInFactorTwo, {})
46
47
  }),
48
+ /* @__PURE__ */ jsx(Route, {
49
+ path: "client-trust",
50
+ children: /* @__PURE__ */ jsx(SignInClientTrust, {})
51
+ }),
47
52
  /* @__PURE__ */ jsx(Route, {
48
53
  path: "reset-password",
49
54
  children: /* @__PURE__ */ jsx(ResetPassword, {})
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["LazySessionTasks","SignIn: React.ComponentType<SignInProps>"],"sources":["../../../src/components/SignIn/index.tsx"],"sourcesContent":["import { useClerk } from '@clerk/shared/react';\nimport type { SignInModalProps, SignInProps } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { SignInEmailLinkFlowComplete, SignUpEmailLinkFlowComplete } from '@/ui/common/EmailLinkCompleteFlowCard';\nimport {\n SignInContext,\n SignUpContext,\n useSignInContext,\n useSignUpContext,\n withCoreSessionSwitchGuard,\n} from '@/ui/contexts';\nimport { Flow } from '@/ui/customizables';\nimport { useFetch } from '@/ui/hooks';\nimport { usePreloadTasks } from '@/ui/hooks/usePreloadTasks';\nimport { SessionTasks as LazySessionTasks } from '@/ui/lazyModules/components';\nimport { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '@/ui/router';\nimport type { SignUpCtx } from '@/ui/types';\nimport { normalizeRoutingOptions } from '@/utils/normalizeRoutingOptions';\n\nimport {\n LazySignUpContinue,\n LazySignUpSSOCallback,\n LazySignUpStart,\n LazySignUpVerifyEmail,\n LazySignUpVerifyPhone,\n preloadSignUp,\n} from './lazy-sign-up';\nimport { ResetPassword } from './ResetPassword';\nimport { ResetPasswordSuccess } from './ResetPasswordSuccess';\nimport { SignInAccountSwitcher } from './SignInAccountSwitcher';\nimport { SignInFactorOne } from './SignInFactorOne';\nimport { SignInFactorTwo } from './SignInFactorTwo';\nimport { SignInSSOCallback } from './SignInSSOCallback';\nimport { SignInStart } from './SignInStart';\n\nfunction RedirectToSignIn() {\n const clerk = useClerk();\n React.useEffect(() => {\n void clerk.redirectToSignIn();\n }, []);\n return null;\n}\n\nfunction SignInRoutes(): JSX.Element {\n const signInContext = useSignInContext();\n const signUpContext = useSignUpContext();\n\n return (\n <Flow.Root flow='signIn'>\n <Switch>\n <Route path='factor-one'>\n <SignInFactorOne />\n </Route>\n <Route path='factor-two'>\n <SignInFactorTwo />\n </Route>\n <Route path='reset-password'>\n <ResetPassword />\n </Route>\n <Route path='reset-password-success'>\n <ResetPasswordSuccess />\n </Route>\n <Route path='sso-callback'>\n <SignInSSOCallback\n signUpUrl={signInContext.signUpUrl}\n signInUrl={signInContext.signInUrl}\n signInForceRedirectUrl={signInContext.afterSignInUrl}\n signUpForceRedirectUrl={signInContext.afterSignUpUrl}\n continueSignUpUrl={signInContext.signUpContinueUrl}\n transferable={signInContext.transferable}\n firstFactorUrl={'../factor-one'}\n secondFactorUrl={'../factor-two'}\n resetPasswordUrl={'../reset-password'}\n />\n </Route>\n <Route path='choose'>\n <SignInAccountSwitcher />\n </Route>\n <Route path='verify'>\n <SignInEmailLinkFlowComplete\n redirectUrlComplete={signInContext.afterSignInUrl}\n redirectUrl='../factor-two'\n />\n </Route>\n\n {signInContext.isCombinedFlow && (\n <Route path='create'>\n <Route\n path='verify-email-address'\n canActivate={clerk => !!clerk.client.signUp.emailAddress}\n >\n <LazySignUpVerifyEmail />\n </Route>\n <Route\n path='verify-phone-number'\n canActivate={clerk => !!clerk.client.signUp.phoneNumber}\n >\n <LazySignUpVerifyPhone />\n </Route>\n <Route path='sso-callback'>\n <LazySignUpSSOCallback\n signUpUrl={signUpContext.signUpUrl}\n signInUrl={signUpContext.signInUrl}\n signUpForceRedirectUrl={signUpContext.afterSignUpUrl}\n signInForceRedirectUrl={signUpContext.afterSignInUrl}\n secondFactorUrl={signUpContext.secondFactorUrl}\n continueSignUpUrl='../continue'\n verifyEmailAddressUrl='../verify-email-address'\n verifyPhoneNumberUrl='../verify-phone-number'\n />\n </Route>\n <Route path='verify'>\n <SignUpEmailLinkFlowComplete\n redirectUrlComplete={signUpContext.afterSignUpUrl}\n verifyEmailPath='../verify-email-address'\n verifyPhonePath='../verify-phone-number'\n continuePath='../continue'\n />\n </Route>\n <Route path='continue'>\n <Route\n path='verify-email-address'\n canActivate={clerk => !!clerk.client.signUp.emailAddress}\n >\n <LazySignUpVerifyEmail />\n </Route>\n <Route\n path='verify-phone-number'\n canActivate={clerk => !!clerk.client.signUp.phoneNumber}\n >\n <LazySignUpVerifyPhone />\n </Route>\n <Route index>\n <LazySignUpContinue />\n </Route>\n </Route>\n <Route path='tasks'>\n <LazySessionTasks redirectUrlComplete={signInContext.afterSignUpUrl} />\n </Route>\n <Route index>\n <LazySignUpStart />\n </Route>\n </Route>\n )}\n <Route path='tasks'>\n <LazySessionTasks redirectUrlComplete={signInContext.afterSignInUrl} />\n </Route>\n <Route index>\n <SignInStart />\n </Route>\n <Route>\n <RedirectToSignIn />\n </Route>\n </Switch>\n </Flow.Root>\n );\n}\n\nconst usePreloadSignUp = (enabled = false) =>\n useFetch(enabled ? preloadSignUp : undefined, 'preloadComponent', { staleTime: Infinity });\n\nfunction SignInRoot() {\n const signInContext = useSignInContext();\n const normalizedSignUpContext = {\n componentName: 'SignUp',\n emailLinkRedirectUrl: signInContext.emailLinkRedirectUrl,\n ssoCallbackUrl: signInContext.ssoCallbackUrl,\n forceRedirectUrl: signInContext.signUpForceRedirectUrl,\n fallbackRedirectUrl: signInContext.signUpFallbackRedirectUrl,\n signInUrl: signInContext.signInUrl,\n unsafeMetadata: signInContext.unsafeMetadata,\n ...normalizeRoutingOptions({ routing: signInContext?.routing, path: signInContext?.path }),\n } as SignUpCtx;\n\n /**\n * Preload Sign Up when in Combined Flow.\n */\n usePreloadSignUp(signInContext.isCombinedFlow);\n\n usePreloadTasks();\n\n return (\n <SignUpContext.Provider value={normalizedSignUpContext}>\n <SignInRoutes />\n </SignUpContext.Provider>\n );\n}\n\nSignInRoutes.displayName = 'SignIn';\n\nexport const SignIn: React.ComponentType<SignInProps> = withCoreSessionSwitchGuard(SignInRoot);\n\nexport const SignInModal = (props: SignInModalProps): JSX.Element => {\n const signInProps = {\n signUpUrl: `/${VIRTUAL_ROUTER_BASE_PATH}/sign-up`,\n waitlistUrl: `/${VIRTUAL_ROUTER_BASE_PATH}/waitlist`,\n ...props,\n };\n\n return (\n <Route path='sign-in'>\n <SignInContext.Provider\n value={{\n componentName: 'SignIn',\n ...signInProps,\n routing: 'virtual',\n mode: 'modal',\n }}\n >\n {/*TODO: Used by InvisibleRootBox, can we simplify? */}\n <div>\n <SignIn\n {...signInProps}\n routing='virtual'\n />\n </div>\n </SignInContext.Provider>\n </Route>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["LazySessionTasks","SignIn: React.ComponentType<SignInProps>"],"sources":["../../../src/components/SignIn/index.tsx"],"sourcesContent":["import { useClerk } from '@clerk/shared/react';\nimport type { SignInModalProps, SignInProps } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { SignInEmailLinkFlowComplete, SignUpEmailLinkFlowComplete } from '@/ui/common/EmailLinkCompleteFlowCard';\nimport {\n SignInContext,\n SignUpContext,\n useSignInContext,\n useSignUpContext,\n withCoreSessionSwitchGuard,\n} from '@/ui/contexts';\nimport { Flow } from '@/ui/customizables';\nimport { useFetch } from '@/ui/hooks';\nimport { usePreloadTasks } from '@/ui/hooks/usePreloadTasks';\nimport { SessionTasks as LazySessionTasks } from '@/ui/lazyModules/components';\nimport { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '@/ui/router';\nimport type { SignUpCtx } from '@/ui/types';\nimport { normalizeRoutingOptions } from '@/utils/normalizeRoutingOptions';\n\nimport {\n LazySignUpContinue,\n LazySignUpSSOCallback,\n LazySignUpStart,\n LazySignUpVerifyEmail,\n LazySignUpVerifyPhone,\n preloadSignUp,\n} from './lazy-sign-up';\nimport { ResetPassword } from './ResetPassword';\nimport { ResetPasswordSuccess } from './ResetPasswordSuccess';\nimport { SignInAccountSwitcher } from './SignInAccountSwitcher';\nimport { SignInClientTrust } from './SignInClientTrust';\nimport { SignInFactorOne } from './SignInFactorOne';\nimport { SignInFactorTwo } from './SignInFactorTwo';\nimport { SignInSSOCallback } from './SignInSSOCallback';\nimport { SignInStart } from './SignInStart';\n\nfunction RedirectToSignIn() {\n const clerk = useClerk();\n React.useEffect(() => {\n void clerk.redirectToSignIn();\n }, []);\n return null;\n}\n\nfunction SignInRoutes(): JSX.Element {\n const signInContext = useSignInContext();\n const signUpContext = useSignUpContext();\n\n return (\n <Flow.Root flow='signIn'>\n <Switch>\n <Route path='factor-one'>\n <SignInFactorOne />\n </Route>\n <Route path='factor-two'>\n <SignInFactorTwo />\n </Route>\n <Route path='client-trust'>\n <SignInClientTrust />\n </Route>\n <Route path='reset-password'>\n <ResetPassword />\n </Route>\n <Route path='reset-password-success'>\n <ResetPasswordSuccess />\n </Route>\n <Route path='sso-callback'>\n <SignInSSOCallback\n signUpUrl={signInContext.signUpUrl}\n signInUrl={signInContext.signInUrl}\n signInForceRedirectUrl={signInContext.afterSignInUrl}\n signUpForceRedirectUrl={signInContext.afterSignUpUrl}\n continueSignUpUrl={signInContext.signUpContinueUrl}\n transferable={signInContext.transferable}\n firstFactorUrl={'../factor-one'}\n secondFactorUrl={'../factor-two'}\n resetPasswordUrl={'../reset-password'}\n />\n </Route>\n <Route path='choose'>\n <SignInAccountSwitcher />\n </Route>\n <Route path='verify'>\n <SignInEmailLinkFlowComplete\n redirectUrlComplete={signInContext.afterSignInUrl}\n redirectUrl='../factor-two'\n />\n </Route>\n\n {signInContext.isCombinedFlow && (\n <Route path='create'>\n <Route\n path='verify-email-address'\n canActivate={clerk => !!clerk.client.signUp.emailAddress}\n >\n <LazySignUpVerifyEmail />\n </Route>\n <Route\n path='verify-phone-number'\n canActivate={clerk => !!clerk.client.signUp.phoneNumber}\n >\n <LazySignUpVerifyPhone />\n </Route>\n <Route path='sso-callback'>\n <LazySignUpSSOCallback\n signUpUrl={signUpContext.signUpUrl}\n signInUrl={signUpContext.signInUrl}\n signUpForceRedirectUrl={signUpContext.afterSignUpUrl}\n signInForceRedirectUrl={signUpContext.afterSignInUrl}\n secondFactorUrl={signUpContext.secondFactorUrl}\n continueSignUpUrl='../continue'\n verifyEmailAddressUrl='../verify-email-address'\n verifyPhoneNumberUrl='../verify-phone-number'\n />\n </Route>\n <Route path='verify'>\n <SignUpEmailLinkFlowComplete\n redirectUrlComplete={signUpContext.afterSignUpUrl}\n verifyEmailPath='../verify-email-address'\n verifyPhonePath='../verify-phone-number'\n continuePath='../continue'\n />\n </Route>\n <Route path='continue'>\n <Route\n path='verify-email-address'\n canActivate={clerk => !!clerk.client.signUp.emailAddress}\n >\n <LazySignUpVerifyEmail />\n </Route>\n <Route\n path='verify-phone-number'\n canActivate={clerk => !!clerk.client.signUp.phoneNumber}\n >\n <LazySignUpVerifyPhone />\n </Route>\n <Route index>\n <LazySignUpContinue />\n </Route>\n </Route>\n <Route path='tasks'>\n <LazySessionTasks redirectUrlComplete={signInContext.afterSignUpUrl} />\n </Route>\n <Route index>\n <LazySignUpStart />\n </Route>\n </Route>\n )}\n <Route path='tasks'>\n <LazySessionTasks redirectUrlComplete={signInContext.afterSignInUrl} />\n </Route>\n <Route index>\n <SignInStart />\n </Route>\n <Route>\n <RedirectToSignIn />\n </Route>\n </Switch>\n </Flow.Root>\n );\n}\n\nconst usePreloadSignUp = (enabled = false) =>\n useFetch(enabled ? preloadSignUp : undefined, 'preloadComponent', { staleTime: Infinity });\n\nfunction SignInRoot() {\n const signInContext = useSignInContext();\n const normalizedSignUpContext = {\n componentName: 'SignUp',\n emailLinkRedirectUrl: signInContext.emailLinkRedirectUrl,\n ssoCallbackUrl: signInContext.ssoCallbackUrl,\n forceRedirectUrl: signInContext.signUpForceRedirectUrl,\n fallbackRedirectUrl: signInContext.signUpFallbackRedirectUrl,\n signInUrl: signInContext.signInUrl,\n unsafeMetadata: signInContext.unsafeMetadata,\n ...normalizeRoutingOptions({ routing: signInContext?.routing, path: signInContext?.path }),\n } as SignUpCtx;\n\n /**\n * Preload Sign Up when in Combined Flow.\n */\n usePreloadSignUp(signInContext.isCombinedFlow);\n\n usePreloadTasks();\n\n return (\n <SignUpContext.Provider value={normalizedSignUpContext}>\n <SignInRoutes />\n </SignUpContext.Provider>\n );\n}\n\nSignInRoutes.displayName = 'SignIn';\n\nexport const SignIn: React.ComponentType<SignInProps> = withCoreSessionSwitchGuard(SignInRoot);\n\nexport const SignInModal = (props: SignInModalProps): JSX.Element => {\n const signInProps = {\n signUpUrl: `/${VIRTUAL_ROUTER_BASE_PATH}/sign-up`,\n waitlistUrl: `/${VIRTUAL_ROUTER_BASE_PATH}/waitlist`,\n ...props,\n };\n\n return (\n <Route path='sign-in'>\n <SignInContext.Provider\n value={{\n componentName: 'SignIn',\n ...signInProps,\n routing: 'virtual',\n mode: 'modal',\n }}\n >\n {/*TODO: Used by InvisibleRootBox, can we simplify? */}\n <div>\n <SignIn\n {...signInProps}\n routing='virtual'\n />\n </div>\n </SignInContext.Provider>\n </Route>\n );\n};\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { handleError } from "../../utils/errorHandler.js";
5
5
  import { useSupportEmail } from "../../hooks/useSupportEmail.js";
6
6
  import { clerkInvalidFAPIResponse } from "@clerk/shared/internal/clerk-js/errors";
7
7
  import { useCallback, useEffect } from "react";
8
- import { isClerkRuntimeError, isUserLockedError } from "@clerk/shared/error";
9
8
  import { useClerk } from "@clerk/shared/react";
9
+ import { isClerkRuntimeError, isUserLockedError } from "@clerk/shared/error";
10
10
  import { __internal_WebAuthnAbortService } from "@clerk/shared/internal/clerk-js/passkeys";
11
11
 
12
12
  //#region src/components/SignIn/shared.ts