@stytch/react 20.0.0-next.0 → 20.0.0-next.1
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/CHANGELOG.md +6 -0
- package/dist/cjs/{StytchSSRProxy-CUOvjF03.js → StytchSSRProxy-Bz6LNYdq.js} +186 -1
- package/dist/cjs/StytchSSRProxy-Bz6LNYdq.js.map +1 -0
- package/dist/cjs/adminPortal/index.cjs +102 -26
- package/dist/cjs/adminPortal/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.cjs +176 -138
- package/dist/cjs/b2b/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.headless.cjs +24 -24
- package/dist/cjs/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs/{idpHelpers-eUP8j58U.js → idpHelpers-Bj_7pbfW.js} +7 -191
- package/dist/cjs/idpHelpers-Bj_7pbfW.js.map +1 -0
- package/dist/cjs/{index-DfiRrtK8.js → index-Ni_dyEsz.js} +3 -3
- package/dist/cjs/{index-DfiRrtK8.js.map → index-Ni_dyEsz.js.map} +1 -1
- package/dist/cjs/index.cjs +207 -196
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.headless.cjs +32 -32
- package/dist/cjs/index.headless.cjs.map +1 -1
- package/dist/cjs/{passwordManagerDisableAutofillProps-C0akDAKd.js → passwordManagerDisableAutofillProps-DV31RTL_.js} +2 -2
- package/dist/cjs/{passwordManagerDisableAutofillProps-C0akDAKd.js.map → passwordManagerDisableAutofillProps-DV31RTL_.js.map} +1 -1
- package/dist/cjs/{shadcn-Bbv2Hk3P.js → shadcn-B8TEzQMT.js} +99 -81
- package/dist/cjs/shadcn-B8TEzQMT.js.map +1 -0
- package/dist/cjs-dev/{StytchSSRProxy-D0B5PuT0.js → StytchSSRProxy-CxXsyme4.js} +186 -1
- package/dist/cjs-dev/StytchSSRProxy-CxXsyme4.js.map +1 -0
- package/dist/cjs-dev/adminPortal/index.cjs +102 -26
- package/dist/cjs-dev/adminPortal/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.cjs +176 -138
- package/dist/cjs-dev/b2b/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.headless.cjs +24 -24
- package/dist/cjs-dev/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{idpHelpers-DOOVv6dT.js → idpHelpers-Cf8Qq1B4.js} +7 -191
- package/dist/cjs-dev/idpHelpers-Cf8Qq1B4.js.map +1 -0
- package/dist/cjs-dev/{index-paeFcHjf.js → index-DdK3Jt4u.js} +3 -3
- package/dist/cjs-dev/{index-paeFcHjf.js.map → index-DdK3Jt4u.js.map} +1 -1
- package/dist/cjs-dev/index.cjs +207 -196
- package/dist/cjs-dev/index.cjs.map +1 -1
- package/dist/cjs-dev/index.headless.cjs +32 -32
- package/dist/cjs-dev/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CnLBAXyr.js → passwordManagerDisableAutofillProps-D70WyvIu.js} +2 -2
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CnLBAXyr.js.map → passwordManagerDisableAutofillProps-D70WyvIu.js.map} +1 -1
- package/dist/cjs-dev/{shadcn-CdbmlhdF.js → shadcn-C4w3DtKK.js} +99 -81
- package/dist/cjs-dev/shadcn-C4w3DtKK.js.map +1 -0
- package/dist/esm/_virtual/index.mjs +4 -4
- package/dist/esm/_virtual/index3.mjs +3 -5
- package/dist/esm/_virtual/index3.mjs.map +1 -1
- package/dist/esm/_virtual/index4.mjs +5 -3
- package/dist/esm/_virtual/index4.mjs.map +1 -1
- package/dist/esm/_virtual/index6.mjs +2 -2
- package/dist/esm/_virtual/index7.mjs +2 -2
- package/dist/esm/adminPortal/index.mjs +4 -1
- package/dist/esm/adminPortal/index.mjs.map +1 -1
- package/dist/esm/b2b/index.mjs.map +1 -1
- package/dist/esm/node_modules/lodash.merge/index.mjs +1 -1
- package/dist/esm/node_modules/use-sync-external-store/shim/index.mjs +1 -1
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs +1 -0
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm/packages/web/messages/b2b/en.json.mjs +10 -3
- package/dist/esm/packages/web/messages/b2b/en.json.mjs.map +1 -1
- package/dist/esm/packages/web/messages/en.json.mjs +10 -3
- package/dist/esm/packages/web/messages/en.json.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/AccessSection.mjs +6 -3
- package/dist/esm/packages/web/src/adminPortal/memberManagement/AccessSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/InviteModal.mjs +4 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/InviteModal.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs +3 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs +6 -2
- package/dist/esm/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs +7 -3
- package/dist/esm/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs +5 -1
- package/dist/esm/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRbac.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs +3 -3
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs +2 -2
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoles.mjs +7 -2
- package/dist/esm/packages/web/src/adminPortal/utils/useRoles.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs +27 -3
- package/dist/esm/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs +2 -0
- package/dist/esm/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs +2 -0
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/utils.mjs +8 -1
- package/dist/esm/packages/web/src/ui/b2b/utils.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs +10 -4
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs +2 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs +5 -68
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs +71 -0
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs.map +1 -0
- package/dist/esm/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/CircularProgress.mjs +4 -5
- package/dist/esm/packages/web/src/ui/components/atoms/CircularProgress.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.mjs +14 -23
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.module.css.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/EmailInput.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/EmailInput.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/ErrorText.mjs +12 -4
- package/dist/esm/packages/web/src/ui/components/molecules/ErrorText.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/Input.mjs +3 -2
- package/dist/esm/packages/web/src/ui/components/molecules/Input.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.mjs +6 -6
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/PhoneInput.mjs +3 -4
- package/dist/esm/packages/web/src/ui/components/molecules/PhoneInput.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs +26 -3
- package/dist/esm/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/OneTapError.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/ResendOTPButton.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/organisms/ResendOTPButton.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs +0 -42
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs +0 -40
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs +0 -43
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs +0 -36
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/b2b/Stytch.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/esm-dev/_virtual/index.mjs +4 -4
- package/dist/esm-dev/_virtual/index3.mjs +3 -5
- package/dist/esm-dev/_virtual/index3.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index4.mjs +5 -3
- package/dist/esm-dev/_virtual/index4.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index6.mjs +2 -2
- package/dist/esm-dev/_virtual/index7.mjs +2 -2
- package/dist/esm-dev/adminPortal/index.mjs +4 -1
- package/dist/esm-dev/adminPortal/index.mjs.map +1 -1
- package/dist/esm-dev/b2b/index.mjs.map +1 -1
- package/dist/esm-dev/node_modules/lodash.merge/index.mjs +1 -1
- package/dist/esm-dev/node_modules/use-sync-external-store/shim/index.mjs +1 -1
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs +1 -0
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/messages/b2b/en.json.mjs +10 -3
- package/dist/esm-dev/packages/web/messages/b2b/en.json.mjs.map +1 -1
- package/dist/esm-dev/packages/web/messages/en.json.mjs +10 -3
- package/dist/esm-dev/packages/web/messages/en.json.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AccessSection.mjs +6 -3
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AccessSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/InviteModal.mjs +4 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/InviteModal.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs +3 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs +6 -2
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs +7 -3
- package/dist/esm-dev/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs +5 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRbac.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs +3 -3
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs +2 -2
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoles.mjs +7 -2
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoles.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs +27 -3
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs +2 -0
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs +2 -0
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/utils.mjs +8 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/utils.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs +10 -4
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs +5 -68
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs +71 -0
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs.map +1 -0
- package/dist/esm-dev/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CircularProgress.mjs +4 -5
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CircularProgress.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.mjs +14 -23
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.module.css.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/EmailInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/EmailInput.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/ErrorText.mjs +12 -4
- package/dist/esm-dev/packages/web/src/ui/components/molecules/ErrorText.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs +3 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs +6 -6
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PhoneInput.mjs +3 -4
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PhoneInput.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs +26 -3
- package/dist/esm-dev/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/ResendOTPButton.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/organisms/ResendOTPButton.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs +0 -42
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs +0 -40
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs +0 -43
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs +0 -36
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/b2b/Stytch.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/types/{StytchB2BClient-Dq-ITB7Q.d.ts → StytchB2BClient-C_7NUKZh.d.ts} +1 -1
- package/dist/types/{StytchClient-BV0sT3Ox.d.ts → StytchClient-Ccvk8Nj1.d.ts} +1 -2
- package/dist/types/adminPortal/index.d.ts +5 -4
- package/dist/types/b2b/index.d.ts +11 -11
- package/dist/types/b2b/index.headless.d.ts +4 -4
- package/dist/types/{createAuthUrlHandler-Ck5TyB9J.d.ts → createAuthUrlHandler-BJRA2PHG.d.ts} +939 -39
- package/dist/types/idpHelpers-aCVwNrDk.d.ts +36 -0
- package/dist/types/index.d.ts +8 -8
- package/dist/types/index.headless.d.ts +4 -4
- package/dist/types/{shadcn-CFz8Asq0.d.ts → shadcn-0e4fkV5Z.d.ts} +6 -6
- package/messages/b2b/en.po +6 -3
- package/messages/en.po +6 -3
- package/package.json +1 -1
- package/dist/cjs/StytchSSRProxy-CUOvjF03.js.map +0 -1
- package/dist/cjs/idpHelpers-eUP8j58U.js.map +0 -1
- package/dist/cjs/shadcn-Bbv2Hk3P.js.map +0 -1
- package/dist/cjs-dev/StytchSSRProxy-D0B5PuT0.js.map +0 -1
- package/dist/cjs-dev/idpHelpers-DOOVv6dT.js.map +0 -1
- package/dist/cjs-dev/shadcn-CdbmlhdF.js.map +0 -1
- package/dist/esm/packages/web/src/adminPortal/MuiClassNameSetup.mjs +0 -5
- package/dist/esm/packages/web/src/adminPortal/MuiClassNameSetup.mjs.map +0 -1
- package/dist/esm/packages/web/src/adminPortal/classNameSeed.mjs +0 -5
- package/dist/esm/packages/web/src/adminPortal/classNameSeed.mjs.map +0 -1
- package/dist/esm-dev/packages/web/src/adminPortal/MuiClassNameSetup.mjs +0 -5
- package/dist/esm-dev/packages/web/src/adminPortal/MuiClassNameSetup.mjs.map +0 -1
- package/dist/esm-dev/packages/web/src/adminPortal/classNameSeed.mjs +0 -5
- package/dist/esm-dev/packages/web/src/adminPortal/classNameSeed.mjs.map +0 -1
- package/dist/types/idpHelpers-hBhPCtAC.d.ts +0 -936
|
@@ -3,11 +3,19 @@ import { useGlobalReducer } from '../GlobalContextProvider.mjs';
|
|
|
3
3
|
import { AppScreens } from '../types/AppScreens.mjs';
|
|
4
4
|
import { EmailConfirmationView } from '../../components/organisms/EmailConfirmationView.mjs';
|
|
5
5
|
import { useEmailDomain } from './useEmailDomain.mjs';
|
|
6
|
+
import { useCountdown } from '../../components/atoms/Countdown.mjs';
|
|
7
|
+
import { useEmlLoginOrSignup } from '../hooks/useEmlLoginOrSignup.mjs';
|
|
8
|
+
import { useEmlDiscoverySend } from '../hooks/useEmlDiscoverySend.mjs';
|
|
9
|
+
import { AuthFlowType } from '../../../../../core/src/public/b2b/ui.mjs';
|
|
6
10
|
|
|
7
11
|
const EmailConfirmation = ()=>{
|
|
8
12
|
const [state, dispatch] = useGlobalReducer();
|
|
9
13
|
const emailDomain = useEmailDomain();
|
|
10
|
-
const
|
|
14
|
+
const countdown = useCountdown();
|
|
15
|
+
const { trigger: sendLoginOrSignupEml, isMutating: isSendingLoginOrSignupEml } = useEmlLoginOrSignup();
|
|
16
|
+
const { trigger: sendDiscoveryEml, isMutating: isSendingDiscoveryEml } = useEmlDiscoverySend();
|
|
17
|
+
const email = state.formState.emailState.userSuppliedEmail;
|
|
18
|
+
const goBack = ()=>{
|
|
11
19
|
dispatch({
|
|
12
20
|
type: 'set_user_supplied_email',
|
|
13
21
|
email: ''
|
|
@@ -17,10 +25,26 @@ const EmailConfirmation = ()=>{
|
|
|
17
25
|
screen: AppScreens.Main
|
|
18
26
|
});
|
|
19
27
|
};
|
|
28
|
+
const resend = async ()=>{
|
|
29
|
+
if (state.flowState.type === AuthFlowType.Discovery) {
|
|
30
|
+
await sendDiscoveryEml({
|
|
31
|
+
email
|
|
32
|
+
});
|
|
33
|
+
} else if (state.flowState.type === AuthFlowType.Organization && state.flowState.organization) {
|
|
34
|
+
await sendLoginOrSignupEml({
|
|
35
|
+
email,
|
|
36
|
+
organization_id: state.flowState.organization.organization_id
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const isSubmitting = isSendingLoginOrSignupEml || isSendingDiscoveryEml;
|
|
20
41
|
return /*#__PURE__*/ React__default.createElement(EmailConfirmationView, {
|
|
21
42
|
emailDomain: emailDomain,
|
|
22
|
-
|
|
23
|
-
|
|
43
|
+
email: email,
|
|
44
|
+
goBack: goBack,
|
|
45
|
+
resend: resend,
|
|
46
|
+
countdown: countdown,
|
|
47
|
+
isSubmitting: isSubmitting
|
|
24
48
|
});
|
|
25
49
|
};
|
|
26
50
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailConfirmation.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/EmailConfirmation.tsx"],"sourcesContent":["import React from 'react';\nimport { useGlobalReducer } from '../GlobalContextProvider';\nimport { AppScreens } from '../types/AppScreens';\nimport { EmailConfirmationView } from '../../components/organisms/EmailConfirmationView';\nimport { useEmailDomain } from './useEmailDomain';\n\nexport const EmailConfirmation = () => {\n const [state, dispatch] = useGlobalReducer();\n const emailDomain = useEmailDomain();\n\n const
|
|
1
|
+
{"version":3,"file":"EmailConfirmation.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/EmailConfirmation.tsx"],"sourcesContent":["import React from 'react';\nimport { AuthFlowType } from '@stytch/core/public';\nimport { useGlobalReducer } from '../GlobalContextProvider';\nimport { AppScreens } from '../types/AppScreens';\nimport { EmailConfirmationView } from '../../components/organisms/EmailConfirmationView';\nimport { useEmailDomain } from './useEmailDomain';\nimport { useCountdown } from '../../components/atoms/Countdown';\nimport { useEmlLoginOrSignup } from '../hooks/useEmlLoginOrSignup';\nimport { useEmlDiscoverySend } from '../hooks/useEmlDiscoverySend';\n\nexport const EmailConfirmation = () => {\n const [state, dispatch] = useGlobalReducer();\n const emailDomain = useEmailDomain();\n const countdown = useCountdown();\n\n const { trigger: sendLoginOrSignupEml, isMutating: isSendingLoginOrSignupEml } = useEmlLoginOrSignup();\n const { trigger: sendDiscoveryEml, isMutating: isSendingDiscoveryEml } = useEmlDiscoverySend();\n\n const email = state.formState.emailState.userSuppliedEmail;\n\n const goBack = () => {\n dispatch({ type: 'set_user_supplied_email', email: '' });\n dispatch({ type: 'transition', screen: AppScreens.Main });\n };\n\n const resend = async () => {\n if (state.flowState.type === AuthFlowType.Discovery) {\n await sendDiscoveryEml({ email });\n } else if (state.flowState.type === AuthFlowType.Organization && state.flowState.organization) {\n await sendLoginOrSignupEml({\n email,\n organization_id: state.flowState.organization.organization_id,\n });\n }\n };\n\n const isSubmitting = isSendingLoginOrSignupEml || isSendingDiscoveryEml;\n\n return (\n <EmailConfirmationView\n emailDomain={emailDomain}\n email={email}\n goBack={goBack}\n resend={resend}\n countdown={countdown}\n isSubmitting={isSubmitting}\n />\n );\n};\n"],"names":["EmailConfirmation","state","dispatch","useGlobalReducer","emailDomain","useEmailDomain","countdown","useCountdown","trigger","sendLoginOrSignupEml","isMutating","isSendingLoginOrSignupEml","useEmlLoginOrSignup","sendDiscoveryEml","isSendingDiscoveryEml","useEmlDiscoverySend","email","formState","emailState","userSuppliedEmail","goBack","type","screen","AppScreens","Main","resend","flowState","AuthFlowType","Discovery","Organization","organization","organization_id","isSubmitting","React","EmailConfirmationView"],"mappings":";;;;;;;;;;MAUaA,iBAAAA,GAAoB,IAAA;IAC/B,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,gBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,cAAAA,EAAAA;AACpB,IAAA,MAAMC,SAAAA,GAAYC,YAAAA,EAAAA;AAElB,IAAA,MAAM,EAAEC,OAAAA,EAASC,oBAAoB,EAAEC,UAAAA,EAAYC,yBAAyB,EAAE,GAAGC,mBAAAA,EAAAA;AACjF,IAAA,MAAM,EAAEJ,OAAAA,EAASK,gBAAgB,EAAEH,UAAAA,EAAYI,qBAAqB,EAAE,GAAGC,mBAAAA,EAAAA;AAEzE,IAAA,MAAMC,QAAQf,KAAAA,CAAMgB,SAAS,CAACC,UAAU,CAACC,iBAAiB;AAE1D,IAAA,MAAMC,MAAAA,GAAS,IAAA;QACblB,QAAAA,CAAS;YAAEmB,IAAAA,EAAM,yBAAA;YAA2BL,KAAAA,EAAO;AAAG,SAAA,CAAA;QACtDd,QAAAA,CAAS;YAAEmB,IAAAA,EAAM,YAAA;AAAcC,YAAAA,MAAAA,EAAQC,WAAWC;AAAK,SAAA,CAAA;AACzD,IAAA,CAAA;AAEA,IAAA,MAAMC,MAAAA,GAAS,UAAA;AACb,QAAA,IAAIxB,MAAMyB,SAAS,CAACL,IAAI,KAAKM,YAAAA,CAAaC,SAAS,EAAE;AACnD,YAAA,MAAMf,gBAAAA,CAAiB;AAAEG,gBAAAA;AAAM,aAAA,CAAA;AACjC,QAAA,CAAA,MAAO,IAAIf,KAAAA,CAAMyB,SAAS,CAACL,IAAI,KAAKM,YAAAA,CAAaE,YAAY,IAAI5B,KAAAA,CAAMyB,SAAS,CAACI,YAAY,EAAE;AAC7F,YAAA,MAAMrB,oBAAAA,CAAqB;AACzBO,gBAAAA,KAAAA;AACAe,gBAAAA,eAAAA,EAAiB9B,KAAAA,CAAMyB,SAAS,CAACI,YAAY,CAACC;AAChD,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMC,eAAerB,yBAAAA,IAA6BG,qBAAAA;AAElD,IAAA,qBACEmB,cAAA,CAAA,aAAA,CAACC,qBAAAA,EAAAA;QACC9B,WAAAA,EAAaA,WAAAA;QACbY,KAAAA,EAAOA,KAAAA;QACPI,MAAAA,EAAQA,MAAAA;QACRK,MAAAA,EAAQA,MAAAA;QACRnB,SAAAA,EAAWA,SAAAA;QACX0B,YAAAA,EAAcA;;AAGpB;;;;"}
|
|
@@ -22,6 +22,7 @@ const RecoveryCodeEntryScreen = ()=>{
|
|
|
22
22
|
organization_id: organizationId,
|
|
23
23
|
session_duration_minutes: sessionDurationMinutes
|
|
24
24
|
}), {
|
|
25
|
+
throwOnError: false,
|
|
25
26
|
onSuccess: ()=>{
|
|
26
27
|
dispatch({
|
|
27
28
|
type: 'recovery_code/authenticate_success'
|
|
@@ -74,6 +75,7 @@ const RecoveryCodeEntryScreen = ()=>{
|
|
|
74
75
|
hideLabel: true,
|
|
75
76
|
required: true,
|
|
76
77
|
autoComplete: "off",
|
|
78
|
+
spellCheck: false,
|
|
77
79
|
error: errorMessage
|
|
78
80
|
}), /*#__PURE__*/ React__default.createElement(ButtonColumn, null, /*#__PURE__*/ React__default.createElement(Button, {
|
|
79
81
|
variant: "primary",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecoveryCodeEntryScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/RecoveryCodeEntryScreen.tsx"],"sourcesContent":["import React, { FormEvent, useState } from 'react';\nimport { RecoveryCodeRecoverResponse, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { useLingui } from '@lingui/react/macro';\nimport Button from '../../components/atoms/Button';\nimport Column from '../../components/atoms/Column';\nimport Typography from '../../components/atoms/Typography';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport Input from '../../components/molecules/Input';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport styles from './RecoveryCodeEntryScreen.module.css';\n\nexport const RecoveryCodeEntryScreen = () => {\n const stytchClient = useStytch();\n const {\n sessionOptions: { sessionDurationMinutes },\n } = useConfig();\n const { t } = useLingui();\n\n const [state, dispatch] = useGlobalReducer();\n\n // This screen should only be shown if primary info is available\n const { memberId, organizationId } = state.mfa.primaryInfo!;\n\n const {\n trigger: authenticate,\n isMutating: isSubmitting,\n error,\n } = useMutate<\n RecoveryCodeRecoverResponse<StytchProjectConfigurationInput>,\n unknown,\n StytchMutationKey,\n { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number }\n >(\n 'stytch.recoveryCodes.recover',\n (\n _: string,\n {\n arg: { recoveryCode, memberId, organizationId, sessionDurationMinutes },\n }: { arg: { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number } },\n ) =>\n stytchClient.recoveryCodes.recover({\n recovery_code: recoveryCode,\n member_id: memberId,\n organization_id: organizationId,\n session_duration_minutes: sessionDurationMinutes,\n }),\n {\n onSuccess: () => {\n dispatch({ type: 'recovery_code/authenticate_success' });\n },\n },\n );\n\n const [recoveryCode, setRecoveryCode] = useState('');\n const errorMessage = error\n ? t({ id: 'recoveryCodes.entry.error.invalidCode', message: 'Invalid backup code, please try again.' })\n : undefined;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n authenticate({ recoveryCode, memberId, organizationId, sessionDurationMinutes });\n };\n\n return (\n <Column as=\"form\" gap={6} onSubmit={handleSubmit}>\n <Typography variant=\"header\">{t({ id: 'recoveryCodes.entry.title', message: 'Enter backup code' })}</Typography>\n <Typography variant=\"body\">\n {t({\n id: 'recoveryCodes.entry.content',\n message: 'Enter one of the backup codes you saved when setting up your authenticator app.',\n })}\n </Typography>\n\n <Input\n id=\"recovery-code\"\n className={styles.input}\n value={recoveryCode}\n onChange={(e) => {\n setRecoveryCode(e.target.value);\n }}\n placeholder={t({ id: 'formField.backupCode.placeholder', message: 'Enter backup code' })}\n label={t({ id: 'formField.backupCode.ariaLabel', message: 'Backup code' })}\n hideLabel\n required\n autoComplete=\"off\"\n error={errorMessage}\n />\n\n <ButtonColumn>\n <Button variant=\"primary\" loading={isSubmitting} type=\"submit\" disabled={!recoveryCode || isSubmitting}>\n {t({ id: 'button.continue', message: 'Continue' })}\n </Button>\n <Button variant=\"ghost\" onClick={() => dispatch({ type: 'navigate_back' })}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n </ButtonColumn>\n </Column>\n );\n};\n"],"names":["RecoveryCodeEntryScreen","stytchClient","useStytch","sessionOptions","sessionDurationMinutes","useConfig","useLingui","state","dispatch","useGlobalReducer","memberId","organizationId","mfa","primaryInfo","trigger","authenticate","isMutating","isSubmitting","error","useMutate","_","arg","recoveryCode","recoveryCodes","recover","recovery_code","member_id","organization_id","session_duration_minutes","onSuccess","type","setRecoveryCode","useState","errorMessage","undefined","handleSubmit","e","preventDefault","React","Column","as","gap","onSubmit","Typography","variant","Input","id","className","styles","input","value","onChange","target","placeholder","label","hideLabel","required","autoComplete","ButtonColumn","Button","loading","disabled","onClick"],"mappings":";;;;;;;;;;;MAYaA,uBAAAA,GAA0B,IAAA;AACrC,IAAA,MAAMC,YAAAA,GAAeC,SAAAA,EAAAA;AACrB,IAAA,MAAM,EACJC,cAAAA,EAAgB,EAAEC,sBAAsB,EAAE,EAC3C,GAAGC,SAAAA,EAAAA;AACJ,IAAA,MAAM,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,GAAA,EAAA,GAAQC,SAAAA,EAAAA;IAEd,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,gBAAAA,EAAAA;;IAG1B,MAAM,EAAEC,QAAQ,EAAEC,cAAc,EAAE,GAAGJ,KAAAA,CAAMK,GAAG,CAACC,WAAW;AAE1D,IAAA,MAAM,EACJC,OAAAA,EAASC,YAAY,EACrBC,UAAAA,EAAYC,YAAY,EACxBC,KAAK,EACN,GAAGC,SAAAA,CAMF,8BAAA,EACA,CACEC,CAAAA,EACA,EACEC,GAAAA,EAAK,EAAEC,YAAY,EAAEZ,QAAQ,EAAEC,cAAc,EAAEP,sBAAsB,EAAE,EACqC,GAE9GH,YAAAA,CAAasB,aAAa,CAACC,OAAO,CAAC;YACjCC,aAAAA,EAAeH,YAAAA;YACfI,SAAAA,EAAWhB,QAAAA;YACXiB,eAAAA,EAAiBhB,cAAAA;YACjBiB,wBAAAA,EAA0BxB;SAC5B,CAAA,EACF;QACEyB,SAAAA,EAAW,IAAA;
|
|
1
|
+
{"version":3,"file":"RecoveryCodeEntryScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/RecoveryCodeEntryScreen.tsx"],"sourcesContent":["import React, { FormEvent, useState } from 'react';\nimport { RecoveryCodeRecoverResponse, StytchProjectConfigurationInput } from '@stytch/core/public';\nimport { useLingui } from '@lingui/react/macro';\nimport Button from '../../components/atoms/Button';\nimport Column from '../../components/atoms/Column';\nimport Typography from '../../components/atoms/Typography';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport Input from '../../components/molecules/Input';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport styles from './RecoveryCodeEntryScreen.module.css';\n\nexport const RecoveryCodeEntryScreen = () => {\n const stytchClient = useStytch();\n const {\n sessionOptions: { sessionDurationMinutes },\n } = useConfig();\n const { t } = useLingui();\n\n const [state, dispatch] = useGlobalReducer();\n\n // This screen should only be shown if primary info is available\n const { memberId, organizationId } = state.mfa.primaryInfo!;\n\n const {\n trigger: authenticate,\n isMutating: isSubmitting,\n error,\n } = useMutate<\n RecoveryCodeRecoverResponse<StytchProjectConfigurationInput>,\n unknown,\n StytchMutationKey,\n { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number }\n >(\n 'stytch.recoveryCodes.recover',\n (\n _: string,\n {\n arg: { recoveryCode, memberId, organizationId, sessionDurationMinutes },\n }: { arg: { recoveryCode: string; memberId: string; organizationId: string; sessionDurationMinutes: number } },\n ) =>\n stytchClient.recoveryCodes.recover({\n recovery_code: recoveryCode,\n member_id: memberId,\n organization_id: organizationId,\n session_duration_minutes: sessionDurationMinutes,\n }),\n {\n throwOnError: false,\n onSuccess: () => {\n dispatch({ type: 'recovery_code/authenticate_success' });\n },\n },\n );\n\n const [recoveryCode, setRecoveryCode] = useState('');\n const errorMessage = error\n ? t({ id: 'recoveryCodes.entry.error.invalidCode', message: 'Invalid backup code, please try again.' })\n : undefined;\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n authenticate({ recoveryCode, memberId, organizationId, sessionDurationMinutes });\n };\n\n return (\n <Column as=\"form\" gap={6} onSubmit={handleSubmit}>\n <Typography variant=\"header\">{t({ id: 'recoveryCodes.entry.title', message: 'Enter backup code' })}</Typography>\n <Typography variant=\"body\">\n {t({\n id: 'recoveryCodes.entry.content',\n message: 'Enter one of the backup codes you saved when setting up your authenticator app.',\n })}\n </Typography>\n\n <Input\n id=\"recovery-code\"\n className={styles.input}\n value={recoveryCode}\n onChange={(e) => {\n setRecoveryCode(e.target.value);\n }}\n placeholder={t({ id: 'formField.backupCode.placeholder', message: 'Enter backup code' })}\n label={t({ id: 'formField.backupCode.ariaLabel', message: 'Backup code' })}\n hideLabel\n required\n autoComplete=\"off\"\n spellCheck={false}\n error={errorMessage}\n />\n\n <ButtonColumn>\n <Button variant=\"primary\" loading={isSubmitting} type=\"submit\" disabled={!recoveryCode || isSubmitting}>\n {t({ id: 'button.continue', message: 'Continue' })}\n </Button>\n <Button variant=\"ghost\" onClick={() => dispatch({ type: 'navigate_back' })}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n </ButtonColumn>\n </Column>\n );\n};\n"],"names":["RecoveryCodeEntryScreen","stytchClient","useStytch","sessionOptions","sessionDurationMinutes","useConfig","useLingui","state","dispatch","useGlobalReducer","memberId","organizationId","mfa","primaryInfo","trigger","authenticate","isMutating","isSubmitting","error","useMutate","_","arg","recoveryCode","recoveryCodes","recover","recovery_code","member_id","organization_id","session_duration_minutes","throwOnError","onSuccess","type","setRecoveryCode","useState","errorMessage","undefined","handleSubmit","e","preventDefault","React","Column","as","gap","onSubmit","Typography","variant","Input","id","className","styles","input","value","onChange","target","placeholder","label","hideLabel","required","autoComplete","spellCheck","ButtonColumn","Button","loading","disabled","onClick"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SMSOTPEntryScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/SMSOTPEntryScreen.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from 'react';\nimport {\n B2BMFAProducts,\n B2BSMSAuthenticateResponse,\n B2BSMSSendResponse,\n StytchAPIError,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport Button from '../../components/atoms/Button';\nimport { readB2BInternals } from '../../../utils/internal';\nimport Column from '../../components/atoms/Column';\nimport { LoadingScreen } from '../../components/molecules/Loading';\nimport { SentOTPEntry } from '../../components/organisms/SentOTPEntry';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport { formatNumber } from '../../../utils/handleParsePhoneNumber';\nimport { useLingui } from '@lingui/react/macro';\nimport { getTranslatedError } from '../../../utils/getTranslatedError';\nimport { AppScreens } from '../types/AppScreens';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport { errorToast } from '../../components/atoms/Toast';\nimport { useCountdown } from '../../components/atoms/Countdown';\nimport { ResendOTPButton } from '../../components/organisms/ResendOTPButton';\n\nexport const SMSOTPEntryScreen = () => {\n const stytchClient = useStytch();\n const {\n sessionOptions: { sessionDurationMinutes },\n smsOtpOptions,\n } = useConfig();\n const { t } = useLingui();\n\n const [state, dispatch] = useGlobalReducer();\n const {\n mfa: { isEnrolling, smsOtp, primaryInfo },\n } = state;\n\n const { codeExpiration, formattedDestination } = smsOtp;\n\n // This screen should only be shown if primary info is available\n const { enrolledMfaMethods, memberId, memberPhoneNumber, organizationId, organizationMfaOptionsSupported } =\n primaryInfo!;\n\n const resendCountdown = useCountdown();\n\n const {\n trigger: sendSms,\n isMutating: isSending,\n error: sendError,\n } = useMutate<\n B2BSMSSendResponse,\n unknown,\n StytchMutationKey,\n { memberId: string; organizationId: string; locale?: string }\n >(\n 'stytch.otps.sms.send',\n (\n _: string,\n {\n arg: { memberId, organizationId, locale },\n }: { arg: { memberId: string; organizationId: string; locale?: string } },\n ) => {\n dispatch({ type: 'sms_otp/send' });\n return stytchClient.otps.sms.send({ member_id: memberId, organization_id: organizationId, locale });\n },\n {\n onSuccess: (response) => {\n dispatch({ type: 'sms_otp/send_success', response });\n },\n onError: (error) => {\n const message = getTranslatedError(error as StytchAPIError, t);\n if (message) {\n errorToast({ message });\n }\n dispatch({ type: 'sms_otp/send_error', error: message });\n },\n // Throw on error to ensure promise is rejected\n throwOnError: true,\n },\n );\n\n const {\n trigger: authenticate,\n isMutating: isAuthenticating,\n error: authenticateError,\n } = useMutate<\n B2BSMSAuthenticateResponse<StytchProjectConfigurationInput>,\n unknown,\n StytchMutationKey,\n { otp: string; memberId: string; organizationId: string; sessionDurationMinutes: number }\n >(\n 'stytch.otps.sms.authenticate',\n (\n _: string,\n {\n arg: { otp, memberId, organizationId, sessionDurationMinutes },\n }: { arg: { otp: string; memberId: string; organizationId: string; sessionDurationMinutes: number } },\n ) =>\n stytchClient.otps.sms.authenticate({\n code: otp,\n member_id: memberId,\n organization_id: organizationId,\n session_duration_minutes: sessionDurationMinutes,\n }),\n {\n onSuccess: () => {\n dispatch({ type: 'sms_otp/authenticate_success' });\n },\n onError: () => {\n resendCountdown.clear();\n },\n },\n );\n\n const shouldCreate = codeExpiration === null && !isSending && !sendError;\n useEffect(() => {\n if (shouldCreate) {\n sendSms({ memberId, organizationId, locale: smsOtpOptions?.locale });\n }\n }, [memberId, organizationId, sendSms, shouldCreate, smsOtpOptions?.locale]);\n\n useEffect(() => {\n if (!formattedDestination && memberPhoneNumber) {\n const handleFormatNumber = async () => {\n const parsePhoneNumber = (phoneNumber: string) =>\n readB2BInternals(stytchClient).clientsideServices.parsedPhoneNumber({\n phoneNumber,\n });\n\n const national = await formatNumber({\n parsePhoneNumber,\n phoneNumber: memberPhoneNumber,\n });\n\n dispatch({\n type: 'sms_otp/format_destination',\n formattedPhoneNumber: national,\n });\n };\n\n handleFormatNumber();\n }\n }, [dispatch, formattedDestination, stytchClient, memberPhoneNumber]);\n\n const isTotpAvailable = useMemo(\n () =>\n !isEnrolling &&\n enrolledMfaMethods.includes(B2BMFAProducts.totp) &&\n (organizationMfaOptionsSupported.length === 0 || organizationMfaOptionsSupported.includes(B2BMFAProducts.totp)),\n [enrolledMfaMethods, isEnrolling, organizationMfaOptionsSupported],\n );\n const errorMessage = authenticateError\n ? t({ id: 'error.passcodeInvalid', message: 'Invalid passcode, please try again.' })\n : undefined;\n\n // The user can go back to change their phone number if either:\n // - we are in an enrollment flow\n // - they are not enrolled in any MFA methods at all\n // - they are not enrolled in any of the limited MFA methods supported by the organization\n const canGoBack = useMemo(\n () =>\n isEnrolling ||\n enrolledMfaMethods.length === 0 ||\n (organizationMfaOptionsSupported.length > 0 &&\n !enrolledMfaMethods.some((enrolledMethod) => organizationMfaOptionsSupported.includes(enrolledMethod))),\n [enrolledMfaMethods, isEnrolling, organizationMfaOptionsSupported],\n );\n\n const handleSubmit = (otp: string) => {\n authenticate({ otp, memberId, organizationId, sessionDurationMinutes });\n };\n\n const handleSwitchToTotp = () => {\n dispatch({ type: 'transition', history: 'push', screen: AppScreens.TOTPEntry });\n };\n\n const handleResendOTP = async () => {\n await sendSms({ memberId, organizationId, locale: smsOtpOptions?.locale });\n };\n\n const handleBack = () => {\n dispatch({ type: 'navigate_back' });\n };\n\n const resendButton = (\n <ResendOTPButton countdown={resendCountdown} isSubmitting={isAuthenticating} resendOTP={handleResendOTP} />\n );\n const switchToTotpButton = isTotpAvailable && (\n <Button variant=\"ghost\" onClick={handleSwitchToTotp}>\n {t({ id: 'mfa.methods.authenticatorApp', message: 'Use an authenticator app' })}\n </Button>\n );\n const backButton = canGoBack && (\n <Button variant=\"ghost\" onClick={handleBack}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n );\n\n return (\n <Column gap={6}>\n {codeExpiration !== null ? (\n <SentOTPEntry\n isSubmitting={isAuthenticating}\n onSubmit={handleSubmit}\n errorMessage={errorMessage}\n expiration={codeExpiration.getTime()}\n formattedDestination={formattedDestination ?? memberPhoneNumber ?? ''}\n />\n ) : (\n <LoadingScreen />\n )}\n\n {switchToTotpButton && backButton ? (\n <ButtonColumn\n top={resendButton}\n bottom={\n <>\n {switchToTotpButton}\n {backButton}\n </>\n }\n />\n ) : (\n <ButtonColumn>\n {resendButton}\n {switchToTotpButton}\n {backButton}\n </ButtonColumn>\n )}\n </Column>\n );\n};\n"],"names":["SMSOTPEntryScreen","stytchClient","useStytch","sessionOptions","sessionDurationMinutes","smsOtpOptions","useConfig","useLingui","state","dispatch","useGlobalReducer","mfa","isEnrolling","smsOtp","primaryInfo","codeExpiration","formattedDestination","enrolledMfaMethods","memberId","memberPhoneNumber","organizationId","organizationMfaOptionsSupported","resendCountdown","useCountdown","trigger","sendSms","isMutating","isSending","error","sendError","useMutate","_","arg","locale","type","otps","sms","send","member_id","organization_id","onSuccess","response","onError","message","getTranslatedError","errorToast","throwOnError","authenticate","isAuthenticating","authenticateError","otp","code","session_duration_minutes","clear","shouldCreate","useEffect","handleFormatNumber","parsePhoneNumber","phoneNumber","readB2BInternals","clientsideServices","parsedPhoneNumber","national","formatNumber","formattedPhoneNumber","isTotpAvailable","useMemo","includes","B2BMFAProducts","totp","length","errorMessage","undefined","canGoBack","some","enrolledMethod","handleSubmit","handleSwitchToTotp","history","screen","AppScreens","TOTPEntry","handleResendOTP","handleBack","resendButton","React","ResendOTPButton","countdown","isSubmitting","resendOTP","switchToTotpButton","Button","variant","onClick","backButton","Column","gap","SentOTPEntry","onSubmit","expiration","getTime","LoadingScreen","ButtonColumn","top","bottom"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SMSOTPEntryScreen.mjs","sources":["../../../../../../../../../web/src/ui/b2b/screens/SMSOTPEntryScreen.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from 'react';\nimport {\n B2BMFAProducts,\n B2BSMSAuthenticateResponse,\n B2BSMSSendResponse,\n StytchAPIError,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport Button from '../../components/atoms/Button';\nimport { readB2BInternals } from '../../../utils/internal';\nimport Column from '../../components/atoms/Column';\nimport { LoadingScreen } from '../../components/molecules/Loading';\nimport { SentOTPEntry } from '../../components/organisms/SentOTPEntry';\nimport { useConfig, useGlobalReducer, useStytch } from '../GlobalContextProvider';\nimport { StytchMutationKey, useMutate } from '../utils';\nimport { formatNumber } from '../../../utils/handleParsePhoneNumber';\nimport { useLingui } from '@lingui/react/macro';\nimport { getTranslatedError } from '../../../utils/getTranslatedError';\nimport { AppScreens } from '../types/AppScreens';\nimport ButtonColumn from '../../components/molecules/ButtonColumn';\nimport { errorToast } from '../../components/atoms/Toast';\nimport { useCountdown } from '../../components/atoms/Countdown';\nimport { ResendOTPButton } from '../../components/organisms/ResendOTPButton';\n\nexport const SMSOTPEntryScreen = () => {\n const stytchClient = useStytch();\n const {\n sessionOptions: { sessionDurationMinutes },\n smsOtpOptions,\n } = useConfig();\n const { t } = useLingui();\n\n const [state, dispatch] = useGlobalReducer();\n const {\n mfa: { isEnrolling, smsOtp, primaryInfo },\n } = state;\n\n const { codeExpiration, formattedDestination } = smsOtp;\n\n // This screen should only be shown if primary info is available\n const { enrolledMfaMethods, memberId, memberPhoneNumber, organizationId, organizationMfaOptionsSupported } =\n primaryInfo!;\n\n const resendCountdown = useCountdown();\n\n const {\n trigger: sendSms,\n isMutating: isSending,\n error: sendError,\n } = useMutate<\n B2BSMSSendResponse,\n unknown,\n StytchMutationKey,\n { memberId: string; organizationId: string; locale?: string }\n >(\n 'stytch.otps.sms.send',\n (\n _: string,\n {\n arg: { memberId, organizationId, locale },\n }: { arg: { memberId: string; organizationId: string; locale?: string } },\n ) => {\n dispatch({ type: 'sms_otp/send' });\n return stytchClient.otps.sms.send({ member_id: memberId, organization_id: organizationId, locale });\n },\n {\n onSuccess: (response) => {\n dispatch({ type: 'sms_otp/send_success', response });\n },\n onError: (error) => {\n const message = getTranslatedError(error as StytchAPIError, t);\n if (message) {\n errorToast({ message });\n }\n dispatch({ type: 'sms_otp/send_error', error: message });\n },\n // Throw on error to ensure promise is rejected\n throwOnError: true,\n },\n );\n\n const {\n trigger: authenticate,\n isMutating: isAuthenticating,\n error: authenticateError,\n } = useMutate<\n B2BSMSAuthenticateResponse<StytchProjectConfigurationInput>,\n unknown,\n StytchMutationKey,\n { otp: string; memberId: string; organizationId: string; sessionDurationMinutes: number }\n >(\n 'stytch.otps.sms.authenticate',\n (\n _: string,\n {\n arg: { otp, memberId, organizationId, sessionDurationMinutes },\n }: { arg: { otp: string; memberId: string; organizationId: string; sessionDurationMinutes: number } },\n ) =>\n stytchClient.otps.sms.authenticate({\n code: otp,\n member_id: memberId,\n organization_id: organizationId,\n session_duration_minutes: sessionDurationMinutes,\n }),\n {\n onSuccess: () => {\n dispatch({ type: 'sms_otp/authenticate_success' });\n },\n onError: () => {\n resendCountdown.clear();\n },\n },\n );\n\n const shouldCreate = codeExpiration === null && !isSending && !sendError;\n useEffect(() => {\n if (shouldCreate) {\n sendSms({ memberId, organizationId, locale: smsOtpOptions?.locale }).catch(() => {\n // error in the UI is handled through the error object so we just swallow it here when auto-sending\n });\n }\n }, [memberId, organizationId, sendSms, shouldCreate, smsOtpOptions?.locale]);\n\n useEffect(() => {\n if (!formattedDestination && memberPhoneNumber) {\n const handleFormatNumber = async () => {\n const parsePhoneNumber = (phoneNumber: string) =>\n readB2BInternals(stytchClient).clientsideServices.parsedPhoneNumber({\n phoneNumber,\n });\n\n const national = await formatNumber({\n parsePhoneNumber,\n phoneNumber: memberPhoneNumber,\n });\n\n dispatch({\n type: 'sms_otp/format_destination',\n formattedPhoneNumber: national,\n });\n };\n\n handleFormatNumber();\n }\n }, [dispatch, formattedDestination, stytchClient, memberPhoneNumber]);\n\n const isTotpAvailable = useMemo(\n () =>\n !isEnrolling &&\n enrolledMfaMethods.includes(B2BMFAProducts.totp) &&\n (organizationMfaOptionsSupported.length === 0 || organizationMfaOptionsSupported.includes(B2BMFAProducts.totp)),\n [enrolledMfaMethods, isEnrolling, organizationMfaOptionsSupported],\n );\n const errorMessage = authenticateError\n ? t({ id: 'error.passcodeInvalid', message: 'Invalid passcode, please try again.' })\n : undefined;\n\n // The user can go back to change their phone number if either:\n // - we are in an enrollment flow\n // - they are not enrolled in any MFA methods at all\n // - they are not enrolled in any of the limited MFA methods supported by the organization\n const canGoBack = useMemo(\n () =>\n isEnrolling ||\n enrolledMfaMethods.length === 0 ||\n (organizationMfaOptionsSupported.length > 0 &&\n !enrolledMfaMethods.some((enrolledMethod) => organizationMfaOptionsSupported.includes(enrolledMethod))),\n [enrolledMfaMethods, isEnrolling, organizationMfaOptionsSupported],\n );\n\n const handleSubmit = (otp: string) => {\n authenticate({ otp, memberId, organizationId, sessionDurationMinutes });\n };\n\n const handleSwitchToTotp = () => {\n dispatch({ type: 'transition', history: 'push', screen: AppScreens.TOTPEntry });\n };\n\n const handleResendOTP = async () => {\n await sendSms({ memberId, organizationId, locale: smsOtpOptions?.locale });\n };\n\n const handleBack = () => {\n dispatch({ type: 'navigate_back' });\n };\n\n const resendButton = (\n <ResendOTPButton countdown={resendCountdown} isSubmitting={isAuthenticating} resendOTP={handleResendOTP} />\n );\n const switchToTotpButton = isTotpAvailable && (\n <Button variant=\"ghost\" onClick={handleSwitchToTotp}>\n {t({ id: 'mfa.methods.authenticatorApp', message: 'Use an authenticator app' })}\n </Button>\n );\n const backButton = canGoBack && (\n <Button variant=\"ghost\" onClick={handleBack}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n );\n\n return (\n <Column gap={6}>\n {codeExpiration !== null ? (\n <SentOTPEntry\n isSubmitting={isAuthenticating}\n onSubmit={handleSubmit}\n errorMessage={errorMessage}\n expiration={codeExpiration.getTime()}\n formattedDestination={formattedDestination ?? memberPhoneNumber ?? ''}\n />\n ) : (\n <LoadingScreen />\n )}\n\n {switchToTotpButton && backButton ? (\n <ButtonColumn\n top={resendButton}\n bottom={\n <>\n {switchToTotpButton}\n {backButton}\n </>\n }\n />\n ) : (\n <ButtonColumn>\n {resendButton}\n {switchToTotpButton}\n {backButton}\n </ButtonColumn>\n )}\n </Column>\n );\n};\n"],"names":["SMSOTPEntryScreen","stytchClient","useStytch","sessionOptions","sessionDurationMinutes","smsOtpOptions","useConfig","useLingui","state","dispatch","useGlobalReducer","mfa","isEnrolling","smsOtp","primaryInfo","codeExpiration","formattedDestination","enrolledMfaMethods","memberId","memberPhoneNumber","organizationId","organizationMfaOptionsSupported","resendCountdown","useCountdown","trigger","sendSms","isMutating","isSending","error","sendError","useMutate","_","arg","locale","type","otps","sms","send","member_id","organization_id","onSuccess","response","onError","message","getTranslatedError","errorToast","throwOnError","authenticate","isAuthenticating","authenticateError","otp","code","session_duration_minutes","clear","shouldCreate","useEffect","catch","handleFormatNumber","parsePhoneNumber","phoneNumber","readB2BInternals","clientsideServices","parsedPhoneNumber","national","formatNumber","formattedPhoneNumber","isTotpAvailable","useMemo","includes","B2BMFAProducts","totp","length","errorMessage","undefined","canGoBack","some","enrolledMethod","handleSubmit","handleSwitchToTotp","history","screen","AppScreens","TOTPEntry","handleResendOTP","handleBack","resendButton","React","ResendOTPButton","countdown","isSubmitting","resendOTP","switchToTotpButton","Button","variant","onClick","backButton","Column","gap","SentOTPEntry","onSubmit","expiration","getTime","LoadingScreen","ButtonColumn","top","bottom"],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ function getStytchEventByKey(key) {
|
|
|
36
36
|
const useMutate = (key, fetcher, options = {})=>{
|
|
37
37
|
const onEvent = useEventCallback();
|
|
38
38
|
const onError = useErrorCallback();
|
|
39
|
-
|
|
39
|
+
const result = index(key, fetcher, {
|
|
40
40
|
throwOnError: false,
|
|
41
41
|
...options,
|
|
42
42
|
onSuccess: (data, key, config)=>{
|
|
@@ -54,6 +54,13 @@ const useMutate = (key, fetcher, options = {})=>{
|
|
|
54
54
|
options.onError?.(error, key, config);
|
|
55
55
|
}
|
|
56
56
|
});
|
|
57
|
+
// Hide the error while mutating. This helps avoid the errors continuing to show after the user has clicked submit
|
|
58
|
+
// and also ensures repeating errors causes <ErrorText> to re-render which is important for screenreaders to
|
|
59
|
+
// re-announce them
|
|
60
|
+
return result.isMutating ? {
|
|
61
|
+
...result,
|
|
62
|
+
error: undefined
|
|
63
|
+
} : result;
|
|
57
64
|
};
|
|
58
65
|
/**
|
|
59
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../../../../../../web/src/ui/b2b/utils.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport useSWRMutation, { MutationFetcher, SWRMutationConfiguration } from 'swr/mutation';\nimport { useConfig, useErrorCallback, useEventCallback, useGlobalReducer, useStytch } from './GlobalContextProvider';\nimport { ErrorType } from './types/ErrorType';\nimport { AppScreens } from './types/AppScreens';\nimport {\n AuthFlowType,\n B2BAuthenticateResponseWithMFA,\n B2BDiscoveryAuthenticateResponse,\n B2BMagicLinksDiscoveryAuthenticateResponse,\n StytchError,\n StytchEvent,\n StytchEventType,\n StytchAPIError,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport { StytchB2BExtendedLoginConfig } from '../../types';\nimport { readB2BInternals } from '../../utils/internal';\nimport { B2BOrganizationsGetBySlugResponse } from '@stytch/core/public';\nimport { StytchB2BClient } from '../../b2b/StytchB2BClient';\nimport { Action } from './reducer';\nimport type { ProductId, StytchB2BProduct } from './StytchB2BProduct';\n\ntype RecursiveDotNotation<T> = T extends object\n ? {\n [K in keyof T]: K extends string\n ? T[K] extends (...args: never[]) => unknown\n ? K\n : T[K] extends object\n ? `${K}.${RecursiveDotNotation<T[K]>}`\n : K\n : never;\n }[keyof T]\n : never;\n\ntype ValidStytchMutationKey = `stytch.${RecursiveDotNotation<StytchB2BClient>}`;\n\nconst KeyToStytchEventMap = {\n 'stytch.magicLinks.authenticate': StytchEventType.B2BMagicLinkAuthenticate,\n 'stytch.sso.authenticate': StytchEventType.B2BSSOAuthenticate,\n 'stytch.sso.discoverConnections': StytchEventType.B2BSSODiscoverConnections,\n 'stytch.magicLinks.discovery.authenticate': StytchEventType.B2BMagicLinkDiscoveryAuthenticate,\n 'stytch.discovery.organizations.create': StytchEventType.B2BDiscoveryOrganizationsCreate,\n 'stytch.discovery.intermediateSessions.exchange': StytchEventType.B2BDiscoveryIntermediateSessionExchange,\n 'stytch.magicLinks.email.loginOrSignup': StytchEventType.B2BMagicLinkEmailLoginOrSignup,\n 'stytch.magicLinks.email.discovery.send': StytchEventType.B2BMagicLinkEmailDiscoverySend,\n 'stytch.oauth.authenticate': StytchEventType.B2BOAuthAuthenticate,\n 'stytch.oauth.discovery.authenticate': StytchEventType.B2BOAuthDiscoveryAuthenticate,\n 'stytch.otps.sms.send': StytchEventType.B2BSMSOTPSend,\n 'stytch.otps.sms.authenticate': StytchEventType.B2BSMSOTPAuthenticate,\n 'stytch.totp.create': StytchEventType.B2BTOTPCreate,\n 'stytch.totp.authenticate': StytchEventType.B2BTOTPAuthenticate,\n 'stytch.recoveryCodes.recover': StytchEventType.B2BRecoveryCodesRecover,\n 'stytch.impersonation.authenticate': StytchEventType.B2BImpersonationAuthenticate,\n 'stytch.otps.email.authenticate': StytchEventType.B2BOTPsEmailAuthenticate,\n 'stytch.otps.email.discovery.authenticate': StytchEventType.B2BOTPsEmailDiscoveryAuthenticate,\n 'stytch.otps.email.discovery.send': StytchEventType.B2BOTPsEmailDiscoverySend,\n 'stytch.otps.email.loginOrSignup': StytchEventType.B2BOTPsEmailLoginOrSignup,\n 'stytch.organization.getBySlug': StytchEventType.B2BOrganizationsGetBySlug,\n} satisfies Partial<Record<ValidStytchMutationKey, StytchEventType>>;\n\ntype StytchExternalMutationKey = keyof typeof KeyToStytchEventMap;\n\ntype StytchInternalMutationKey = `internal.${string}`;\n\nexport type StytchMutationKey = StytchExternalMutationKey | StytchInternalMutationKey;\n\nexport function getStytchEventByKey(key: StytchMutationKey): StytchEventType | undefined {\n return KeyToStytchEventMap[key as StytchExternalMutationKey];\n}\n\nexport const useMutate = <TData, TError, TKey extends StytchMutationKey, TExtraArg = never>(\n key: TKey,\n fetcher: MutationFetcher<TData, TExtraArg, TKey>,\n options: SWRMutationConfiguration<TData, TError, TExtraArg, TKey> = {},\n) => {\n const onEvent = useEventCallback();\n const onError = useErrorCallback();\n\n return useSWRMutation<TData, TError, TKey, TExtraArg>(key, fetcher, {\n throwOnError: false,\n ...options,\n onSuccess: (data, key, config) => {\n const eventType = getStytchEventByKey(key as StytchMutationKey);\n if (eventType) {\n onEvent({ type: eventType, data } as StytchEvent<StytchProjectConfigurationInput>);\n }\n\n options.onSuccess?.(data, key, config);\n },\n onError: (error, key, config) => {\n onError(error as StytchError);\n\n options.onError?.(error, key, config);\n },\n });\n};\n\n/**\n *\n * This hook triggers a request to retrieve the organization from the slug.\n * The hook only triggers the request if the SDK is being used in an organization flow,\n * and a slug pattern is present. The hook returns an isSearching boolean that can be used\n * to display a loading state while the search is in progress.\n */\nexport const useExtractSlug = () => {\n const [state, dispatch] = useGlobalReducer();\n const [pattern, setPattern] = useState<string | null | undefined>();\n const config = useConfig();\n\n const stytchClient = useStytch();\n const slug = config.organizationSlug ?? extractFromPattern(pattern || null, window.location.href);\n\n const { trigger, isMutating: isSearching } = useMutate<\n B2BOrganizationsGetBySlugResponse,\n StytchAPIError,\n StytchExternalMutationKey,\n { slug: string }\n >(\n 'stytch.organization.getBySlug',\n (_: string, { arg: { slug } }: { arg: { slug: string } }) =>\n stytchClient.organization.getBySlug({ organization_slug: slug }),\n {\n onSuccess: ({ organization }) => {\n if (organization === null) {\n dispatch({\n type: 'set_error_message_and_transition',\n errorType: ErrorType.Organization,\n canGoBack: false,\n });\n } else {\n dispatch({\n type: 'set_organization',\n organization: {\n ...organization,\n },\n });\n }\n },\n },\n );\n\n useEffect(() => {\n readB2BInternals(stytchClient)\n .bootstrap.getAsync()\n .then(({ slugPattern }) => {\n setPattern(slugPattern);\n });\n }, [stytchClient]);\n\n useEffect(() => {\n if (\n slug !== null &&\n state.flowState.organization === null &&\n state.screen === AppScreens.Main &&\n state.flowState.type == AuthFlowType.Organization\n ) {\n trigger({ slug });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [slug, state.flowState, state.screen]);\n\n // The org is pending identification if the slug pattern has not yet been\n // determined (i.e., `undefined`) or the organization request is in progress\n const resultPending = pattern === undefined || isSearching;\n\n return { slug, resultPending };\n};\n\nexport const useBootstrap = () => {\n const stytchClient = useStytch();\n const [bootstrap, setBootstrap] = useState(readB2BInternals(stytchClient).bootstrap.getSync());\n\n useEffect(() => {\n readB2BInternals(stytchClient)\n .bootstrap.getAsync()\n .then((data) => {\n setBootstrap(data);\n });\n }, [stytchClient]);\n\n return bootstrap;\n};\n\nexport const onAuthenticateSuccess = (\n data: B2BAuthenticateResponseWithMFA<StytchProjectConfigurationInput>,\n dispatch: React.Dispatch<Action>,\n config: StytchB2BExtendedLoginConfig,\n) => {\n dispatch({\n type: 'primary_authenticate_success',\n response: data,\n includedMfaMethods: config.mfaProductInclude,\n });\n};\n\nexport const onDiscoveryAuthenticateSuccess = (\n data: B2BDiscoveryAuthenticateResponse | B2BMagicLinksDiscoveryAuthenticateResponse,\n dispatch: React.Dispatch<Action>,\n) => {\n dispatch({\n type: 'set_discovery_state',\n email: data.email_address,\n discoveredOrganizations: data.discovered_organizations,\n });\n};\n\nexport const extractFromPattern = (pattern: string | null, href: string): string | null => {\n if (pattern === null) return null;\n\n const url = new URL(href);\n url.search = '';\n\n const currentUrl = url.toString().trim();\n const regexPattern = pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '(?:[^.]+)').replace('{{slug}}', '(.+)');\n\n const regex = new RegExp(regexPattern);\n const match = currentUrl.match(regex);\n\n if (match && match[1]) {\n return match?.[1];\n }\n\n return null;\n};\n\nexport function hasProduct(products: StytchB2BProduct[], product: ProductId) {\n return products.some((p) => p.id === product);\n}\n\nexport function useProductComponents<Type extends 'screens' | 'mainScreen' | 'ssoAndOAuthButtons'>(\n { products, organizationProducts }: { products: StytchB2BProduct[]; organizationProducts: StytchB2BProduct[] },\n screenType: Type,\n) {\n return useMemo(() => {\n const map = {} as Required<StytchB2BProduct[Type]>;\n for (const product of [...products, ...organizationProducts]) {\n if (product[screenType]) Object.assign(map, product[screenType]);\n }\n return map;\n }, [products, organizationProducts, screenType]);\n}\n"],"names":["KeyToStytchEventMap","StytchEventType","B2BMagicLinkAuthenticate","B2BSSOAuthenticate","B2BSSODiscoverConnections","B2BMagicLinkDiscoveryAuthenticate","B2BDiscoveryOrganizationsCreate","B2BDiscoveryIntermediateSessionExchange","B2BMagicLinkEmailLoginOrSignup","B2BMagicLinkEmailDiscoverySend","B2BOAuthAuthenticate","B2BOAuthDiscoveryAuthenticate","B2BSMSOTPSend","B2BSMSOTPAuthenticate","B2BTOTPCreate","B2BTOTPAuthenticate","B2BRecoveryCodesRecover","B2BImpersonationAuthenticate","B2BOTPsEmailAuthenticate","B2BOTPsEmailDiscoveryAuthenticate","B2BOTPsEmailDiscoverySend","B2BOTPsEmailLoginOrSignup","B2BOrganizationsGetBySlug","getStytchEventByKey","key","useMutate","fetcher","options","onEvent","useEventCallback","onError","useErrorCallback","useSWRMutation","throwOnError","onSuccess","data","config","eventType","type","error","useExtractSlug","state","dispatch","useGlobalReducer","pattern","setPattern","useState","useConfig","stytchClient","useStytch","slug","organizationSlug","extractFromPattern","window","location","href","trigger","isMutating","isSearching","_","arg","organization","getBySlug","organization_slug","errorType","ErrorType","Organization","canGoBack","useEffect","readB2BInternals","bootstrap","getAsync","then","slugPattern","flowState","screen","AppScreens","Main","AuthFlowType","resultPending","undefined","useBootstrap","setBootstrap","getSync","onAuthenticateSuccess","response","includedMfaMethods","mfaProductInclude","onDiscoveryAuthenticateSuccess","email","email_address","discoveredOrganizations","discovered_organizations","url","URL","search","currentUrl","toString","trim","regexPattern","replace","regex","RegExp","match","hasProduct","products","product","some","p","id","useProductComponents","organizationProducts","screenType","useMemo","map","Object","assign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../../../../../../web/src/ui/b2b/utils.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport useSWRMutation, { MutationFetcher, SWRMutationConfiguration } from 'swr/mutation';\nimport { useConfig, useErrorCallback, useEventCallback, useGlobalReducer, useStytch } from './GlobalContextProvider';\nimport { ErrorType } from './types/ErrorType';\nimport { AppScreens } from './types/AppScreens';\nimport {\n AuthFlowType,\n B2BAuthenticateResponseWithMFA,\n B2BDiscoveryAuthenticateResponse,\n B2BMagicLinksDiscoveryAuthenticateResponse,\n StytchError,\n StytchEvent,\n StytchEventType,\n StytchAPIError,\n StytchProjectConfigurationInput,\n} from '@stytch/core/public';\nimport { StytchB2BExtendedLoginConfig } from '../../types';\nimport { readB2BInternals } from '../../utils/internal';\nimport { B2BOrganizationsGetBySlugResponse } from '@stytch/core/public';\nimport { StytchB2BClient } from '../../b2b/StytchB2BClient';\nimport { Action } from './reducer';\nimport type { ProductId, StytchB2BProduct } from './StytchB2BProduct';\n\ntype RecursiveDotNotation<T> = T extends object\n ? {\n [K in keyof T]: K extends string\n ? T[K] extends (...args: never[]) => unknown\n ? K\n : T[K] extends object\n ? `${K}.${RecursiveDotNotation<T[K]>}`\n : K\n : never;\n }[keyof T]\n : never;\n\ntype ValidStytchMutationKey = `stytch.${RecursiveDotNotation<StytchB2BClient>}`;\n\nconst KeyToStytchEventMap = {\n 'stytch.magicLinks.authenticate': StytchEventType.B2BMagicLinkAuthenticate,\n 'stytch.sso.authenticate': StytchEventType.B2BSSOAuthenticate,\n 'stytch.sso.discoverConnections': StytchEventType.B2BSSODiscoverConnections,\n 'stytch.magicLinks.discovery.authenticate': StytchEventType.B2BMagicLinkDiscoveryAuthenticate,\n 'stytch.discovery.organizations.create': StytchEventType.B2BDiscoveryOrganizationsCreate,\n 'stytch.discovery.intermediateSessions.exchange': StytchEventType.B2BDiscoveryIntermediateSessionExchange,\n 'stytch.magicLinks.email.loginOrSignup': StytchEventType.B2BMagicLinkEmailLoginOrSignup,\n 'stytch.magicLinks.email.discovery.send': StytchEventType.B2BMagicLinkEmailDiscoverySend,\n 'stytch.oauth.authenticate': StytchEventType.B2BOAuthAuthenticate,\n 'stytch.oauth.discovery.authenticate': StytchEventType.B2BOAuthDiscoveryAuthenticate,\n 'stytch.otps.sms.send': StytchEventType.B2BSMSOTPSend,\n 'stytch.otps.sms.authenticate': StytchEventType.B2BSMSOTPAuthenticate,\n 'stytch.totp.create': StytchEventType.B2BTOTPCreate,\n 'stytch.totp.authenticate': StytchEventType.B2BTOTPAuthenticate,\n 'stytch.recoveryCodes.recover': StytchEventType.B2BRecoveryCodesRecover,\n 'stytch.impersonation.authenticate': StytchEventType.B2BImpersonationAuthenticate,\n 'stytch.otps.email.authenticate': StytchEventType.B2BOTPsEmailAuthenticate,\n 'stytch.otps.email.discovery.authenticate': StytchEventType.B2BOTPsEmailDiscoveryAuthenticate,\n 'stytch.otps.email.discovery.send': StytchEventType.B2BOTPsEmailDiscoverySend,\n 'stytch.otps.email.loginOrSignup': StytchEventType.B2BOTPsEmailLoginOrSignup,\n 'stytch.organization.getBySlug': StytchEventType.B2BOrganizationsGetBySlug,\n} satisfies Partial<Record<ValidStytchMutationKey, StytchEventType>>;\n\ntype StytchExternalMutationKey = keyof typeof KeyToStytchEventMap;\n\ntype StytchInternalMutationKey = `internal.${string}`;\n\nexport type StytchMutationKey = StytchExternalMutationKey | StytchInternalMutationKey;\n\nexport function getStytchEventByKey(key: StytchMutationKey): StytchEventType | undefined {\n return KeyToStytchEventMap[key as StytchExternalMutationKey];\n}\n\nexport const useMutate = <TData, TError, TKey extends StytchMutationKey, TExtraArg = never>(\n key: TKey,\n fetcher: MutationFetcher<TData, TExtraArg, TKey>,\n options: SWRMutationConfiguration<TData, TError, TExtraArg, TKey> = {},\n) => {\n const onEvent = useEventCallback();\n const onError = useErrorCallback();\n\n const result = useSWRMutation<TData, TError, TKey, TExtraArg>(key, fetcher, {\n throwOnError: false,\n ...options,\n onSuccess: (data, key, config) => {\n const eventType = getStytchEventByKey(key as StytchMutationKey);\n if (eventType) {\n onEvent({ type: eventType, data } as StytchEvent<StytchProjectConfigurationInput>);\n }\n\n options.onSuccess?.(data, key, config);\n },\n onError: (error, key, config) => {\n onError(error as StytchError);\n\n options.onError?.(error, key, config);\n },\n });\n\n // Hide the error while mutating. This helps avoid the errors continuing to show after the user has clicked submit\n // and also ensures repeating errors causes <ErrorText> to re-render which is important for screenreaders to\n // re-announce them\n return result.isMutating ? { ...result, error: undefined } : result;\n};\n\n/**\n *\n * This hook triggers a request to retrieve the organization from the slug.\n * The hook only triggers the request if the SDK is being used in an organization flow,\n * and a slug pattern is present. The hook returns an isSearching boolean that can be used\n * to display a loading state while the search is in progress.\n */\nexport const useExtractSlug = () => {\n const [state, dispatch] = useGlobalReducer();\n const [pattern, setPattern] = useState<string | null | undefined>();\n const config = useConfig();\n\n const stytchClient = useStytch();\n const slug = config.organizationSlug ?? extractFromPattern(pattern || null, window.location.href);\n\n const { trigger, isMutating: isSearching } = useMutate<\n B2BOrganizationsGetBySlugResponse,\n StytchAPIError,\n StytchExternalMutationKey,\n { slug: string }\n >(\n 'stytch.organization.getBySlug',\n (_: string, { arg: { slug } }: { arg: { slug: string } }) =>\n stytchClient.organization.getBySlug({ organization_slug: slug }),\n {\n onSuccess: ({ organization }) => {\n if (organization === null) {\n dispatch({\n type: 'set_error_message_and_transition',\n errorType: ErrorType.Organization,\n canGoBack: false,\n });\n } else {\n dispatch({\n type: 'set_organization',\n organization: {\n ...organization,\n },\n });\n }\n },\n },\n );\n\n useEffect(() => {\n readB2BInternals(stytchClient)\n .bootstrap.getAsync()\n .then(({ slugPattern }) => {\n setPattern(slugPattern);\n });\n }, [stytchClient]);\n\n useEffect(() => {\n if (\n slug !== null &&\n state.flowState.organization === null &&\n state.screen === AppScreens.Main &&\n state.flowState.type == AuthFlowType.Organization\n ) {\n trigger({ slug });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- SDK-1354\n }, [slug, state.flowState, state.screen]);\n\n // The org is pending identification if the slug pattern has not yet been\n // determined (i.e., `undefined`) or the organization request is in progress\n const resultPending = pattern === undefined || isSearching;\n\n return { slug, resultPending };\n};\n\nexport const useBootstrap = () => {\n const stytchClient = useStytch();\n const [bootstrap, setBootstrap] = useState(readB2BInternals(stytchClient).bootstrap.getSync());\n\n useEffect(() => {\n readB2BInternals(stytchClient)\n .bootstrap.getAsync()\n .then((data) => {\n setBootstrap(data);\n });\n }, [stytchClient]);\n\n return bootstrap;\n};\n\nexport const onAuthenticateSuccess = (\n data: B2BAuthenticateResponseWithMFA<StytchProjectConfigurationInput>,\n dispatch: React.Dispatch<Action>,\n config: StytchB2BExtendedLoginConfig,\n) => {\n dispatch({\n type: 'primary_authenticate_success',\n response: data,\n includedMfaMethods: config.mfaProductInclude,\n });\n};\n\nexport const onDiscoveryAuthenticateSuccess = (\n data: B2BDiscoveryAuthenticateResponse | B2BMagicLinksDiscoveryAuthenticateResponse,\n dispatch: React.Dispatch<Action>,\n) => {\n dispatch({\n type: 'set_discovery_state',\n email: data.email_address,\n discoveredOrganizations: data.discovered_organizations,\n });\n};\n\nexport const extractFromPattern = (pattern: string | null, href: string): string | null => {\n if (pattern === null) return null;\n\n const url = new URL(href);\n url.search = '';\n\n const currentUrl = url.toString().trim();\n const regexPattern = pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '(?:[^.]+)').replace('{{slug}}', '(.+)');\n\n const regex = new RegExp(regexPattern);\n const match = currentUrl.match(regex);\n\n if (match && match[1]) {\n return match?.[1];\n }\n\n return null;\n};\n\nexport function hasProduct(products: StytchB2BProduct[], product: ProductId) {\n return products.some((p) => p.id === product);\n}\n\nexport function useProductComponents<Type extends 'screens' | 'mainScreen' | 'ssoAndOAuthButtons'>(\n { products, organizationProducts }: { products: StytchB2BProduct[]; organizationProducts: StytchB2BProduct[] },\n screenType: Type,\n) {\n return useMemo(() => {\n const map = {} as Required<StytchB2BProduct[Type]>;\n for (const product of [...products, ...organizationProducts]) {\n if (product[screenType]) Object.assign(map, product[screenType]);\n }\n return map;\n }, [products, organizationProducts, screenType]);\n}\n"],"names":["KeyToStytchEventMap","StytchEventType","B2BMagicLinkAuthenticate","B2BSSOAuthenticate","B2BSSODiscoverConnections","B2BMagicLinkDiscoveryAuthenticate","B2BDiscoveryOrganizationsCreate","B2BDiscoveryIntermediateSessionExchange","B2BMagicLinkEmailLoginOrSignup","B2BMagicLinkEmailDiscoverySend","B2BOAuthAuthenticate","B2BOAuthDiscoveryAuthenticate","B2BSMSOTPSend","B2BSMSOTPAuthenticate","B2BTOTPCreate","B2BTOTPAuthenticate","B2BRecoveryCodesRecover","B2BImpersonationAuthenticate","B2BOTPsEmailAuthenticate","B2BOTPsEmailDiscoveryAuthenticate","B2BOTPsEmailDiscoverySend","B2BOTPsEmailLoginOrSignup","B2BOrganizationsGetBySlug","getStytchEventByKey","key","useMutate","fetcher","options","onEvent","useEventCallback","onError","useErrorCallback","result","useSWRMutation","throwOnError","onSuccess","data","config","eventType","type","error","isMutating","undefined","useExtractSlug","state","dispatch","useGlobalReducer","pattern","setPattern","useState","useConfig","stytchClient","useStytch","slug","organizationSlug","extractFromPattern","window","location","href","trigger","isSearching","_","arg","organization","getBySlug","organization_slug","errorType","ErrorType","Organization","canGoBack","useEffect","readB2BInternals","bootstrap","getAsync","then","slugPattern","flowState","screen","AppScreens","Main","AuthFlowType","resultPending","useBootstrap","setBootstrap","getSync","onAuthenticateSuccess","response","includedMfaMethods","mfaProductInclude","onDiscoveryAuthenticateSuccess","email","email_address","discoveredOrganizations","discovered_organizations","url","URL","search","currentUrl","toString","trim","regexPattern","replace","regex","RegExp","match","hasProduct","products","product","some","p","id","useProductComponents","organizationProducts","screenType","useMemo","map","Object","assign"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React__default, { useState, useRef, useCallback, useEffect } from 'react';
|
|
2
|
-
import classNames from '../../../../../../_virtual/
|
|
2
|
+
import classNames from '../../../../../../_virtual/index.mjs';
|
|
3
3
|
import { OAuthButton } from './OAuthButton.mjs';
|
|
4
4
|
import { useConfig, useStytch } from '../GlobalContextProvider.mjs';
|
|
5
5
|
import { readB2CInternals } from '../../../utils/internal.mjs';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React__default from 'react';
|
|
2
|
-
import classNames from '../../../../../../../../_virtual/
|
|
2
|
+
import classNames from '../../../../../../../../_virtual/index.mjs';
|
|
3
3
|
import { useLingui } from '../../../../../../../../node_modules/@lingui/react/dist/index.mjs';
|
|
4
4
|
import { useConfig } from '../../../GlobalContextProvider.mjs';
|
|
5
5
|
import Typography from '../../../../components/atoms/Typography.mjs';
|
|
@@ -4,7 +4,7 @@ import Button from '../../../components/atoms/Button.mjs';
|
|
|
4
4
|
import Typography from '../../../components/atoms/Typography.mjs';
|
|
5
5
|
import Input from '../../../components/molecules/Input.mjs';
|
|
6
6
|
import modules_20f268b7 from './EditableRow.module.css.mjs';
|
|
7
|
-
import classNames from '../../../../../../../_virtual/
|
|
7
|
+
import classNames from '../../../../../../../_virtual/index.mjs';
|
|
8
8
|
|
|
9
9
|
const commonButtonProps = {
|
|
10
10
|
block: false,
|
|
@@ -2,6 +2,8 @@ import React__default, { useState, useEffect } from 'react';
|
|
|
2
2
|
import { useStytch, useGlobalReducer, useConfig, AppScreens } from '../../GlobalContextProvider.mjs';
|
|
3
3
|
import { readB2CInternals } from '../../../../utils/internal.mjs';
|
|
4
4
|
import { EmailConfirmationView } from '../../../components/organisms/EmailConfirmationView.mjs';
|
|
5
|
+
import { useCountdown } from '../../../components/atoms/Countdown.mjs';
|
|
6
|
+
import { usePasswordlessAuthenticate } from './usePasswordlessAuthenticate.mjs';
|
|
5
7
|
import { EmailSentType } from '../../../../../../core/src/Events.mjs';
|
|
6
8
|
|
|
7
9
|
/**
|
|
@@ -35,12 +37,14 @@ import { EmailSentType } from '../../../../../../core/src/Events.mjs';
|
|
|
35
37
|
// we simply won't provide a hint!
|
|
36
38
|
return null;
|
|
37
39
|
};
|
|
38
|
-
const EmailConfirmation = (
|
|
40
|
+
const EmailConfirmation = ({ showGoBack = true })=>{
|
|
39
41
|
const stytchClient = useStytch();
|
|
40
42
|
const [state, dispatch] = useGlobalReducer();
|
|
41
43
|
const emailDomain = useEmailDomain();
|
|
44
|
+
const countdown = useCountdown();
|
|
45
|
+
const { sendLink, isSubmitting } = usePasswordlessAuthenticate();
|
|
42
46
|
const email = state.formState.magicLinkState.email !== '' ? state.formState.magicLinkState.email : state.formState.passwordState.email;
|
|
43
|
-
const
|
|
47
|
+
const goBack = ()=>{
|
|
44
48
|
dispatch({
|
|
45
49
|
type: 'set_magic_link_email',
|
|
46
50
|
email: ''
|
|
@@ -59,9 +63,11 @@ const EmailConfirmation = (props)=>{
|
|
|
59
63
|
};
|
|
60
64
|
return /*#__PURE__*/ React__default.createElement(EmailConfirmationView, {
|
|
61
65
|
emailDomain: emailDomain,
|
|
62
|
-
reset: reset,
|
|
63
66
|
email: email,
|
|
64
|
-
|
|
67
|
+
goBack: showGoBack ? goBack : undefined,
|
|
68
|
+
resend: sendLink,
|
|
69
|
+
countdown: countdown,
|
|
70
|
+
isSubmitting: isSubmitting
|
|
65
71
|
});
|
|
66
72
|
};
|
|
67
73
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailConfirmation.mjs","sources":["../../../../../../../../../../web/src/ui/b2c/screens/Secondary/EmailConfirmation.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { AppScreens, useConfig, useGlobalReducer, useStytch } from '../../GlobalContextProvider';\nimport { readB2CInternals } from '../../../../utils/internal';\nimport { EmailConfirmationView } from '../../../components/organisms/EmailConfirmationView';\nimport { EmailSentType } from '@stytch/core';\n\n/**\n * Resolves the best email domain to use as a hint for login\n */\nexport const useEmailDomain = () => {\n const stytch = useStytch();\n const config = useConfig();\n /**\n * Read the emailDomains out of sync storage, then read out of async storage\n * TODO - Should all bootstrap data live in the config somewhere?\n */\n const [emailDomains, setEmailDomains] = useState(() => {\n const { emailDomains } = readB2CInternals(stytch).bootstrap.getSync();\n return emailDomains;\n });\n\n useEffect(() => {\n readB2CInternals(stytch)\n .bootstrap.getAsync()\n .then(({ emailDomains }) => {\n setEmailDomains(emailDomains);\n });\n }, [stytch]);\n\n // If a domain is explicitly passed in, use it!\n if (config.emailMagicLinksOptions?.domainHint) {\n return config.emailMagicLinksOptions?.domainHint;\n }\n // If there can only be one logical choice, use it!\n if (emailDomains?.length === 1) {\n return emailDomains[0];\n }\n // If it isn't clear who sent the email\n // we simply won't provide a hint!\n return null;\n};\n\nexport const EmailConfirmation = (
|
|
1
|
+
{"version":3,"file":"EmailConfirmation.mjs","sources":["../../../../../../../../../../web/src/ui/b2c/screens/Secondary/EmailConfirmation.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { AppScreens, useConfig, useGlobalReducer, useStytch } from '../../GlobalContextProvider';\nimport { readB2CInternals } from '../../../../utils/internal';\nimport { EmailConfirmationView } from '../../../components/organisms/EmailConfirmationView';\nimport { EmailSentType } from '@stytch/core';\nimport { useCountdown } from '../../../components/atoms/Countdown';\n\nimport { usePasswordlessAuthenticate } from './usePasswordlessAuthenticate';\n\n/**\n * Resolves the best email domain to use as a hint for login\n */\nexport const useEmailDomain = () => {\n const stytch = useStytch();\n const config = useConfig();\n /**\n * Read the emailDomains out of sync storage, then read out of async storage\n * TODO - Should all bootstrap data live in the config somewhere?\n */\n const [emailDomains, setEmailDomains] = useState(() => {\n const { emailDomains } = readB2CInternals(stytch).bootstrap.getSync();\n return emailDomains;\n });\n\n useEffect(() => {\n readB2CInternals(stytch)\n .bootstrap.getAsync()\n .then(({ emailDomains }) => {\n setEmailDomains(emailDomains);\n });\n }, [stytch]);\n\n // If a domain is explicitly passed in, use it!\n if (config.emailMagicLinksOptions?.domainHint) {\n return config.emailMagicLinksOptions?.domainHint;\n }\n // If there can only be one logical choice, use it!\n if (emailDomains?.length === 1) {\n return emailDomains[0];\n }\n // If it isn't clear who sent the email\n // we simply won't provide a hint!\n return null;\n};\n\nexport const EmailConfirmation = ({ showGoBack = true }: { showGoBack?: boolean }) => {\n const stytchClient = useStytch();\n const [state, dispatch] = useGlobalReducer();\n const emailDomain = useEmailDomain();\n const countdown = useCountdown();\n const { sendLink, isSubmitting } = usePasswordlessAuthenticate();\n\n const email =\n state.formState.magicLinkState.email !== ''\n ? state.formState.magicLinkState.email\n : state.formState.passwordState.email;\n\n const goBack = () => {\n dispatch({ type: 'set_magic_link_email', email: '' });\n dispatch({ type: 'transition', screen: AppScreens.Main });\n readB2CInternals(stytchClient).networkClient.logEvent({\n name: 'email_try_again_clicked',\n details: { email: email, type: EmailSentType.LoginOrCreateEML },\n });\n };\n\n return (\n <EmailConfirmationView\n emailDomain={emailDomain}\n email={email}\n goBack={showGoBack ? goBack : undefined}\n resend={sendLink}\n countdown={countdown}\n isSubmitting={isSubmitting}\n />\n );\n};\n"],"names":["useEmailDomain","stytch","useStytch","config","useConfig","emailDomains","setEmailDomains","useState","readB2CInternals","bootstrap","getSync","useEffect","getAsync","then","emailMagicLinksOptions","domainHint","length","EmailConfirmation","showGoBack","stytchClient","state","dispatch","useGlobalReducer","emailDomain","countdown","useCountdown","sendLink","isSubmitting","usePasswordlessAuthenticate","email","formState","magicLinkState","passwordState","goBack","type","screen","AppScreens","Main","networkClient","logEvent","name","details","EmailSentType","LoginOrCreateEML","React","EmailConfirmationView","undefined","resend"],"mappings":";;;;;;;;AASA;;UAGaA,cAAAA,GAAiB,IAAA;AAC5B,IAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACf;;;AAGC,MACD,MAAM,CAACC,YAAAA,EAAcC,eAAAA,CAAgB,GAAGC,QAAAA,CAAS,IAAA;QAC/C,MAAM,EAAEF,YAAY,EAAE,GAAGG,iBAAiBP,MAAAA,CAAAA,CAAQQ,SAAS,CAACC,OAAO,EAAA;QACnE,OAAOL,YAAAA;AACT,IAAA,CAAA,CAAA;IAEAM,SAAAA,CAAU,IAAA;QACRH,gBAAAA,CAAiBP,MAAAA,CAAAA,CACdQ,SAAS,CAACG,QAAQ,EAAA,CAClBC,IAAI,CAAC,CAAC,EAAER,YAAY,EAAE,GAAA;YACrBC,eAAAA,CAAgBD,YAAAA,CAAAA;AAClB,QAAA,CAAA,CAAA;IACJ,CAAA,EAAG;AAACJ,QAAAA;AAAO,KAAA,CAAA;;IAGX,IAAIE,MAAAA,CAAOW,sBAAsB,EAAEC,UAAAA,EAAY;QAC7C,OAAOZ,MAAAA,CAAOW,sBAAsB,EAAEC,UAAAA;AACxC,IAAA;;IAEA,IAAIV,YAAAA,EAAcW,WAAW,CAAA,EAAG;QAC9B,OAAOX,YAAY,CAAC,CAAA,CAAE;AACxB,IAAA;;;IAGA,OAAO,IAAA;AACT;MAEaY,iBAAAA,GAAoB,CAAC,EAAEC,UAAAA,GAAa,IAAI,EAA4B,GAAA;AAC/E,IAAA,MAAMC,YAAAA,GAAejB,SAAAA,EAAAA;IACrB,MAAM,CAACkB,KAAAA,EAAOC,QAAAA,CAAS,GAAGC,gBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcvB,cAAAA,EAAAA;AACpB,IAAA,MAAMwB,SAAAA,GAAYC,YAAAA,EAAAA;AAClB,IAAA,MAAM,EAAEC,QAAQ,EAAEC,YAAY,EAAE,GAAGC,2BAAAA,EAAAA;IAEnC,MAAMC,KAAAA,GACJT,MAAMU,SAAS,CAACC,cAAc,CAACF,KAAK,KAAK,EAAA,GACrCT,KAAAA,CAAMU,SAAS,CAACC,cAAc,CAACF,KAAK,GACpCT,MAAMU,SAAS,CAACE,aAAa,CAACH,KAAK;AAEzC,IAAA,MAAMI,MAAAA,GAAS,IAAA;QACbZ,QAAAA,CAAS;YAAEa,IAAAA,EAAM,sBAAA;YAAwBL,KAAAA,EAAO;AAAG,SAAA,CAAA;QACnDR,QAAAA,CAAS;YAAEa,IAAAA,EAAM,YAAA;AAAcC,YAAAA,MAAAA,EAAQC,WAAWC;AAAK,SAAA,CAAA;AACvD7B,QAAAA,gBAAAA,CAAiBW,YAAAA,CAAAA,CAAcmB,aAAa,CAACC,QAAQ,CAAC;YACpDC,IAAAA,EAAM,yBAAA;YACNC,OAAAA,EAAS;gBAAEZ,KAAAA,EAAOA,KAAAA;AAAOK,gBAAAA,IAAAA,EAAMQ,cAAcC;AAAiB;AAChE,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEC,cAAA,CAAA,aAAA,CAACC,qBAAAA,EAAAA;QACCtB,WAAAA,EAAaA,WAAAA;QACbM,KAAAA,EAAOA,KAAAA;AACPI,QAAAA,MAAAA,EAAQf,aAAae,MAAAA,GAASa,SAAAA;QAC9BC,MAAAA,EAAQrB,QAAAA;QACRF,SAAAA,EAAWA,SAAAA;QACXG,YAAAA,EAAcA;;AAGpB;;;;"}
|
|
@@ -8,8 +8,9 @@ import { PasswordNewUser } from '../Password/PasswordNewUser.mjs';
|
|
|
8
8
|
import { PasswordAuthenticate } from '../Password/PasswordAuthenticate.mjs';
|
|
9
9
|
import Typography from '../../../components/atoms/Typography.mjs';
|
|
10
10
|
import TextColumn from '../../../components/molecules/TextColumn.mjs';
|
|
11
|
-
import { PasswordlessAuthenticate
|
|
11
|
+
import { PasswordlessAuthenticate } from './PasswordlessAuthenticate.mjs';
|
|
12
12
|
import { hasProduct } from '../../utils.mjs';
|
|
13
|
+
import { usePasswordlessAuthenticate } from './usePasswordlessAuthenticate.mjs';
|
|
13
14
|
import { OTPMethods } from '../../../../../../core/src/public/ui.mjs';
|
|
14
15
|
|
|
15
16
|
const PasswordCreateAuthenticate = ()=>{
|
package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordCreateAuthenticate.mjs","sources":["../../../../../../../../../../web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.tsx"],"sourcesContent":["import React, { Dispatch } from 'react';\nimport { OTPMethods } from '@stytch/core/public';\nimport { useLingui } from '@lingui/react/macro';\n\nimport Column from '../../../components/atoms/Column';\nimport Button from '../../../components/atoms/Button';\nimport { useGlobalReducer, AppScreens, useConfig } from '../../GlobalContextProvider';\nimport Divider from '../../../components/molecules/Divider';\nimport { PasswordNewUser } from '../Password/PasswordNewUser';\nimport { PasswordAuthenticate } from '../Password/PasswordAuthenticate';\nimport Typography from '../../../components/atoms/Typography';\nimport TextColumn from '../../../components/molecules/TextColumn';\nimport { PasswordlessAuthenticate
|
|
1
|
+
{"version":3,"file":"PasswordCreateAuthenticate.mjs","sources":["../../../../../../../../../../web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.tsx"],"sourcesContent":["import React, { Dispatch } from 'react';\nimport { OTPMethods } from '@stytch/core/public';\nimport { useLingui } from '@lingui/react/macro';\n\nimport Column from '../../../components/atoms/Column';\nimport Button from '../../../components/atoms/Button';\nimport { useGlobalReducer, AppScreens, useConfig } from '../../GlobalContextProvider';\nimport Divider from '../../../components/molecules/Divider';\nimport { PasswordNewUser } from '../Password/PasswordNewUser';\nimport { PasswordAuthenticate } from '../Password/PasswordAuthenticate';\nimport Typography from '../../../components/atoms/Typography';\nimport TextColumn from '../../../components/molecules/TextColumn';\nimport { PasswordlessAuthenticate } from './PasswordlessAuthenticate';\nimport { Action } from '../../reducer';\nimport { hasProduct } from '../../utils';\nimport { usePasswordlessAuthenticate } from './usePasswordlessAuthenticate';\n\nexport const PasswordCreateAuthenticate = () => {\n const { t } = useLingui();\n const { emailMagicLinksOptions, otpOptions, products } = useConfig();\n const [state, dispatch] = useGlobalReducer();\n\n const otpMethods = otpOptions?.methods ?? [];\n const hasEmailMagicLink = hasProduct(products, 'emailMagicLinks') && !!emailMagicLinksOptions;\n const hasOTPEmail = otpMethods.includes(OTPMethods.Email);\n const secondaryType = hasOTPEmail ? 'otp' : hasEmailMagicLink ? 'eml' : undefined;\n const userType = state.formState.passwordState.type;\n\n const secondaryAuth = useSecondaryAuthenticate(secondaryType, { dispatch });\n\n return (\n <Column gap={2}>\n {(() => {\n switch (userType) {\n case 'new':\n return (\n <Column gap={6}>\n {secondaryAuth ? (\n <TextColumn\n header={t({ id: 'password.createAccount.title', message: 'Create an account' })}\n body={t({\n id: 'createAccount.title',\n message: 'Choose how you would like to create your account.',\n })}\n />\n ) : (\n <TextColumn\n header={t({ id: 'password.setPassword.title', message: 'Set a password' })}\n body={t({\n id: 'password.createAccount.content',\n message: 'Finish creating your account by setting a password.',\n })}\n />\n )}\n\n {secondaryAuth && (\n <Button variant=\"primary\" onClick={secondaryAuth.handle} loading={secondaryAuth.isSubmitting}>\n {secondaryAuth.buttonText}\n </Button>\n )}\n\n {secondaryAuth && <Divider />}\n\n <PasswordNewUser />\n </Column>\n );\n\n case 'password':\n return (\n <Column gap={6}>\n <Typography variant=\"header\">{t({ id: 'password.login.title', message: 'Log in' })}</Typography>\n\n <PasswordAuthenticate />\n\n {secondaryAuth && <Divider />}\n\n {secondaryAuth && (\n <Button variant=\"outline\" onClick={secondaryAuth.handle} loading={secondaryAuth.isSubmitting}>\n {secondaryAuth.buttonText}\n </Button>\n )}\n </Column>\n );\n\n case 'passwordless':\n return <PasswordlessAuthenticate secondaryType={secondaryType} />;\n }\n })()}\n\n <Button variant=\"ghost\" onClick={() => dispatch({ type: 'transition', screen: AppScreens.Main })}>\n {t({ id: 'button.goBack', message: 'Go back' })}\n </Button>\n </Column>\n );\n};\n\nfunction useSecondaryAuthenticate(\n secondaryType: 'eml' | 'otp' | undefined,\n {\n dispatch,\n }: {\n dispatch: Dispatch<Action>;\n },\n) {\n const { t } = useLingui();\n const { sendLink, sendCode, isSubmitting } = usePasswordlessAuthenticate();\n\n if (secondaryType == null) {\n return undefined;\n }\n\n const buttonText =\n secondaryType === 'eml'\n ? t({\n id: 'button.emailMagicLink',\n message: 'Email me a login link',\n })\n : t({\n id: 'button.emailOTP',\n message: 'Email me a login code',\n });\n\n const handle =\n secondaryType === 'eml'\n ? async () => {\n await sendLink();\n dispatch({ type: 'transition', screen: AppScreens.EmailConfirmation });\n }\n : async () => {\n await sendCode();\n dispatch({ type: 'transition', screen: AppScreens.OTPAuthenticate });\n };\n\n return {\n buttonText,\n handle,\n isSubmitting,\n };\n}\n"],"names":["PasswordCreateAuthenticate","useLingui","emailMagicLinksOptions","otpOptions","products","useConfig","state","dispatch","useGlobalReducer","otpMethods","methods","hasEmailMagicLink","hasProduct","hasOTPEmail","includes","OTPMethods","Email","secondaryType","undefined","userType","formState","passwordState","type","secondaryAuth","useSecondaryAuthenticate","React","Column","gap","TextColumn","header","body","Button","variant","onClick","handle","loading","isSubmitting","buttonText","Divider","PasswordNewUser","Typography","PasswordAuthenticate","PasswordlessAuthenticate","screen","AppScreens","Main","sendLink","sendCode","usePasswordlessAuthenticate","EmailConfirmation","OTPAuthenticate"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import React__default, { useState } from 'react';
|
|
|
2
2
|
import { EmailConfirmation } from './EmailConfirmation.mjs';
|
|
3
3
|
import { OTPAuthenticate } from './OTPAuthenticate.mjs';
|
|
4
4
|
import Divider from '../../../components/molecules/Divider.mjs';
|
|
5
|
-
import { convertPasswordResetOptions
|
|
5
|
+
import { convertPasswordResetOptions } from '../../../../utils/index.mjs';
|
|
6
6
|
import { useStytch, useConfig, useGlobalReducer, useEventCallback, useErrorCallback, AppScreens } from '../../GlobalContextProvider.mjs';
|
|
7
7
|
import { useMountEffect } from '../../../hooks/useMountEffect.mjs';
|
|
8
8
|
import Button from '../../../components/atoms/Button.mjs';
|
|
@@ -10,8 +10,8 @@ import ErrorText from '../../../components/molecules/ErrorText.mjs';
|
|
|
10
10
|
import { getTranslatedError } from '../../../../utils/getTranslatedError.mjs';
|
|
11
11
|
import { useLingui } from '../../../../../../../node_modules/@lingui/react/dist/index.mjs';
|
|
12
12
|
import Column from '../../../components/atoms/Column.mjs';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { usePasswordlessAuthenticate } from './usePasswordlessAuthenticate.mjs';
|
|
14
|
+
import { StytchEventType } from '../../../../../../core/src/public/ui.mjs';
|
|
15
15
|
|
|
16
16
|
const PasswordlessAuthenticate = ({ secondaryType })=>{
|
|
17
17
|
const { i18n: $__i18n, _: $__ } = useLingui();
|
|
@@ -68,8 +68,7 @@ const PasswordlessAuthenticate = ({ secondaryType })=>{
|
|
|
68
68
|
}
|
|
69
69
|
return /*#__PURE__*/ React__default.createElement(React__default.Fragment, null, secondaryType === 'eml' ? /*#__PURE__*/ React__default.createElement(EmailConfirmation, {
|
|
70
70
|
showGoBack: false
|
|
71
|
-
})
|
|
72
|
-
: /*#__PURE__*/ React__default.createElement(OTPAuthenticate, {
|
|
71
|
+
}) : /*#__PURE__*/ React__default.createElement(OTPAuthenticate, {
|
|
73
72
|
hideBackButton: true
|
|
74
73
|
}), /*#__PURE__*/ React__default.createElement(Divider, null), /*#__PURE__*/ React__default.createElement(Column, {
|
|
75
74
|
gap: 2
|
|
@@ -81,68 +80,6 @@ const PasswordlessAuthenticate = ({ secondaryType })=>{
|
|
|
81
80
|
message: "Create a password instead"
|
|
82
81
|
})), errorMessage && /*#__PURE__*/ React__default.createElement(ErrorText, null, errorMessage)));
|
|
83
82
|
};
|
|
84
|
-
function usePasswordlessAuthenticate() {
|
|
85
|
-
const stytchClient = useStytch();
|
|
86
|
-
const { emailMagicLinksOptions, otpOptions } = useConfig();
|
|
87
|
-
const [state, dispatch] = useGlobalReducer();
|
|
88
|
-
const onEvent = useEventCallback();
|
|
89
|
-
const onError = useErrorCallback();
|
|
90
|
-
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
91
|
-
const email = state.formState.passwordState.email;
|
|
92
|
-
const sendLink = async ()=>{
|
|
93
|
-
setIsSubmitting(true);
|
|
94
|
-
try {
|
|
95
|
-
const data = await stytchClient.magicLinks.email.loginOrCreate(email, convertMagicLinkOptions(emailMagicLinksOptions));
|
|
96
|
-
onEvent({
|
|
97
|
-
type: StytchEventType.MagicLinkLoginOrCreateEvent,
|
|
98
|
-
data: {
|
|
99
|
-
...data,
|
|
100
|
-
email
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
dispatch({
|
|
104
|
-
type: 'set_magic_link_email',
|
|
105
|
-
email: email
|
|
106
|
-
});
|
|
107
|
-
} catch (e) {
|
|
108
|
-
onError(e);
|
|
109
|
-
throw e;
|
|
110
|
-
} finally{
|
|
111
|
-
setIsSubmitting(false);
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
const sendCode = async ()=>{
|
|
115
|
-
setIsSubmitting(true);
|
|
116
|
-
try {
|
|
117
|
-
const data = await stytchClient.otps.email.loginOrCreate(email, {
|
|
118
|
-
expiration_minutes: otpOptions?.expirationMinutes ?? DEFAULT_OTP_EXPIRATION_MINUTES,
|
|
119
|
-
locale: otpOptions?.locale
|
|
120
|
-
});
|
|
121
|
-
onEvent({
|
|
122
|
-
type: StytchEventType.OTPsLoginOrCreateEvent,
|
|
123
|
-
data
|
|
124
|
-
});
|
|
125
|
-
dispatch({
|
|
126
|
-
type: 'update_otp_state',
|
|
127
|
-
otpState: {
|
|
128
|
-
type: OTPMethods.Email,
|
|
129
|
-
methodId: data.method_id,
|
|
130
|
-
otpDestination: email
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
} catch (e) {
|
|
134
|
-
onError(e);
|
|
135
|
-
throw e;
|
|
136
|
-
} finally{
|
|
137
|
-
setIsSubmitting(false);
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
return {
|
|
141
|
-
sendLink,
|
|
142
|
-
sendCode,
|
|
143
|
-
isSubmitting
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
83
|
|
|
147
|
-
export { PasswordlessAuthenticate
|
|
84
|
+
export { PasswordlessAuthenticate };
|
|
148
85
|
//# sourceMappingURL=PasswordlessAuthenticate.mjs.map
|