@clerk/ui 1.32.3-snapshot.v20260909015433 → 1.32.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClerkUI.js +2 -2
- package/dist/components/UserVerification/AlternativeMethods.js +2 -2
- package/dist/components/UserVerification/AlternativeMethods.js.map +1 -1
- package/dist/components/UserVerification/UVFactorTwoBackupCodeCard.js.map +1 -1
- package/dist/components/UserVerification/UserVerificationFactorOne.js +4 -4
- package/dist/components/UserVerification/UserVerificationFactorOne.js.map +1 -1
- package/dist/components/UserVerification/UserVerificationFactorTwo.js +1 -1
- package/dist/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
- package/dist/components/UserVerification/useReverificationAlternativeStrategies.js +2 -5
- package/dist/components/UserVerification/useReverificationAlternativeStrategies.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/no-rhc/ClerkUI.js +2 -2
- package/dist/no-rhc/components/UserVerification/AlternativeMethods.js +2 -2
- package/dist/no-rhc/components/UserVerification/AlternativeMethods.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UVFactorTwoBackupCodeCard.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorOne.js +4 -4
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorOne.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorTwo.js +1 -1
- package/dist/no-rhc/components/UserVerification/UserVerificationFactorTwo.js.map +1 -1
- package/dist/no-rhc/components/UserVerification/useReverificationAlternativeStrategies.js +2 -5
- package/dist/no-rhc/components/UserVerification/useReverificationAlternativeStrategies.js.map +1 -1
- package/dist/no-rhc/index.js +1 -1
- package/dist/server.js +1 -1
- package/dist/ui.browser.js +2 -2
- package/dist/ui.legacy.browser.js +1 -1
- package/dist/ui.shared.browser.js +3 -3
- package/dist/userverification_ui_556274_1.32.3.js +1 -0
- package/dist/userverification_ui_7d0851_1.32.3.js +1 -0
- package/dist/userverification_ui_d0fd36_1.32.3.js +1 -0
- package/dist-mosaic/index.d.ts +2 -0
- package/dist-mosaic/index.d.ts.map +1 -1
- package/dist-mosaic/index.js +5 -4
- package/dist-mosaic/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/userverification_ui_318bff_1.32.3-snapshot.v20260909015433.js +0 -1
- package/dist/userverification_ui_41be45_1.32.3-snapshot.v20260909015433.js +0 -1
- package/dist/userverification_ui_9f3adf_1.32.3-snapshot.v20260909015433.js +0 -1
- /package/dist/{2014_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 2014_ui_556274_1.32.3.js} +0 -0
- /package/dist/{2014_ui_318bff_1.32.3-snapshot.v20260909015433.js → 2014_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{2014_ui_41be45_1.32.3-snapshot.v20260909015433.js → 2014_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{4424_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 4424_ui_556274_1.32.3.js} +0 -0
- /package/dist/{4424_ui_318bff_1.32.3-snapshot.v20260909015433.js → 4424_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{4424_ui_41be45_1.32.3-snapshot.v20260909015433.js → 4424_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{6678_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 6678_ui_556274_1.32.3.js} +0 -0
- /package/dist/{6678_ui_318bff_1.32.3-snapshot.v20260909015433.js → 6678_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{6678_ui_41be45_1.32.3-snapshot.v20260909015433.js → 6678_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{7574_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 7574_ui_556274_1.32.3.js} +0 -0
- /package/dist/{7574_ui_318bff_1.32.3-snapshot.v20260909015433.js → 7574_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{7574_ui_41be45_1.32.3-snapshot.v20260909015433.js → 7574_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{8316_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 8316_ui_556274_1.32.3.js} +0 -0
- /package/dist/{8316_ui_318bff_1.32.3-snapshot.v20260909015433.js → 8316_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{8316_ui_41be45_1.32.3-snapshot.v20260909015433.js → 8316_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{8746_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 8746_ui_556274_1.32.3.js} +0 -0
- /package/dist/{8746_ui_318bff_1.32.3-snapshot.v20260909015433.js → 8746_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{8746_ui_41be45_1.32.3-snapshot.v20260909015433.js → 8746_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{9419_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 9419_ui_556274_1.32.3.js} +0 -0
- /package/dist/{9419_ui_318bff_1.32.3-snapshot.v20260909015433.js → 9419_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{9419_ui_41be45_1.32.3-snapshot.v20260909015433.js → 9419_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{980_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → 980_ui_556274_1.32.3.js} +0 -0
- /package/dist/{980_ui_318bff_1.32.3-snapshot.v20260909015433.js → 980_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{980_ui_41be45_1.32.3-snapshot.v20260909015433.js → 980_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → apiKeys_ui_556274_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_318bff_1.32.3-snapshot.v20260909015433.js → apiKeys_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{apiKeys_ui_41be45_1.32.3-snapshot.v20260909015433.js → apiKeys_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_41be45_1.32.3-snapshot.v20260909015433.js → blankcaptcha_ui_556274_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_318bff_1.32.3-snapshot.v20260909015433.js → blankcaptcha_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{blankcaptcha_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → blankcaptcha_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → checkout_ui_556274_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_318bff_1.32.3-snapshot.v20260909015433.js → checkout_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{checkout_ui_41be45_1.32.3-snapshot.v20260909015433.js → checkout_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → configureSSO_ui_556274_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_318bff_1.32.3-snapshot.v20260909015433.js → configureSSO_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{configureSSO_ui_41be45_1.32.3-snapshot.v20260909015433.js → configureSSO_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → copy-api-key-modal_ui_556274_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_318bff_1.32.3-snapshot.v20260909015433.js → copy-api-key-modal_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{copy-api-key-modal_ui_41be45_1.32.3-snapshot.v20260909015433.js → copy-api-key-modal_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → createorganization_ui_556274_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_318bff_1.32.3-snapshot.v20260909015433.js → createorganization_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{createorganization_ui_41be45_1.32.3-snapshot.v20260909015433.js → createorganization_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → credit-history-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → credit-history-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{credit-history-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → credit-history-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → enableOrganizationsPrompt_ui_556274_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_318bff_1.32.3-snapshot.v20260909015433.js → enableOrganizationsPrompt_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{enableOrganizationsPrompt_ui_41be45_1.32.3-snapshot.v20260909015433.js → enableOrganizationsPrompt_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{framework_ui_318bff_1.32.3-snapshot.v20260909015433.js → framework_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{framework_ui_41be45_1.32.3-snapshot.v20260909015433.js → framework_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → impersonationfab_ui_556274_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_318bff_1.32.3-snapshot.v20260909015433.js → impersonationfab_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{impersonationfab_ui_41be45_1.32.3-snapshot.v20260909015433.js → impersonationfab_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_41be45_1.32.3-snapshot.v20260909015433.js → invitemembers_ui_556274_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_318bff_1.32.3-snapshot.v20260909015433.js → invitemembers_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{invitemembers_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → invitemembers_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{keylessPrompt_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → keylessPrompt_ui_556274_1.32.3.js} +0 -0
- /package/dist/{keylessPrompt_ui_318bff_1.32.3-snapshot.v20260909015433.js → keylessPrompt_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{keylessPrompt_ui_41be45_1.32.3-snapshot.v20260909015433.js → keylessPrompt_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → oauthConsent_ui_556274_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_318bff_1.32.3-snapshot.v20260909015433.js → oauthConsent_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{oauthConsent_ui_41be45_1.32.3-snapshot.v20260909015433.js → oauthConsent_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → oauthDeviceVerification_ui_556274_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_318bff_1.32.3-snapshot.v20260909015433.js → oauthDeviceVerification_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{oauthDeviceVerification_ui_41be45_1.32.3-snapshot.v20260909015433.js → oauthDeviceVerification_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → onetap_ui_556274_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_318bff_1.32.3-snapshot.v20260909015433.js → onetap_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{onetap_ui_41be45_1.32.3-snapshot.v20260909015433.js → onetap_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → op-api-keys-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → op-api-keys-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-api-keys-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → op-api-keys-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → op-billing-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → op-billing-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-billing-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → op-billing-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → op-plans-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → op-plans-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-plans-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → op-plans-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → op-security-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → op-security-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{op-security-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → op-security-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → organizationlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_318bff_1.32.3-snapshot.v20260909015433.js → organizationlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationlist_ui_41be45_1.32.3-snapshot.v20260909015433.js → organizationlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → organizationprofile_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_318bff_1.32.3-snapshot.v20260909015433.js → organizationprofile_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationprofile_ui_41be45_1.32.3-snapshot.v20260909015433.js → organizationprofile_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → organizationswitcher_ui_556274_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_318bff_1.32.3-snapshot.v20260909015433.js → organizationswitcher_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{organizationswitcher_ui_41be45_1.32.3-snapshot.v20260909015433.js → organizationswitcher_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → payment-attempt-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → payment-attempt-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{payment-attempt-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → payment-attempt-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → planDetails_ui_556274_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_318bff_1.32.3-snapshot.v20260909015433.js → planDetails_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{planDetails_ui_41be45_1.32.3-snapshot.v20260909015433.js → planDetails_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_41be45_1.32.3-snapshot.v20260909015433.js → prefetchorganizationlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_318bff_1.32.3-snapshot.v20260909015433.js → prefetchorganizationlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{prefetchorganizationlist_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → prefetchorganizationlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → pricingTable_ui_556274_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_318bff_1.32.3-snapshot.v20260909015433.js → pricingTable_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{pricingTable_ui_41be45_1.32.3-snapshot.v20260909015433.js → pricingTable_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → revoke-api-key-modal_ui_556274_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_318bff_1.32.3-snapshot.v20260909015433.js → revoke-api-key-modal_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{revoke-api-key-modal_ui_41be45_1.32.3-snapshot.v20260909015433.js → revoke-api-key-modal_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → sessionTasks_ui_556274_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_318bff_1.32.3-snapshot.v20260909015433.js → sessionTasks_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{sessionTasks_ui_41be45_1.32.3-snapshot.v20260909015433.js → sessionTasks_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{signin_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → signin_ui_556274_1.32.3.js} +0 -0
- /package/dist/{signin_ui_318bff_1.32.3-snapshot.v20260909015433.js → signin_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{signin_ui_41be45_1.32.3-snapshot.v20260909015433.js → signin_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{signup_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → signup_ui_556274_1.32.3.js} +0 -0
- /package/dist/{signup_ui_318bff_1.32.3-snapshot.v20260909015433.js → signup_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{signup_ui_41be45_1.32.3-snapshot.v20260909015433.js → signup_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → statement-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → statement-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{statement-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → statement-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → subscriptionDetails_ui_556274_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_318bff_1.32.3-snapshot.v20260909015433.js → subscriptionDetails_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{subscriptionDetails_ui_41be45_1.32.3-snapshot.v20260909015433.js → subscriptionDetails_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → taskChooseOrganization_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_318bff_1.32.3-snapshot.v20260909015433.js → taskChooseOrganization_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskChooseOrganization_ui_41be45_1.32.3-snapshot.v20260909015433.js → taskChooseOrganization_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → taskResetPassword_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_318bff_1.32.3-snapshot.v20260909015433.js → taskResetPassword_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskResetPassword_ui_41be45_1.32.3-snapshot.v20260909015433.js → taskResetPassword_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → taskSetupMFA_ui_556274_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_318bff_1.32.3-snapshot.v20260909015433.js → taskSetupMFA_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{taskSetupMFA_ui_41be45_1.32.3-snapshot.v20260909015433.js → taskSetupMFA_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{ui-common_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → ui-common_ui_556274_1.32.3.js} +0 -0
- /package/dist/{ui-common_ui_318bff_1.32.3-snapshot.v20260909015433.js → ui-common_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{ui-common_ui_41be45_1.32.3-snapshot.v20260909015433.js → ui-common_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → up-api-keys-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → up-api-keys-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-api-keys-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → up-api-keys-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → up-billing-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → up-billing-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-billing-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → up-billing-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_41be45_1.32.3-snapshot.v20260909015433.js → up-plans-page_ui_556274_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_318bff_1.32.3-snapshot.v20260909015433.js → up-plans-page_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{up-plans-page_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → up-plans-page_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → useravatar_ui_556274_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_318bff_1.32.3-snapshot.v20260909015433.js → useravatar_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{useravatar_ui_41be45_1.32.3-snapshot.v20260909015433.js → useravatar_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → userbutton_ui_556274_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_318bff_1.32.3-snapshot.v20260909015433.js → userbutton_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{userbutton_ui_41be45_1.32.3-snapshot.v20260909015433.js → userbutton_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → userprofile_ui_556274_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_318bff_1.32.3-snapshot.v20260909015433.js → userprofile_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{userprofile_ui_41be45_1.32.3-snapshot.v20260909015433.js → userprofile_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → vendors_ui_556274_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_318bff_1.32.3-snapshot.v20260909015433.js → vendors_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{vendors_ui_41be45_1.32.3-snapshot.v20260909015433.js → vendors_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → waitlist_ui_556274_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_318bff_1.32.3-snapshot.v20260909015433.js → waitlist_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{waitlist_ui_41be45_1.32.3-snapshot.v20260909015433.js → waitlist_ui_d0fd36_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_9f3adf_1.32.3-snapshot.v20260909015433.js → web3-solana-wallet-buttons_ui_556274_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_318bff_1.32.3-snapshot.v20260909015433.js → web3-solana-wallet-buttons_ui_7d0851_1.32.3.js} +0 -0
- /package/dist/{web3-solana-wallet-buttons_ui_41be45_1.32.3-snapshot.v20260909015433.js → web3-solana-wallet-buttons_ui_d0fd36_1.32.3.js} +0 -0
package/dist/ClerkUI.js
CHANGED
|
@@ -22,8 +22,8 @@ import { isVersionAtLeast, parseVersion } from "@clerk/shared/versionCheck";
|
|
|
22
22
|
* @public
|
|
23
23
|
*/
|
|
24
24
|
var ClerkUI = class ClerkUI {
|
|
25
|
-
static version = "1.32.3
|
|
26
|
-
version = "1.32.3
|
|
25
|
+
static version = "1.32.3";
|
|
26
|
+
version = "1.32.3";
|
|
27
27
|
#componentRenderer;
|
|
28
28
|
/**
|
|
29
29
|
* Creates a new `ClerkUI` instance and mounts the internal component renderer.
|
|
@@ -27,7 +27,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
27
27
|
const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;
|
|
28
28
|
const card = useCardState();
|
|
29
29
|
const { data } = useUserVerificationSession();
|
|
30
|
-
const { firstPartyFactors,
|
|
30
|
+
const { firstPartyFactors, hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
31
31
|
filterOutFactor: props?.currentFactor,
|
|
32
32
|
supportedFirstFactors: data?.supportedFirstFactors
|
|
33
33
|
});
|
|
@@ -42,7 +42,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
42
42
|
gap: 6,
|
|
43
43
|
children: /* @__PURE__ */ jsxs(Col, {
|
|
44
44
|
gap: 4,
|
|
45
|
-
children: [
|
|
45
|
+
children: [hasAlternativeStrategies && /* @__PURE__ */ jsx(Flex, {
|
|
46
46
|
elementDescriptor: descriptors.alternativeMethods,
|
|
47
47
|
direction: "col",
|
|
48
48
|
gap: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors,
|
|
1
|
+
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors, hasAlternativeStrategies } =\n useReverificationAlternativeStrategies<SessionVerificationFirstFactor>({\n filterOutFactor: props?.currentFactor,\n supportedFirstFactors: data?.supportedFirstFactors,\n });\n\n return (\n <Flow.Part part={'alternativeMethods'}>\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.alternativeMethods.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.alternativeMethods.subtitle')} />\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={6}\n >\n <Col gap={4}>\n {hasAlternativeStrategies && (\n <Flex\n elementDescriptor={descriptors.alternativeMethods}\n direction='col'\n gap={2}\n >\n {firstPartyFactors.map((factor, i) => (\n <ArrowBlockButton\n leftIcon={getButtonIcon(factor)}\n textLocalizationKey={getButtonLabel(factor)}\n elementDescriptor={descriptors.alternativeMethodsBlockButton}\n textElementDescriptor={descriptors.alternativeMethodsBlockButtonText}\n arrowElementDescriptor={descriptors.alternativeMethodsBlockButtonArrow}\n key={i}\n textVariant='buttonLarge'\n isDisabled={card.isLoading}\n onClick={() => {\n card.setError(undefined);\n onFactorSelected(factor);\n }}\n />\n ))}\n </Flex>\n )}\n {onBackLinkClick && (\n <BackLink\n boxElementDescriptor={descriptors.backRow}\n linkElementDescriptor={descriptors.backLink}\n onClick={onBackLinkClick}\n />\n )}\n </Col>\n </Flex>\n </Card.Content>\n\n <Card.Footer>\n <Card.Action elementId='havingTrouble'>\n <Card.ActionText localizationKey={localizationKeys('reverification.alternativeMethods.actionText')} />\n <Card.ActionLink\n localizationKey={localizationKeys('reverification.alternativeMethods.actionLink')}\n onClick={onHavingTroubleClick}\n />\n </Card.Action>\n </Card.Footer>\n </Card.Root>\n </Flow.Part>\n );\n};\n\nexport function getButtonLabel(factor: SessionVerificationFirstFactor): LocalizationKey {\n switch (factor.strategy) {\n case 'email_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__emailCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'phone_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__phoneCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'password':\n return localizationKeys('reverification.alternativeMethods.blockButton__password');\n case 'passkey':\n return localizationKeys('reverification.alternativeMethods.blockButton__passkey');\n default:\n throw new Error(`Invalid sign in strategy: \"${(factor as any).strategy}\"`);\n }\n}\n\nexport function getButtonIcon(factor: SessionVerificationFirstFactor) {\n const icons = {\n email_code: Envelope,\n phone_code: SpeechBubble,\n password: Lock,\n passkey: Fingerprint,\n enterprise_sso: Building,\n } as const;\n\n return icons[factor.strategy];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAa,sBAAsB,UAAmC;CACpE,OAAO,kBAAkB,wBAAwB,EAC/C,GAAG,MACL,CAAC;AACH;AAEA,MAAM,0BAA0B,UAAsC;CACpE,MAAM,EAAE,iBAAiB,sBAAsB,qBAAqB;CACpE,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,EAAE,mBAAmB,6BACzB,uCAAuE;EACrE,iBAAiB,OAAO;EACxB,uBAAuB,MAAM;CAC/B,CAAC;CAEH,OACE,oBAAC,KAAK,MAAN;EAAW,MAAM;YACf,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;GACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,yCAAyC,EAAI,IAC7F,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,4CAA4C,EAAI,EACxF;GACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;GAEpC,oBAAC,MAAD;IACE,WAAU;IACV,mBAAmB,YAAY;IAC/B,KAAK;cAEL,qBAAC,KAAD;KAAK,KAAK;eAAV,CACG,4BACC,oBAAC,MAAD;MACE,mBAAmB,YAAY;MAC/B,WAAU;MACV,KAAK;gBAEJ,kBAAkB,KAAK,QAAQ,MAC9B,oBAAC,kBAAD;OACE,UAAU,cAAc,MAAM;OAC9B,qBAAqB,eAAe,MAAM;OAC1C,mBAAmB,YAAY;OAC/B,uBAAuB,YAAY;OACnC,wBAAwB,YAAY;OAEpC,aAAY;OACZ,YAAY,KAAK;OACjB,eAAe;QACb,KAAK,SAAS,MAAS;QACvB,iBAAiB,MAAM;OACzB;MACD,GAPM,CAON,CACF;KACG,IAEP,mBACC,oBAAC,UAAD;MACE,sBAAsB,YAAY;MAClC,uBAAuB,YAAY;MACnC,SAAS;KACV,EAEA;;GACD;EACM,MAEd,oBAAC,KAAK,QAAN,YACE,qBAAC,KAAK,QAAN;GAAa,WAAU;aAAvB,CACE,oBAAC,KAAK,YAAN,EAAiB,iBAAiB,iBAAiB,8CAA8C,EAAI,IACrG,oBAAC,KAAK,YAAN;IACE,iBAAiB,iBAAiB,8CAA8C;IAChF,SAAS;GACV,EACU;KACF,EACJ;CACF;AAEf;AAEA,SAAgB,eAAe,QAAyD;CACtF,QAAQ,OAAO,UAAf;EACE,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,YACH,OAAO,iBAAiB,yDAAyD;EACnF,KAAK,WACH,OAAO,iBAAiB,wDAAwD;EAClF,SACE,MAAM,IAAI,MAAM,8BAA+B,OAAe,SAAS,EAAE;CAC7E;AACF;AAEA,SAAgB,cAAc,QAAwC;CASpE,OAAO;EAPL,YAAYA;EACZ,YAAYC;EACZ,UAAUC;EACV,SAASC;EACT,gBAAgBC;CAGP,EAAE,OAAO;AACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } 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 { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked
|
|
1
|
+
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } 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 { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked?: React.MouseEventHandler;\n};\n\nexport const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) => {\n const { onShowAlternativeMethodsClicked } = props;\n const { session } = useSession();\n const { handleVerificationResponse } = useAfterVerification();\n\n const card = useCardState();\n const codeControl = useFormControl('code', '', {\n type: 'text',\n label: localizationKeys('formFieldLabel__backupCode'),\n isRequired: true,\n });\n\n const handleBackupCodeSubmit: React.FormEventHandler = e => {\n e.preventDefault();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return session!\n .attemptSecondFactorVerification({ strategy: 'backup_code', code: codeControl.value })\n .then(handleVerificationResponse)\n .catch(err => handleError(err, [codeControl], card.setError));\n };\n\n return (\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.backupCodeMfa.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.backupCodeMfa.subtitle')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n <Col\n elementDescriptor={descriptors.main}\n gap={8}\n >\n <Form.Root onSubmit={handleBackupCodeSubmit}>\n <Form.ControlRow elementId={codeControl.id}>\n <Form.PlainInput\n {...codeControl.props}\n autoFocus\n onActionClicked={onShowAlternativeMethodsClicked}\n />\n </Form.ControlRow>\n <Col gap={3}>\n <Form.SubmitButton hasArrow />\n <Card.Action elementId='alternativeMethods'>\n {onShowAlternativeMethodsClicked && (\n <Card.ActionLink\n localizationKey={localizationKeys('footerActionLink__useAnotherMethod')}\n onClick={onShowAlternativeMethodsClicked}\n />\n )}\n </Card.Action>\n </Col>\n </Form.Root>\n </Col>\n </Card.Content>\n\n <Card.Footer />\n </Card.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,6BAA6B,UAA0C;CAClF,MAAM,EAAE,oCAAoC;CAC5C,MAAM,EAAE,YAAY,WAAW;CAC/B,MAAM,EAAE,+BAA+B,qBAAqB;CAE5D,MAAM,OAAO,aAAa;CAC1B,MAAM,cAAc,eAAe,QAAQ,IAAI;EAC7C,MAAM;EACN,OAAO,iBAAiB,4BAA4B;EACpD,YAAY;CACd,CAAC;CAED,MAAM,0BAAiD,MAAK;EAC1D,EAAE,eAAe;EAEjB,OAAO,QACJ,gCAAgC;GAAE,UAAU;GAAe,MAAM,YAAY;EAAM,CAAC,CAAC,CACrF,KAAK,0BAA0B,CAAC,CAChC,OAAM,QAAO,YAAY,KAAK,CAAC,WAAW,GAAG,KAAK,QAAQ,CAAC;CAChE;CAEA,OACE,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;EACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,oCAAoC,EAAI,IACxF,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,uCAAuC,EAAI,EACnF;EACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;EACpC,oBAAC,KAAD;GACE,mBAAmB,YAAY;GAC/B,KAAK;aAEL,qBAAC,KAAK,MAAN;IAAW,UAAU;cAArB,CACE,oBAAC,KAAK,YAAN;KAAiB,WAAW,YAAY;eACtC,oBAAC,KAAK,YAAN;MACE,GAAI,YAAY;MAChB;MACA,iBAAiB;KAClB;IACc,IACjB,qBAAC,KAAD;KAAK,KAAK;eAAV,CACE,oBAAC,KAAK,cAAN,EAAmB,eAAU,IAC7B,oBAAC,KAAK,QAAN;MAAa,WAAU;gBACpB,mCACC,oBAAC,KAAK,YAAN;OACE,iBAAiB,iBAAiB,oCAAoC;OACtE,SAAS;MACV;KAEQ,EACV;MACI;;EACR;CACO,MAEd,oBAAC,KAAK,QAAN,CAAc,EACL;AAEf"}
|
|
@@ -44,12 +44,12 @@ function UserVerificationFactorOneInternal() {
|
|
|
44
44
|
currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),
|
|
45
45
|
prevCurrentFactor: void 0
|
|
46
46
|
}));
|
|
47
|
-
const {
|
|
47
|
+
const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
48
48
|
filterOutFactor: currentFactor,
|
|
49
49
|
supportedFirstFactors: availableFactors
|
|
50
50
|
});
|
|
51
51
|
const [showAllStrategies, setShowAllStrategies] = React.useState(() => !currentFactor || !factorHasLocalStrategy(currentFactor));
|
|
52
|
-
const toggleAllStrategies =
|
|
52
|
+
const toggleAllStrategies = hasAlternativeStrategies ? () => {
|
|
53
53
|
card.setError(void 0);
|
|
54
54
|
setShowAllStrategies((s) => !s);
|
|
55
55
|
} : void 0;
|
|
@@ -94,14 +94,14 @@ function UserVerificationFactorOneInternal() {
|
|
|
94
94
|
onFactorPrepare: handleFactorPrepare,
|
|
95
95
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
96
96
|
factor: currentFactor,
|
|
97
|
-
showAlternativeMethods:
|
|
97
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
98
98
|
});
|
|
99
99
|
case "phone_code": return /* @__PURE__ */ jsx(UVFactorOnePhoneCodeCard, {
|
|
100
100
|
factorAlreadyPrepared: lastPreparedFactorKeyRef.current === factorKey(currentFactor),
|
|
101
101
|
onFactorPrepare: handleFactorPrepare,
|
|
102
102
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
103
103
|
factor: currentFactor,
|
|
104
|
-
showAlternativeMethods:
|
|
104
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
105
105
|
});
|
|
106
106
|
case "passkey": return /* @__PURE__ */ jsx(UVFactorOnePasskeysCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
107
107
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const {
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({\n filterOutFactor: currentFactor,\n supportedFirstFactors: availableFactors,\n });\n\n const [showAllStrategies, setShowAllStrategies] = React.useState<boolean>(\n () => !currentFactor || !factorHasLocalStrategy(currentFactor),\n );\n\n const toggleAllStrategies = hasAlternativeStrategies\n ? () => {\n card.setError(undefined);\n setShowAllStrategies(s => !s);\n }\n : undefined;\n\n const handleFactorPrepare = () => {\n lastPreparedFactorKeyRef.current = factorKey(currentFactor);\n };\n\n const selectFactor = (factor: SignInFactor) => {\n setFactor(prev => ({\n currentFactor: factor,\n prevCurrentFactor: prev.currentFactor,\n }));\n };\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_second_factor') {\n void navigate('factor-two');\n }\n }, []);\n\n if (!currentFactor) {\n return (\n <ErrorCard\n cardTitle={localizationKeys('reverification.noAvailableMethods.title')}\n cardSubtitle={localizationKeys('reverification.noAvailableMethods.subtitle')}\n message={localizationKeys('reverification.noAvailableMethods.message')}\n shouldNavigateBack={false}\n />\n );\n }\n\n if (showAllStrategies) {\n const canGoBack = factorHasLocalStrategy(currentFactor);\n\n const toggle = toggleAllStrategies;\n const backHandler = () => {\n card.setError(undefined);\n toggle?.();\n };\n\n return (\n <AlternativeMethods\n onBackLinkClick={canGoBack ? backHandler : undefined}\n onFactorSelected={f => {\n selectFactor(f);\n toggle?.();\n }}\n currentFactor={currentFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'password':\n return <UserVerificationFactorOnePasswordCard onShowAlternativeMethodsClick={toggleAllStrategies} />;\n case 'email_code':\n return (\n <UVFactorOneEmailCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'phone_code':\n return (\n <UVFactorOnePhoneCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'passkey':\n return <UVFactorOnePasskeysCard onShowAlternativeMethodsClicked={toggleAllStrategies} />;\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorOne = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorOneInternal),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAM,aAAa,WAA4C;CAC7D,IAAI,CAAC,QACH,OAAO;CAET,IAAI,MAAM,OAAO;CACjB,IAAI,oBAAoB,QACtB,OAAO,OAAO;CAEhB,IAAI,mBAAmB,QACrB,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,MAAM,uBAAqE;CACzE;CACA;CACA;CACA;AACF;AAEA,SAAgB,oCAAwD;CACtE,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,aAAa,UAAU;CAE/B,MAAM,2BAA2B,MAAM,OAAO,EAAE;CAEhD,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,uBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,qBAAqB,CAAC;CAC9C,MAAM,EAAE,4BAA4B,eAAe,CAAC,CAAC;CAErD,MAAM,CAAC,EAAE,iBAAiB,aAAa,MAAM,gBAGnC;EACR,eAAe,8BAA8B,kBAAkB,MAAM,uBAAuB;EAC5F,mBAAmB;CACrB,EAAE;CAEF,MAAM,EAAE,6BAA6B,uCAAuC;EAC1E,iBAAiB;EACjB,uBAAuB;CACzB,CAAC;CAED,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,eAChD,CAAC,iBAAiB,CAAC,uBAAuB,aAAa,CAC/D;CAEA,MAAM,sBAAsB,iCAClB;EACJ,KAAK,SAAS,MAAS;EACvB,sBAAqB,MAAK,CAAC,CAAC;CAC9B,IACA;CAEJ,MAAM,4BAA4B;EAChC,yBAAyB,UAAU,UAAU,aAAa;CAC5D;CAEA,MAAM,gBAAgB,WAAyB;EAC7C,WAAU,UAAS;GACjB,eAAe;GACf,mBAAmB,KAAK;EAC1B,EAAE;CACJ;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,uBACjC,AAAK,SAAS,YAAY;CAE9B,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OACE,oBAAC,WAAD;EACE,WAAW,iBAAiB,yCAAyC;EACrE,cAAc,iBAAiB,4CAA4C;EAC3E,SAAS,iBAAiB,2CAA2C;EACrE,oBAAoB;CACrB;CAIL,IAAI,mBAAmB;EACrB,MAAM,YAAY,uBAAuB,aAAa;EAEtD,MAAM,SAAS;EACf,MAAM,oBAAoB;GACxB,KAAK,SAAS,MAAS;GACvB,SAAS;EACX;EAEA,OACE,oBAAC,oBAAD;GACE,iBAAiB,YAAY,cAAc;GAC3C,mBAAkB,MAAK;IACrB,aAAa,CAAC;IACd,SAAS;GACX;GACe;EAChB;CAEL;CAEA,QAAQ,eAAe,UAAvB;EACE,KAAK,YACH,OAAO,oBAAC,uCAAD,EAAuC,+BAA+B,oBAAsB;EACrG,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,WACH,OAAO,oBAAC,yBAAD,EAAyB,iCAAiC,oBAAsB;EACzF,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,iCAAiC,CACzD"}
|
|
@@ -52,7 +52,7 @@ function UserVerificationFactorTwoComponent() {
|
|
|
52
52
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
53
53
|
showAlternativeMethods: hasAlternativeStrategies
|
|
54
54
|
});
|
|
55
|
-
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
55
|
+
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: hasAlternativeStrategies ? toggleAllStrategies : void 0 });
|
|
56
56
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return <UVFactorTwoBackupCodeCard
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return (\n <UVFactorTwoBackupCodeCard\n onShowAlternativeMethodsClicked={hasAlternativeStrategies ? toggleAllStrategies : undefined}\n />\n );\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorTwo = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorTwoComponent),\n);\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,uBAAsE;CAC1E;CACA;CACA;AACF;AAEA,SAAgB,qCAAkD;CAChE,MAAM,EAAE,aAAa,UAAU;CAC/B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,wBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,sBAAsB,CAAC;CAE/C,MAAM,EACJ,eACA,uBACA,qBACA,cACA,mBACA,wBACE,yBAA0D,gBAAgB;CAE9E,MAAM,gCAAgC,cAC9B,kBAAkB,QAAO,WAAU,CAAC,sBAAsB,QAAQ,aAAa,CAAC,GACtF,CAAC,kBAAkB,aAAa,CAClC;CAEA,MAAM,2BAA2B,cACxB,iCAAiC,8BAA8B,SAAS,KAAM,OACrF,CAAC,6BAA6B,CAChC;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,sBACjC,AAAK,SAAS,KAAK;CAGvB,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OAAO,oBAAC,aAAD,CAAc;CAGvB,IAAI,qBAAqB,0BACvB,OACE,oBAAC,+BAAD;EACE,wBAAwB,iCAAiC;EACzD,iBAAiB;EACjB,kBAAkB;CACnB;CAIL,QAAQ,eAAe,UAAvB;EACE,KAAK,cACH,OACE,oBAAC,0BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,QACH,OACE,oBAAC,+BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,eACH,OACE,oBAAC,2BAAD,EACE,iCAAiC,2BAA2B,sBAAsB,OACnF;EAEL,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,kCAAkC,CAC1D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allStrategiesButtonsComparator } from "../../utils/factorSorting.js";
|
|
2
|
-
import { factorHasLocalStrategy
|
|
2
|
+
import { factorHasLocalStrategy } from "../SignIn/utils.js";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { isWebAuthnSupported } from "@clerk/shared/webauthn";
|
|
5
5
|
|
|
@@ -16,12 +16,9 @@ const secondFactorsAreEqual = (a, b) => {
|
|
|
16
16
|
return a.strategy === b.strategy;
|
|
17
17
|
};
|
|
18
18
|
function useReverificationAlternativeStrategies({ filterOutFactor, supportedFirstFactors }) {
|
|
19
|
-
const firstFactors = supportedFirstFactors ? supportedFirstFactors.filter((f) => !isResetPasswordStrategy(f.strategy)) : [];
|
|
20
|
-
const shouldAllowForAlternativeStrategies = firstFactors && firstFactors.length > 0;
|
|
21
19
|
const firstPartyFactors = useMemo(() => supportedFirstFactors ? supportedFirstFactors.filter((f) => !f.strategy.startsWith("oauth_")).filter((factor) => factorHasLocalStrategy(factor)).filter((factor) => !firstFactorsAreEqual(factor, filterOutFactor)).filter((factor) => factor.strategy === "passkey" ? isWebAuthnSupported() : true).sort(allStrategiesButtonsComparator) : [], [supportedFirstFactors, filterOutFactor]);
|
|
22
20
|
return {
|
|
23
|
-
|
|
24
|
-
hasFirstParty: firstPartyFactors && firstPartyFactors.length > 0,
|
|
21
|
+
hasAlternativeStrategies: firstPartyFactors.length > 0,
|
|
25
22
|
firstPartyFactors
|
|
26
23
|
};
|
|
27
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy
|
|
1
|
+
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy } from '../SignIn/utils';\n\nconst firstFactorsAreEqual = (a: SignInFactor | null | undefined, b: SignInFactor | null | undefined) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'email_code' && b.strategy === 'email_code') {\n return a.emailAddressId === b.emailAddressId;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport const secondFactorsAreEqual = (\n a: SignInSecondFactor | null | undefined,\n b: SignInSecondFactor | null | undefined,\n) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport function useReverificationAlternativeStrategies<T = SignInFirstFactor>({\n filterOutFactor,\n supportedFirstFactors,\n}: {\n filterOutFactor: SignInFactor | null | undefined;\n supportedFirstFactors: SignInFirstFactor[] | null | undefined;\n}) {\n const firstPartyFactors = useMemo(\n () =>\n supportedFirstFactors\n ? (supportedFirstFactors\n .filter(f => !f.strategy.startsWith('oauth_'))\n .filter(factor => factorHasLocalStrategy(factor))\n .filter(factor => !firstFactorsAreEqual(factor, filterOutFactor))\n // Only include passkey if the device supports it.\n // @ts-ignore Types are not public yet.\n .filter(factor => (factor.strategy === 'passkey' ? isWebAuthnSupported() : true))\n .sort(allStrategiesButtonsComparator) as T[])\n : [],\n [supportedFirstFactors, filterOutFactor],\n );\n\n return {\n hasAlternativeStrategies: firstPartyFactors.length > 0,\n firstPartyFactors,\n };\n}\n"],"mappings":";;;;;;AAQA,MAAM,wBAAwB,GAAoC,MAAuC;CACvG,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,mBAAmB,EAAE;CAGhC,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,MAAa,yBACX,GACA,MACG;CACH,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,SAAgB,uCAA8D,EAC5E,iBACA,yBAIC;CACD,MAAM,oBAAoB,cAEtB,wBACK,sBACE,QAAO,MAAK,CAAC,EAAE,SAAS,WAAW,QAAQ,CAAC,CAAC,CAC7C,QAAO,WAAU,uBAAuB,MAAM,CAAC,CAAC,CAChD,QAAO,WAAU,CAAC,qBAAqB,QAAQ,eAAe,CAAC,CAAC,CAGhE,QAAO,WAAW,OAAO,aAAa,YAAY,oBAAoB,IAAI,IAAK,CAAC,CAChF,KAAK,8BAA8B,IACtC,CAAC,GACP,CAAC,uBAAuB,eAAe,CACzC;CAEA,OAAO;EACL,0BAA0B,kBAAkB,SAAS;EACrD;CACF;AACF"}
|
package/dist/index.js
CHANGED
package/dist/no-rhc/ClerkUI.js
CHANGED
|
@@ -22,8 +22,8 @@ import { isVersionAtLeast, parseVersion } from "@clerk/shared/versionCheck";
|
|
|
22
22
|
* @public
|
|
23
23
|
*/
|
|
24
24
|
var ClerkUI = class ClerkUI {
|
|
25
|
-
static version = "1.32.3
|
|
26
|
-
version = "1.32.3
|
|
25
|
+
static version = "1.32.3";
|
|
26
|
+
version = "1.32.3";
|
|
27
27
|
#componentRenderer;
|
|
28
28
|
/**
|
|
29
29
|
* Creates a new `ClerkUI` instance and mounts the internal component renderer.
|
|
@@ -27,7 +27,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
27
27
|
const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;
|
|
28
28
|
const card = useCardState();
|
|
29
29
|
const { data } = useUserVerificationSession();
|
|
30
|
-
const { firstPartyFactors,
|
|
30
|
+
const { firstPartyFactors, hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
31
31
|
filterOutFactor: props?.currentFactor,
|
|
32
32
|
supportedFirstFactors: data?.supportedFirstFactors
|
|
33
33
|
});
|
|
@@ -42,7 +42,7 @@ const AlternativeMethodsList = (props) => {
|
|
|
42
42
|
gap: 6,
|
|
43
43
|
children: /* @__PURE__ */ jsxs(Col, {
|
|
44
44
|
gap: 4,
|
|
45
|
-
children: [
|
|
45
|
+
children: [hasAlternativeStrategies && /* @__PURE__ */ jsx(Flex, {
|
|
46
46
|
elementDescriptor: descriptors.alternativeMethods,
|
|
47
47
|
direction: "col",
|
|
48
48
|
gap: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors,
|
|
1
|
+
{"version":3,"file":"AlternativeMethods.js","names":["Envelope","SpeechBubble","Lock","Fingerprint","Building"],"sources":["../../../../src/components/UserVerification/AlternativeMethods.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React from 'react';\n\nimport { ArrowBlockButton } from '@/ui/elements/ArrowBlockButton';\nimport { BackLink } from '@/ui/elements/BackLink';\nimport { Card } from '@/ui/elements/Card';\nimport { Header } from '@/ui/elements/Header';\nimport { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';\n\nimport type { LocalizationKey } from '../../customizables';\nimport { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';\nimport { useCardState } from '../../elements/contexts';\nimport { Building, Envelope, Fingerprint, Lock, SpeechBubble } from '../../icons';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { useUserVerificationSession } from './useUserVerificationSession';\nimport { withHavingTrouble } from './withHavingTrouble';\n\nexport type AlternativeMethodsProps = {\n onBackLinkClick: React.MouseEventHandler | undefined;\n onFactorSelected: (factor: SignInFactor) => void;\n currentFactor: SignInFactor | undefined | null;\n};\n\nexport type AlternativeMethodListProps = AlternativeMethodsProps & { onHavingTroubleClick: React.MouseEventHandler };\n\nexport const AlternativeMethods = (props: AlternativeMethodsProps) => {\n return withHavingTrouble(AlternativeMethodsList, {\n ...props,\n });\n};\n\nconst AlternativeMethodsList = (props: AlternativeMethodListProps) => {\n const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props;\n const card = useCardState();\n const { data } = useUserVerificationSession();\n const { firstPartyFactors, hasAlternativeStrategies } =\n useReverificationAlternativeStrategies<SessionVerificationFirstFactor>({\n filterOutFactor: props?.currentFactor,\n supportedFirstFactors: data?.supportedFirstFactors,\n });\n\n return (\n <Flow.Part part={'alternativeMethods'}>\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.alternativeMethods.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.alternativeMethods.subtitle')} />\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={6}\n >\n <Col gap={4}>\n {hasAlternativeStrategies && (\n <Flex\n elementDescriptor={descriptors.alternativeMethods}\n direction='col'\n gap={2}\n >\n {firstPartyFactors.map((factor, i) => (\n <ArrowBlockButton\n leftIcon={getButtonIcon(factor)}\n textLocalizationKey={getButtonLabel(factor)}\n elementDescriptor={descriptors.alternativeMethodsBlockButton}\n textElementDescriptor={descriptors.alternativeMethodsBlockButtonText}\n arrowElementDescriptor={descriptors.alternativeMethodsBlockButtonArrow}\n key={i}\n textVariant='buttonLarge'\n isDisabled={card.isLoading}\n onClick={() => {\n card.setError(undefined);\n onFactorSelected(factor);\n }}\n />\n ))}\n </Flex>\n )}\n {onBackLinkClick && (\n <BackLink\n boxElementDescriptor={descriptors.backRow}\n linkElementDescriptor={descriptors.backLink}\n onClick={onBackLinkClick}\n />\n )}\n </Col>\n </Flex>\n </Card.Content>\n\n <Card.Footer>\n <Card.Action elementId='havingTrouble'>\n <Card.ActionText localizationKey={localizationKeys('reverification.alternativeMethods.actionText')} />\n <Card.ActionLink\n localizationKey={localizationKeys('reverification.alternativeMethods.actionLink')}\n onClick={onHavingTroubleClick}\n />\n </Card.Action>\n </Card.Footer>\n </Card.Root>\n </Flow.Part>\n );\n};\n\nexport function getButtonLabel(factor: SessionVerificationFirstFactor): LocalizationKey {\n switch (factor.strategy) {\n case 'email_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__emailCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'phone_code':\n return localizationKeys('reverification.alternativeMethods.blockButton__phoneCode', {\n identifier: formatSafeIdentifier(factor.safeIdentifier) || '',\n });\n case 'password':\n return localizationKeys('reverification.alternativeMethods.blockButton__password');\n case 'passkey':\n return localizationKeys('reverification.alternativeMethods.blockButton__passkey');\n default:\n throw new Error(`Invalid sign in strategy: \"${(factor as any).strategy}\"`);\n }\n}\n\nexport function getButtonIcon(factor: SessionVerificationFirstFactor) {\n const icons = {\n email_code: Envelope,\n phone_code: SpeechBubble,\n password: Lock,\n passkey: Fingerprint,\n enterprise_sso: Building,\n } as const;\n\n return icons[factor.strategy];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAa,sBAAsB,UAAmC;CACpE,OAAO,kBAAkB,wBAAwB,EAC/C,GAAG,MACL,CAAC;AACH;AAEA,MAAM,0BAA0B,UAAsC;CACpE,MAAM,EAAE,iBAAiB,sBAAsB,qBAAqB;CACpE,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,EAAE,mBAAmB,6BACzB,uCAAuE;EACrE,iBAAiB,OAAO;EACxB,uBAAuB,MAAM;CAC/B,CAAC;CAEH,OACE,oBAAC,KAAK,MAAN;EAAW,MAAM;YACf,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;GACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,yCAAyC,EAAI,IAC7F,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,4CAA4C,EAAI,EACxF;GACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;GAEpC,oBAAC,MAAD;IACE,WAAU;IACV,mBAAmB,YAAY;IAC/B,KAAK;cAEL,qBAAC,KAAD;KAAK,KAAK;eAAV,CACG,4BACC,oBAAC,MAAD;MACE,mBAAmB,YAAY;MAC/B,WAAU;MACV,KAAK;gBAEJ,kBAAkB,KAAK,QAAQ,MAC9B,oBAAC,kBAAD;OACE,UAAU,cAAc,MAAM;OAC9B,qBAAqB,eAAe,MAAM;OAC1C,mBAAmB,YAAY;OAC/B,uBAAuB,YAAY;OACnC,wBAAwB,YAAY;OAEpC,aAAY;OACZ,YAAY,KAAK;OACjB,eAAe;QACb,KAAK,SAAS,MAAS;QACvB,iBAAiB,MAAM;OACzB;MACD,GAPM,CAON,CACF;KACG,IAEP,mBACC,oBAAC,UAAD;MACE,sBAAsB,YAAY;MAClC,uBAAuB,YAAY;MACnC,SAAS;KACV,EAEA;;GACD;EACM,MAEd,oBAAC,KAAK,QAAN,YACE,qBAAC,KAAK,QAAN;GAAa,WAAU;aAAvB,CACE,oBAAC,KAAK,YAAN,EAAiB,iBAAiB,iBAAiB,8CAA8C,EAAI,IACrG,oBAAC,KAAK,YAAN;IACE,iBAAiB,iBAAiB,8CAA8C;IAChF,SAAS;GACV,EACU;KACF,EACJ;CACF;AAEf;AAEA,SAAgB,eAAe,QAAyD;CACtF,QAAQ,OAAO,UAAf;EACE,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,cACH,OAAO,iBAAiB,4DAA4D,EAClF,YAAY,qBAAqB,OAAO,cAAc,KAAK,GAC7D,CAAC;EACH,KAAK,YACH,OAAO,iBAAiB,yDAAyD;EACnF,KAAK,WACH,OAAO,iBAAiB,wDAAwD;EAClF,SACE,MAAM,IAAI,MAAM,8BAA+B,OAAe,SAAS,EAAE;CAC7E;AACF;AAEA,SAAgB,cAAc,QAAwC;CASpE,OAAO;EAPL,YAAYA;EACZ,YAAYC;EACZ,UAAUC;EACV,SAASC;EACT,gBAAgBC;CAGP,EAAE,OAAO;AACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } 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 { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked
|
|
1
|
+
{"version":3,"file":"UVFactorTwoBackupCodeCard.js","names":[],"sources":["../../../../src/components/UserVerification/UVFactorTwoBackupCodeCard.tsx"],"sourcesContent":["import { useSession } 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 { handleError } from '@/ui/utils/errorHandler';\nimport { useFormControl } from '@/ui/utils/useFormControl';\n\nimport { Col, descriptors, localizationKeys } from '../../customizables';\nimport { useAfterVerification } from './use-after-verification';\n\ntype UVFactorTwoBackupCodeCardProps = {\n onShowAlternativeMethodsClicked?: React.MouseEventHandler;\n};\n\nexport const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) => {\n const { onShowAlternativeMethodsClicked } = props;\n const { session } = useSession();\n const { handleVerificationResponse } = useAfterVerification();\n\n const card = useCardState();\n const codeControl = useFormControl('code', '', {\n type: 'text',\n label: localizationKeys('formFieldLabel__backupCode'),\n isRequired: true,\n });\n\n const handleBackupCodeSubmit: React.FormEventHandler = e => {\n e.preventDefault();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return session!\n .attemptSecondFactorVerification({ strategy: 'backup_code', code: codeControl.value })\n .then(handleVerificationResponse)\n .catch(err => handleError(err, [codeControl], card.setError));\n };\n\n return (\n <Card.Root>\n <Card.Content>\n <Header.Root>\n <Header.Title localizationKey={localizationKeys('reverification.backupCodeMfa.title')} />\n <Header.Subtitle localizationKey={localizationKeys('reverification.backupCodeMfa.subtitle')} />\n </Header.Root>\n <Card.Alert>{card.error}</Card.Alert>\n <Col\n elementDescriptor={descriptors.main}\n gap={8}\n >\n <Form.Root onSubmit={handleBackupCodeSubmit}>\n <Form.ControlRow elementId={codeControl.id}>\n <Form.PlainInput\n {...codeControl.props}\n autoFocus\n onActionClicked={onShowAlternativeMethodsClicked}\n />\n </Form.ControlRow>\n <Col gap={3}>\n <Form.SubmitButton hasArrow />\n <Card.Action elementId='alternativeMethods'>\n {onShowAlternativeMethodsClicked && (\n <Card.ActionLink\n localizationKey={localizationKeys('footerActionLink__useAnotherMethod')}\n onClick={onShowAlternativeMethodsClicked}\n />\n )}\n </Card.Action>\n </Col>\n </Form.Root>\n </Col>\n </Card.Content>\n\n <Card.Footer />\n </Card.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAa,6BAA6B,UAA0C;CAClF,MAAM,EAAE,oCAAoC;CAC5C,MAAM,EAAE,YAAY,WAAW;CAC/B,MAAM,EAAE,+BAA+B,qBAAqB;CAE5D,MAAM,OAAO,aAAa;CAC1B,MAAM,cAAc,eAAe,QAAQ,IAAI;EAC7C,MAAM;EACN,OAAO,iBAAiB,4BAA4B;EACpD,YAAY;CACd,CAAC;CAED,MAAM,0BAAiD,MAAK;EAC1D,EAAE,eAAe;EAEjB,OAAO,QACJ,gCAAgC;GAAE,UAAU;GAAe,MAAM,YAAY;EAAM,CAAC,CAAC,CACrF,KAAK,0BAA0B,CAAC,CAChC,OAAM,QAAO,YAAY,KAAK,CAAC,WAAW,GAAG,KAAK,QAAQ,CAAC;CAChE;CAEA,OACE,qBAAC,KAAK,MAAN,aACE,qBAAC,KAAK,SAAN;EACE,qBAAC,OAAO,MAAR,aACE,oBAAC,OAAO,OAAR,EAAc,iBAAiB,iBAAiB,oCAAoC,EAAI,IACxF,oBAAC,OAAO,UAAR,EAAiB,iBAAiB,iBAAiB,uCAAuC,EAAI,EACnF;EACb,oBAAC,KAAK,OAAN,YAAa,KAAK,MAAkB;EACpC,oBAAC,KAAD;GACE,mBAAmB,YAAY;GAC/B,KAAK;aAEL,qBAAC,KAAK,MAAN;IAAW,UAAU;cAArB,CACE,oBAAC,KAAK,YAAN;KAAiB,WAAW,YAAY;eACtC,oBAAC,KAAK,YAAN;MACE,GAAI,YAAY;MAChB;MACA,iBAAiB;KAClB;IACc,IACjB,qBAAC,KAAD;KAAK,KAAK;eAAV,CACE,oBAAC,KAAK,cAAN,EAAmB,eAAU,IAC7B,oBAAC,KAAK,QAAN;MAAa,WAAU;gBACpB,mCACC,oBAAC,KAAK,YAAN;OACE,iBAAiB,iBAAiB,oCAAoC;OACtE,SAAS;MACV;KAEQ,EACV;MACI;;EACR;CACO,MAEd,oBAAC,KAAK,QAAN,CAAc,EACL;AAEf"}
|
|
@@ -44,12 +44,12 @@ function UserVerificationFactorOneInternal() {
|
|
|
44
44
|
currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),
|
|
45
45
|
prevCurrentFactor: void 0
|
|
46
46
|
}));
|
|
47
|
-
const {
|
|
47
|
+
const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({
|
|
48
48
|
filterOutFactor: currentFactor,
|
|
49
49
|
supportedFirstFactors: availableFactors
|
|
50
50
|
});
|
|
51
51
|
const [showAllStrategies, setShowAllStrategies] = React.useState(() => !currentFactor || !factorHasLocalStrategy(currentFactor));
|
|
52
|
-
const toggleAllStrategies =
|
|
52
|
+
const toggleAllStrategies = hasAlternativeStrategies ? () => {
|
|
53
53
|
card.setError(void 0);
|
|
54
54
|
setShowAllStrategies((s) => !s);
|
|
55
55
|
} : void 0;
|
|
@@ -94,14 +94,14 @@ function UserVerificationFactorOneInternal() {
|
|
|
94
94
|
onFactorPrepare: handleFactorPrepare,
|
|
95
95
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
96
96
|
factor: currentFactor,
|
|
97
|
-
showAlternativeMethods:
|
|
97
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
98
98
|
});
|
|
99
99
|
case "phone_code": return /* @__PURE__ */ jsx(UVFactorOnePhoneCodeCard, {
|
|
100
100
|
factorAlreadyPrepared: lastPreparedFactorKeyRef.current === factorKey(currentFactor),
|
|
101
101
|
onFactorPrepare: handleFactorPrepare,
|
|
102
102
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
103
103
|
factor: currentFactor,
|
|
104
|
-
showAlternativeMethods:
|
|
104
|
+
showAlternativeMethods: hasAlternativeStrategies
|
|
105
105
|
});
|
|
106
106
|
case "passkey": return /* @__PURE__ */ jsx(UVFactorOnePasskeysCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
107
107
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const {
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorOne.js","names":[],"sources":["../../../../src/components/UserVerification/UserVerificationFactorOne.tsx"],"sourcesContent":["import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/shared/types';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { useCardState, withCardStateProvider } from '@/ui/elements/contexts';\nimport { ErrorCard } from '@/ui/elements/ErrorCard';\nimport { LoadingCard } from '@/ui/elements/LoadingCard';\n\nimport { useEnvironment } from '../../contexts';\nimport { localizationKeys } from '../../localization';\nimport { useRouter } from '../../router';\nimport { determineStartingSignInFactor, factorHasLocalStrategy } from '../SignIn/utils';\nimport { AlternativeMethods } from './AlternativeMethods';\nimport { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorOnePasswordCard } from './UserVerificationFactorOnePassword';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorOneEmailCodeCard } from './UVFactorOneEmailCodeCard';\nimport { UVFactorOnePasskeysCard } from './UVFactorOnePasskeysCard';\nimport { UVFactorOnePhoneCodeCard } from './UVFactorOnePhoneCodeCard';\n\nconst factorKey = (factor: SignInFactor | null | undefined) => {\n if (!factor) {\n return '';\n }\n let key = factor.strategy;\n if ('emailAddressId' in factor) {\n key += factor.emailAddressId;\n }\n if ('phoneNumberId' in factor) {\n key += factor.phoneNumberId;\n }\n return key;\n};\n\nconst SUPPORTED_STRATEGIES: SessionVerificationFirstFactor['strategy'][] = [\n 'password',\n 'email_code',\n 'phone_code',\n 'passkey',\n] as const;\n\nexport function UserVerificationFactorOneInternal(): JSX.Element | null {\n const { data } = useUserVerificationSession();\n const card = useCardState();\n const { navigate } = useRouter();\n\n const lastPreparedFactorKeyRef = React.useRef('');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sessionVerification = data!;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedFirstFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedFirstFactors]);\n const { preferredSignInStrategy } = useEnvironment().displayConfig;\n\n const [{ currentFactor }, setFactor] = React.useState<{\n currentFactor: SignInFactor | undefined | null;\n prevCurrentFactor: SignInFactor | undefined | null;\n }>(() => ({\n currentFactor: determineStartingSignInFactor(availableFactors, null, preferredSignInStrategy),\n prevCurrentFactor: undefined,\n }));\n\n const { hasAlternativeStrategies } = useReverificationAlternativeStrategies({\n filterOutFactor: currentFactor,\n supportedFirstFactors: availableFactors,\n });\n\n const [showAllStrategies, setShowAllStrategies] = React.useState<boolean>(\n () => !currentFactor || !factorHasLocalStrategy(currentFactor),\n );\n\n const toggleAllStrategies = hasAlternativeStrategies\n ? () => {\n card.setError(undefined);\n setShowAllStrategies(s => !s);\n }\n : undefined;\n\n const handleFactorPrepare = () => {\n lastPreparedFactorKeyRef.current = factorKey(currentFactor);\n };\n\n const selectFactor = (factor: SignInFactor) => {\n setFactor(prev => ({\n currentFactor: factor,\n prevCurrentFactor: prev.currentFactor,\n }));\n };\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_second_factor') {\n void navigate('factor-two');\n }\n }, []);\n\n if (!currentFactor) {\n return (\n <ErrorCard\n cardTitle={localizationKeys('reverification.noAvailableMethods.title')}\n cardSubtitle={localizationKeys('reverification.noAvailableMethods.subtitle')}\n message={localizationKeys('reverification.noAvailableMethods.message')}\n shouldNavigateBack={false}\n />\n );\n }\n\n if (showAllStrategies) {\n const canGoBack = factorHasLocalStrategy(currentFactor);\n\n const toggle = toggleAllStrategies;\n const backHandler = () => {\n card.setError(undefined);\n toggle?.();\n };\n\n return (\n <AlternativeMethods\n onBackLinkClick={canGoBack ? backHandler : undefined}\n onFactorSelected={f => {\n selectFactor(f);\n toggle?.();\n }}\n currentFactor={currentFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'password':\n return <UserVerificationFactorOnePasswordCard onShowAlternativeMethodsClick={toggleAllStrategies} />;\n case 'email_code':\n return (\n <UVFactorOneEmailCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'phone_code':\n return (\n <UVFactorOnePhoneCodeCard\n factorAlreadyPrepared={lastPreparedFactorKeyRef.current === factorKey(currentFactor)}\n onFactorPrepare={handleFactorPrepare}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n factor={currentFactor}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'passkey':\n return <UVFactorOnePasskeysCard onShowAlternativeMethodsClicked={toggleAllStrategies} />;\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorOne = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorOneInternal),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAM,aAAa,WAA4C;CAC7D,IAAI,CAAC,QACH,OAAO;CAET,IAAI,MAAM,OAAO;CACjB,IAAI,oBAAoB,QACtB,OAAO,OAAO;CAEhB,IAAI,mBAAmB,QACrB,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,MAAM,uBAAqE;CACzE;CACA;CACA;CACA;AACF;AAEA,SAAgB,oCAAwD;CACtE,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,OAAO,aAAa;CAC1B,MAAM,EAAE,aAAa,UAAU;CAE/B,MAAM,2BAA2B,MAAM,OAAO,EAAE;CAEhD,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,uBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,qBAAqB,CAAC;CAC9C,MAAM,EAAE,4BAA4B,eAAe,CAAC,CAAC;CAErD,MAAM,CAAC,EAAE,iBAAiB,aAAa,MAAM,gBAGnC;EACR,eAAe,8BAA8B,kBAAkB,MAAM,uBAAuB;EAC5F,mBAAmB;CACrB,EAAE;CAEF,MAAM,EAAE,6BAA6B,uCAAuC;EAC1E,iBAAiB;EACjB,uBAAuB;CACzB,CAAC;CAED,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,eAChD,CAAC,iBAAiB,CAAC,uBAAuB,aAAa,CAC/D;CAEA,MAAM,sBAAsB,iCAClB;EACJ,KAAK,SAAS,MAAS;EACvB,sBAAqB,MAAK,CAAC,CAAC;CAC9B,IACA;CAEJ,MAAM,4BAA4B;EAChC,yBAAyB,UAAU,UAAU,aAAa;CAC5D;CAEA,MAAM,gBAAgB,WAAyB;EAC7C,WAAU,UAAS;GACjB,eAAe;GACf,mBAAmB,KAAK;EAC1B,EAAE;CACJ;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,uBACjC,AAAK,SAAS,YAAY;CAE9B,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OACE,oBAAC,WAAD;EACE,WAAW,iBAAiB,yCAAyC;EACrE,cAAc,iBAAiB,4CAA4C;EAC3E,SAAS,iBAAiB,2CAA2C;EACrE,oBAAoB;CACrB;CAIL,IAAI,mBAAmB;EACrB,MAAM,YAAY,uBAAuB,aAAa;EAEtD,MAAM,SAAS;EACf,MAAM,oBAAoB;GACxB,KAAK,SAAS,MAAS;GACvB,SAAS;EACX;EAEA,OACE,oBAAC,oBAAD;GACE,iBAAiB,YAAY,cAAc;GAC3C,mBAAkB,MAAK;IACrB,aAAa,CAAC;IACd,SAAS;GACX;GACe;EAChB;CAEL;CAEA,QAAQ,eAAe,UAAvB;EACE,KAAK,YACH,OAAO,oBAAC,uCAAD,EAAuC,+BAA+B,oBAAsB;EACrG,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,cACH,OACE,oBAAC,0BAAD;GACE,uBAAuB,yBAAyB,YAAY,UAAU,aAAa;GACnF,iBAAiB;GACjB,iCAAiC;GACjC,QAAQ;GACR,wBAAwB;EACzB;EAEL,KAAK,WACH,OAAO,oBAAC,yBAAD,EAAyB,iCAAiC,oBAAsB;EACzF,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,iCAAiC,CACzD"}
|
|
@@ -52,7 +52,7 @@ function UserVerificationFactorTwoComponent() {
|
|
|
52
52
|
onShowAlternativeMethodsClicked: toggleAllStrategies,
|
|
53
53
|
showAlternativeMethods: hasAlternativeStrategies
|
|
54
54
|
});
|
|
55
|
-
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: toggleAllStrategies });
|
|
55
|
+
case "backup_code": return /* @__PURE__ */ jsx(UVFactorTwoBackupCodeCard, { onShowAlternativeMethodsClicked: hasAlternativeStrategies ? toggleAllStrategies : void 0 });
|
|
56
56
|
default: return /* @__PURE__ */ jsx(LoadingCard, {});
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return <UVFactorTwoBackupCodeCard
|
|
1
|
+
{"version":3,"file":"UserVerificationFactorTwo.js","names":[],"sources":["../../../../src/components/UserVerification/UserVerificationFactorTwo.tsx"],"sourcesContent":["import type { SessionVerificationResource, SessionVerificationSecondFactor } from '@clerk/shared/types';\nimport { useEffect, useMemo } from 'react';\n\nimport { withCardStateProvider } from '@/elements/contexts';\nimport { LoadingCard } from '@/elements/LoadingCard';\nimport { useRouter } from '@/router';\n\nimport { useSecondFactorSelection } from '../SignIn/useSecondFactorSelection';\nimport { secondFactorsAreEqual } from './useReverificationAlternativeStrategies';\nimport { UserVerificationFactorTwoTOTP } from './UserVerificationFactorTwoTOTP';\nimport { useUserVerificationSession, withUserVerificationSessionGuard } from './useUserVerificationSession';\nimport { sortByPrimaryFactor } from './utils';\nimport { UVFactorTwoAlternativeMethods } from './UVFactorTwoAlternativeMethods';\nimport { UVFactorTwoBackupCodeCard } from './UVFactorTwoBackupCodeCard';\nimport { UVFactorTwoPhoneCodeCard } from './UVFactorTwoPhoneCodeCard';\n\nconst SUPPORTED_STRATEGIES: SessionVerificationSecondFactor['strategy'][] = [\n 'phone_code',\n 'totp',\n 'backup_code',\n] as const;\n\nexport function UserVerificationFactorTwoComponent(): JSX.Element {\n const { navigate } = useRouter();\n const { data } = useUserVerificationSession();\n const sessionVerification = data as SessionVerificationResource;\n\n const availableFactors = useMemo(() => {\n return (\n sessionVerification.supportedSecondFactors\n ?.filter(factor => SUPPORTED_STRATEGIES.includes(factor.strategy))\n ?.sort(sortByPrimaryFactor) || null\n );\n }, [sessionVerification.supportedSecondFactors]);\n\n const {\n currentFactor,\n factorAlreadyPrepared,\n handleFactorPrepare,\n selectFactor,\n showAllStrategies,\n toggleAllStrategies,\n } = useSecondFactorSelection<SessionVerificationSecondFactor>(availableFactors);\n\n const secondFactorsExcludingCurrent = useMemo(\n () => availableFactors?.filter(factor => !secondFactorsAreEqual(factor, currentFactor)),\n [availableFactors, currentFactor],\n );\n\n const hasAlternativeStrategies = useMemo(\n () => (secondFactorsExcludingCurrent && secondFactorsExcludingCurrent.length > 0) || false,\n [secondFactorsExcludingCurrent],\n );\n\n useEffect(() => {\n if (sessionVerification.status === 'needs_first_factor') {\n void navigate('../');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!currentFactor) {\n return <LoadingCard />;\n }\n\n if (showAllStrategies && hasAlternativeStrategies) {\n return (\n <UVFactorTwoAlternativeMethods\n supportedSecondFactors={secondFactorsExcludingCurrent || null}\n onBackLinkClick={toggleAllStrategies}\n onFactorSelected={selectFactor}\n />\n );\n }\n\n switch (currentFactor?.strategy) {\n case 'phone_code':\n return (\n <UVFactorTwoPhoneCodeCard\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'totp':\n return (\n <UserVerificationFactorTwoTOTP\n factorAlreadyPrepared={factorAlreadyPrepared}\n onFactorPrepare={handleFactorPrepare}\n factor={currentFactor}\n onShowAlternativeMethodsClicked={toggleAllStrategies}\n showAlternativeMethods={hasAlternativeStrategies}\n />\n );\n case 'backup_code':\n return (\n <UVFactorTwoBackupCodeCard\n onShowAlternativeMethodsClicked={hasAlternativeStrategies ? toggleAllStrategies : undefined}\n />\n );\n default:\n return <LoadingCard />;\n }\n}\n\nexport const UserVerificationFactorTwo = withUserVerificationSessionGuard(\n withCardStateProvider(UserVerificationFactorTwoComponent),\n);\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,uBAAsE;CAC1E;CACA;CACA;AACF;AAEA,SAAgB,qCAAkD;CAChE,MAAM,EAAE,aAAa,UAAU;CAC/B,MAAM,EAAE,SAAS,2BAA2B;CAC5C,MAAM,sBAAsB;CAE5B,MAAM,mBAAmB,cAAc;EACrC,OACE,oBAAoB,wBAChB,QAAO,WAAU,qBAAqB,SAAS,OAAO,QAAQ,CAAC,CAAC,EAChE,KAAK,mBAAmB,KAAK;CAErC,GAAG,CAAC,oBAAoB,sBAAsB,CAAC;CAE/C,MAAM,EACJ,eACA,uBACA,qBACA,cACA,mBACA,wBACE,yBAA0D,gBAAgB;CAE9E,MAAM,gCAAgC,cAC9B,kBAAkB,QAAO,WAAU,CAAC,sBAAsB,QAAQ,aAAa,CAAC,GACtF,CAAC,kBAAkB,aAAa,CAClC;CAEA,MAAM,2BAA2B,cACxB,iCAAiC,8BAA8B,SAAS,KAAM,OACrF,CAAC,6BAA6B,CAChC;CAEA,gBAAgB;EACd,IAAI,oBAAoB,WAAW,sBACjC,AAAK,SAAS,KAAK;CAGvB,GAAG,CAAC,CAAC;CAEL,IAAI,CAAC,eACH,OAAO,oBAAC,aAAD,CAAc;CAGvB,IAAI,qBAAqB,0BACvB,OACE,oBAAC,+BAAD;EACE,wBAAwB,iCAAiC;EACzD,iBAAiB;EACjB,kBAAkB;CACnB;CAIL,QAAQ,eAAe,UAAvB;EACE,KAAK,cACH,OACE,oBAAC,0BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,QACH,OACE,oBAAC,+BAAD;GACyB;GACvB,iBAAiB;GACjB,QAAQ;GACR,iCAAiC;GACjC,wBAAwB;EACzB;EAEL,KAAK,eACH,OACE,oBAAC,2BAAD,EACE,iCAAiC,2BAA2B,sBAAsB,OACnF;EAEL,SACE,OAAO,oBAAC,aAAD,CAAc;CACzB;AACF;AAEA,MAAa,4BAA4B,iCACvC,sBAAsB,kCAAkC,CAC1D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { allStrategiesButtonsComparator } from "../../utils/factorSorting.js";
|
|
2
|
-
import { factorHasLocalStrategy
|
|
2
|
+
import { factorHasLocalStrategy } from "../SignIn/utils.js";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { isWebAuthnSupported } from "@clerk/shared/webauthn";
|
|
5
5
|
|
|
@@ -16,12 +16,9 @@ const secondFactorsAreEqual = (a, b) => {
|
|
|
16
16
|
return a.strategy === b.strategy;
|
|
17
17
|
};
|
|
18
18
|
function useReverificationAlternativeStrategies({ filterOutFactor, supportedFirstFactors }) {
|
|
19
|
-
const firstFactors = supportedFirstFactors ? supportedFirstFactors.filter((f) => !isResetPasswordStrategy(f.strategy)) : [];
|
|
20
|
-
const shouldAllowForAlternativeStrategies = firstFactors && firstFactors.length > 0;
|
|
21
19
|
const firstPartyFactors = useMemo(() => supportedFirstFactors ? supportedFirstFactors.filter((f) => !f.strategy.startsWith("oauth_")).filter((factor) => factorHasLocalStrategy(factor)).filter((factor) => !firstFactorsAreEqual(factor, filterOutFactor)).filter((factor) => factor.strategy === "passkey" ? isWebAuthnSupported() : true).sort(allStrategiesButtonsComparator) : [], [supportedFirstFactors, filterOutFactor]);
|
|
22
20
|
return {
|
|
23
|
-
|
|
24
|
-
hasFirstParty: firstPartyFactors && firstPartyFactors.length > 0,
|
|
21
|
+
hasAlternativeStrategies: firstPartyFactors.length > 0,
|
|
25
22
|
firstPartyFactors
|
|
26
23
|
};
|
|
27
24
|
}
|
package/dist/no-rhc/components/UserVerification/useReverificationAlternativeStrategies.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy
|
|
1
|
+
{"version":3,"file":"useReverificationAlternativeStrategies.js","names":[],"sources":["../../../../src/components/UserVerification/useReverificationAlternativeStrategies.ts"],"sourcesContent":["import type { SignInFactor, SignInFirstFactor, SignInSecondFactor } from '@clerk/shared/types';\nimport { isWebAuthnSupported } from '@clerk/shared/webauthn';\nimport { useMemo } from 'react';\n\nimport { allStrategiesButtonsComparator } from '@/ui/utils/factorSorting';\n\nimport { factorHasLocalStrategy } from '../SignIn/utils';\n\nconst firstFactorsAreEqual = (a: SignInFactor | null | undefined, b: SignInFactor | null | undefined) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'email_code' && b.strategy === 'email_code') {\n return a.emailAddressId === b.emailAddressId;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport const secondFactorsAreEqual = (\n a: SignInSecondFactor | null | undefined,\n b: SignInSecondFactor | null | undefined,\n) => {\n if (!a || !b) {\n return false;\n }\n\n if (a.strategy === 'phone_code' && b.strategy === 'phone_code') {\n return a.phoneNumberId === b.phoneNumberId;\n }\n\n return a.strategy === b.strategy;\n};\n\nexport function useReverificationAlternativeStrategies<T = SignInFirstFactor>({\n filterOutFactor,\n supportedFirstFactors,\n}: {\n filterOutFactor: SignInFactor | null | undefined;\n supportedFirstFactors: SignInFirstFactor[] | null | undefined;\n}) {\n const firstPartyFactors = useMemo(\n () =>\n supportedFirstFactors\n ? (supportedFirstFactors\n .filter(f => !f.strategy.startsWith('oauth_'))\n .filter(factor => factorHasLocalStrategy(factor))\n .filter(factor => !firstFactorsAreEqual(factor, filterOutFactor))\n // Only include passkey if the device supports it.\n // @ts-ignore Types are not public yet.\n .filter(factor => (factor.strategy === 'passkey' ? isWebAuthnSupported() : true))\n .sort(allStrategiesButtonsComparator) as T[])\n : [],\n [supportedFirstFactors, filterOutFactor],\n );\n\n return {\n hasAlternativeStrategies: firstPartyFactors.length > 0,\n firstPartyFactors,\n };\n}\n"],"mappings":";;;;;;AAQA,MAAM,wBAAwB,GAAoC,MAAuC;CACvG,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,mBAAmB,EAAE;CAGhC,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,MAAa,yBACX,GACA,MACG;CACH,IAAI,CAAC,KAAK,CAAC,GACT,OAAO;CAGT,IAAI,EAAE,aAAa,gBAAgB,EAAE,aAAa,cAChD,OAAO,EAAE,kBAAkB,EAAE;CAG/B,OAAO,EAAE,aAAa,EAAE;AAC1B;AAEA,SAAgB,uCAA8D,EAC5E,iBACA,yBAIC;CACD,MAAM,oBAAoB,cAEtB,wBACK,sBACE,QAAO,MAAK,CAAC,EAAE,SAAS,WAAW,QAAQ,CAAC,CAAC,CAC7C,QAAO,WAAU,uBAAuB,MAAM,CAAC,CAAC,CAChD,QAAO,WAAU,CAAC,qBAAqB,QAAQ,eAAe,CAAC,CAAC,CAGhE,QAAO,WAAW,OAAO,aAAa,YAAY,oBAAoB,IAAI,IAAK,CAAC,CAChF,KAAK,8BAA8B,IACtC,CAAC,GACP,CAAC,uBAAuB,eAAe,CACzC;CAEA,OAAO;EACL,0BAA0B,kBAAkB,SAAS;EACrD;CACF;AACF"}
|
package/dist/no-rhc/index.js
CHANGED