@openedx/frontend-app-authn 1.0.0-alpha.0 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Main.d.ts +3 -0
- package/dist/Main.js +10 -0
- package/dist/Main.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.js +41 -0
- package/dist/app.js.map +1 -0
- package/dist/app.scss +2 -0
- package/dist/base-container/components/default-layout/LargeLayout.d.ts +2 -0
- package/dist/base-container/components/default-layout/LargeLayout.js +11 -0
- package/dist/base-container/components/default-layout/LargeLayout.js.map +1 -0
- package/dist/base-container/components/default-layout/MediumLayout.d.ts +2 -0
- package/dist/base-container/components/default-layout/MediumLayout.js +11 -0
- package/dist/base-container/components/default-layout/MediumLayout.js.map +1 -0
- package/dist/base-container/components/default-layout/SmallLayout.d.ts +2 -0
- package/dist/base-container/components/default-layout/SmallLayout.js +11 -0
- package/dist/base-container/components/default-layout/SmallLayout.js.map +1 -0
- package/dist/base-container/components/default-layout/index.d.ts +3 -0
- package/{src/base-container/components/default-layout/index.jsx → dist/base-container/components/default-layout/index.js} +1 -0
- package/dist/base-container/components/default-layout/index.js.map +1 -0
- package/dist/base-container/components/default-layout/messages.d.ts +13 -0
- package/dist/base-container/components/default-layout/messages.js +15 -0
- package/dist/base-container/components/default-layout/messages.js.map +1 -0
- package/dist/base-container/components/image-layout/ExtraSmallLayout.d.ts +2 -0
- package/dist/base-container/components/image-layout/ExtraSmallLayout.js +10 -0
- package/dist/base-container/components/image-layout/ExtraSmallLayout.js.map +1 -0
- package/dist/base-container/components/image-layout/LargeLayout.d.ts +2 -0
- package/dist/base-container/components/image-layout/LargeLayout.js +11 -0
- package/dist/base-container/components/image-layout/LargeLayout.js.map +1 -0
- package/dist/base-container/components/image-layout/MediumLayout.d.ts +2 -0
- package/dist/base-container/components/image-layout/MediumLayout.js +11 -0
- package/dist/base-container/components/image-layout/MediumLayout.js.map +1 -0
- package/dist/base-container/components/image-layout/SmallLayout.d.ts +2 -0
- package/dist/base-container/components/image-layout/SmallLayout.js +10 -0
- package/dist/base-container/components/image-layout/SmallLayout.js.map +1 -0
- package/dist/base-container/components/image-layout/index.d.ts +4 -0
- package/{src/base-container/components/image-layout/index.jsx → dist/base-container/components/image-layout/index.js} +1 -0
- package/dist/base-container/components/image-layout/index.js.map +1 -0
- package/dist/base-container/components/image-layout/messages.d.ts +13 -0
- package/dist/base-container/components/image-layout/messages.js +15 -0
- package/dist/base-container/components/image-layout/messages.js.map +1 -0
- package/dist/base-container/components/welcome-page-layout/LargeLayout.d.ts +10 -0
- package/dist/base-container/components/welcome-page-layout/LargeLayout.js +14 -0
- package/dist/base-container/components/welcome-page-layout/LargeLayout.js.map +1 -0
- package/dist/base-container/components/welcome-page-layout/MediumLayout.d.ts +10 -0
- package/dist/base-container/components/welcome-page-layout/MediumLayout.js +14 -0
- package/dist/base-container/components/welcome-page-layout/MediumLayout.js.map +1 -0
- package/dist/base-container/components/welcome-page-layout/SmallLayout.d.ts +10 -0
- package/dist/base-container/components/welcome-page-layout/SmallLayout.js +14 -0
- package/dist/base-container/components/welcome-page-layout/SmallLayout.js.map +1 -0
- package/dist/base-container/components/welcome-page-layout/index.d.ts +3 -0
- package/{src/base-container/components/welcome-page-layout/index.jsx → dist/base-container/components/welcome-page-layout/index.js} +1 -0
- package/dist/base-container/components/welcome-page-layout/index.js.map +1 -0
- package/dist/base-container/components/welcome-page-layout/messages.d.ts +18 -0
- package/dist/base-container/components/welcome-page-layout/messages.js +20 -0
- package/dist/base-container/components/welcome-page-layout/messages.js.map +1 -0
- package/dist/base-container/index.d.ts +20 -0
- package/dist/base-container/index.js +27 -0
- package/dist/base-container/index.js.map +1 -0
- package/dist/common-components/EmbeddedRegistrationRoute.d.ts +14 -0
- package/dist/common-components/EmbeddedRegistrationRoute.js +22 -0
- package/dist/common-components/EmbeddedRegistrationRoute.js.map +1 -0
- package/dist/common-components/EnterpriseSSO.d.ts +29 -0
- package/dist/common-components/EnterpriseSSO.js +58 -0
- package/dist/common-components/EnterpriseSSO.js.map +1 -0
- package/dist/common-components/FormGroup.d.ts +60 -0
- package/dist/common-components/FormGroup.js +66 -0
- package/dist/common-components/FormGroup.js.map +1 -0
- package/dist/common-components/InstitutionLogistration.d.ts +34 -0
- package/dist/common-components/InstitutionLogistration.js +38 -0
- package/dist/common-components/InstitutionLogistration.js.map +1 -0
- package/dist/common-components/NotFoundPage.d.ts +2 -0
- package/dist/common-components/NotFoundPage.js +5 -0
- package/dist/common-components/NotFoundPage.js.map +1 -0
- package/dist/common-components/PasswordField.d.ts +47 -0
- package/dist/common-components/PasswordField.js +98 -0
- package/dist/common-components/PasswordField.js.map +1 -0
- package/dist/common-components/RedirectLogistration.d.ts +39 -0
- package/dist/common-components/RedirectLogistration.js +72 -0
- package/dist/common-components/RedirectLogistration.js.map +1 -0
- package/dist/common-components/RegisterFaIcons.d.ts +1 -0
- package/dist/common-components/RegisterFaIcons.js +6 -0
- package/dist/common-components/RegisterFaIcons.js.map +1 -0
- package/dist/common-components/SocialAuthProviders.d.ts +23 -0
- package/dist/common-components/SocialAuthProviders.js +43 -0
- package/dist/common-components/SocialAuthProviders.js.map +1 -0
- package/dist/common-components/ThirdPartyAuth.d.ts +42 -0
- package/dist/common-components/ThirdPartyAuth.js +57 -0
- package/dist/common-components/ThirdPartyAuth.js.map +1 -0
- package/dist/common-components/ThirdPartyAuthAlert.d.ts +15 -0
- package/dist/common-components/ThirdPartyAuthAlert.js +32 -0
- package/dist/common-components/ThirdPartyAuthAlert.js.map +1 -0
- package/dist/common-components/UnAuthOnlyRoute.d.ts +14 -0
- package/dist/common-components/UnAuthOnlyRoute.js +32 -0
- package/dist/common-components/UnAuthOnlyRoute.js.map +1 -0
- package/dist/common-components/components/ThirdPartyAuthContext.d.ts +31 -0
- package/dist/common-components/components/ThirdPartyAuthContext.js +84 -0
- package/dist/common-components/components/ThirdPartyAuthContext.js.map +1 -0
- package/dist/common-components/data/api.d.ts +6 -0
- package/dist/common-components/data/api.js +26 -0
- package/dist/common-components/data/api.js.map +1 -0
- package/dist/common-components/data/apiHook.d.ts +9 -0
- package/dist/common-components/data/apiHook.js +14 -0
- package/dist/common-components/data/apiHook.js.map +1 -0
- package/dist/common-components/data/queryKeys.d.ts +4 -0
- package/dist/common-components/data/queryKeys.js +6 -0
- package/dist/common-components/data/queryKeys.js.map +1 -0
- package/dist/common-components/index.d.ts +10 -0
- package/{src/common-components/index.jsx → dist/common-components/index.js} +1 -3
- package/dist/common-components/index.js.map +1 -0
- package/dist/common-components/messages.d.ts +113 -0
- package/dist/common-components/messages.js +126 -0
- package/dist/common-components/messages.js.map +1 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +17 -0
- package/dist/constants.js.map +1 -0
- package/dist/data/constants.d.ts +16 -0
- package/{src → dist}/data/constants.js +4 -17
- package/dist/data/constants.js.map +1 -0
- package/dist/data/countries.d.ts +26 -0
- package/{src/data/countries.ts → dist/data/countries.js} +6 -9
- package/dist/data/countries.js.map +1 -0
- package/dist/data/oneTrust.d.ts +2 -0
- package/dist/data/oneTrust.js +3 -0
- package/dist/data/oneTrust.js.map +1 -0
- package/dist/data/utils/cookies.d.ts +1 -0
- package/dist/data/utils/cookies.js +12 -0
- package/dist/data/utils/cookies.js.map +1 -0
- package/dist/data/utils/dataUtils.d.ts +12 -0
- package/dist/data/utils/dataUtils.js +81 -0
- package/dist/data/utils/dataUtils.js.map +1 -0
- package/dist/data/utils/index.d.ts +2 -0
- package/dist/data/utils/index.js +3 -0
- package/dist/data/utils/index.js.map +1 -0
- package/dist/data/utils/useMobileResponsive.d.ts +7 -0
- package/dist/data/utils/useMobileResponsive.js +22 -0
- package/dist/data/utils/useMobileResponsive.js.map +1 -0
- package/dist/field-renderer/FieldRenderer.d.ts +34 -0
- package/dist/field-renderer/FieldRenderer.js +70 -0
- package/dist/field-renderer/FieldRenderer.js.map +1 -0
- package/dist/field-renderer/index.d.ts +1 -0
- package/{src/field-renderer/index.jsx → dist/field-renderer/index.js} +1 -0
- package/dist/field-renderer/index.js.map +1 -0
- package/dist/forgot-password/ForgotPasswordAlert.d.ts +16 -0
- package/dist/forgot-password/ForgotPasswordAlert.js +66 -0
- package/dist/forgot-password/ForgotPasswordAlert.js.map +1 -0
- package/dist/forgot-password/ForgotPasswordPage.d.ts +2 -0
- package/dist/forgot-password/ForgotPasswordPage.js +92 -0
- package/dist/forgot-password/ForgotPasswordPage.js.map +1 -0
- package/dist/forgot-password/data/api.d.ts +2 -0
- package/dist/forgot-password/data/api.js +25 -0
- package/dist/forgot-password/data/api.js.map +1 -0
- package/dist/forgot-password/data/apiHook.d.ts +16 -0
- package/dist/forgot-password/data/apiHook.js +26 -0
- package/dist/forgot-password/data/apiHook.js.map +1 -0
- package/dist/forgot-password/index.d.ts +1 -0
- package/dist/forgot-password/index.js +2 -0
- package/dist/forgot-password/index.js.map +1 -0
- package/dist/forgot-password/messages.d.ts +123 -0
- package/dist/forgot-password/messages.js +128 -0
- package/dist/forgot-password/messages.js.map +1 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +0 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/login/AccountActivationMessage.d.ts +14 -0
- package/dist/login/AccountActivationMessage.js +49 -0
- package/dist/login/AccountActivationMessage.js.map +1 -0
- package/dist/login/ChangePasswordPrompt.d.ts +18 -0
- package/dist/login/ChangePasswordPrompt.js +51 -0
- package/dist/login/ChangePasswordPrompt.js.map +1 -0
- package/dist/login/LoginFailure.d.ts +25 -0
- package/dist/login/LoginFailure.js +109 -0
- package/dist/login/LoginFailure.js.map +1 -0
- package/dist/login/LoginPage.d.ts +12 -0
- package/dist/login/LoginPage.js +174 -0
- package/dist/login/LoginPage.js.map +1 -0
- package/dist/login/components/LoginContext.d.ts +21 -0
- package/dist/login/components/LoginContext.js +28 -0
- package/dist/login/components/LoginContext.js.map +1 -0
- package/dist/login/data/api.d.ts +2 -0
- package/dist/login/data/api.js +27 -0
- package/dist/login/data/api.js.map +1 -0
- package/dist/login/data/apiHook.d.ts +13 -0
- package/dist/login/data/apiHook.js +57 -0
- package/dist/login/data/apiHook.js.map +1 -0
- package/dist/login/data/constants.d.ts +17 -0
- package/{src → dist}/login/data/constants.js +4 -4
- package/dist/login/data/constants.js.map +1 -0
- package/dist/login/index.d.ts +1 -0
- package/dist/login/index.js +2 -0
- package/dist/login/index.js.map +1 -0
- package/dist/login/messages.d.ts +198 -0
- package/dist/login/messages.js +210 -0
- package/dist/login/messages.js.map +1 -0
- package/dist/logistration/Logistration.d.ts +5 -0
- package/dist/logistration/Logistration.js +80 -0
- package/dist/logistration/Logistration.js.map +1 -0
- package/dist/progressive-profiling/ProgressiveProfiling.d.ts +2 -0
- package/dist/progressive-profiling/ProgressiveProfiling.js +143 -0
- package/dist/progressive-profiling/ProgressiveProfiling.js.map +1 -0
- package/dist/progressive-profiling/ProgressiveProfilingPageModal.d.ts +13 -0
- package/dist/progressive-profiling/ProgressiveProfilingPageModal.js +31 -0
- package/dist/progressive-profiling/ProgressiveProfilingPageModal.js.map +1 -0
- package/dist/progressive-profiling/components/ProgressiveProfilingContext.d.ts +18 -0
- package/dist/progressive-profiling/components/ProgressiveProfilingContext.js +52 -0
- package/dist/progressive-profiling/components/ProgressiveProfilingContext.js.map +1 -0
- package/dist/progressive-profiling/data/api.d.ts +2 -0
- package/dist/progressive-profiling/data/api.js +22 -0
- package/dist/progressive-profiling/data/api.js.map +1 -0
- package/dist/progressive-profiling/data/apiHook.d.ts +10 -0
- package/dist/progressive-profiling/data/apiHook.js +36 -0
- package/dist/progressive-profiling/data/apiHook.js.map +1 -0
- package/dist/progressive-profiling/index.d.ts +2 -0
- package/{src → dist}/progressive-profiling/index.js +1 -3
- package/dist/progressive-profiling/index.js.map +1 -0
- package/dist/progressive-profiling/messages.d.ts +53 -0
- package/dist/progressive-profiling/messages.js +57 -0
- package/dist/progressive-profiling/messages.js.map +1 -0
- package/dist/provides.d.ts +4 -0
- package/dist/provides.js +7 -0
- package/dist/provides.js.map +1 -0
- package/dist/register/RegistrationFields/CountryField/CountryField.d.ts +38 -0
- package/dist/register/RegistrationFields/CountryField/CountryField.js +93 -0
- package/dist/register/RegistrationFields/CountryField/CountryField.js.map +1 -0
- package/dist/register/RegistrationFields/CountryField/validator.d.ts +8 -0
- package/dist/register/RegistrationFields/CountryField/validator.js +29 -0
- package/dist/register/RegistrationFields/CountryField/validator.js.map +1 -0
- package/dist/register/RegistrationFields/EmailField/EmailField.d.ts +30 -0
- package/dist/register/RegistrationFields/EmailField/EmailField.js +88 -0
- package/dist/register/RegistrationFields/EmailField/EmailField.js.map +1 -0
- package/dist/register/RegistrationFields/EmailField/constants.d.ts +3 -0
- package/dist/register/RegistrationFields/EmailField/constants.js +130 -0
- package/dist/register/RegistrationFields/EmailField/constants.js.map +1 -0
- package/dist/register/RegistrationFields/EmailField/validator.d.ts +17 -0
- package/dist/register/RegistrationFields/EmailField/validator.js +107 -0
- package/dist/register/RegistrationFields/EmailField/validator.js.map +1 -0
- package/dist/register/RegistrationFields/HonorCodeField/HonorCode.d.ts +21 -0
- package/dist/register/RegistrationFields/HonorCodeField/HonorCode.js +40 -0
- package/dist/register/RegistrationFields/HonorCodeField/HonorCode.js.map +1 -0
- package/dist/register/RegistrationFields/NameField/NameField.d.ts +29 -0
- package/dist/register/RegistrationFields/NameField/NameField.js +59 -0
- package/dist/register/RegistrationFields/NameField/NameField.js.map +1 -0
- package/dist/register/RegistrationFields/NameField/validator.d.ts +6 -0
- package/dist/register/RegistrationFields/NameField/validator.js +23 -0
- package/dist/register/RegistrationFields/NameField/validator.js.map +1 -0
- package/dist/register/RegistrationFields/TermsOfServiceField/TermsOfService.d.ts +16 -0
- package/dist/register/RegistrationFields/TermsOfServiceField/TermsOfService.js +24 -0
- package/dist/register/RegistrationFields/TermsOfServiceField/TermsOfService.js.map +1 -0
- package/dist/register/RegistrationFields/UsernameField/UsernameField.d.ts +31 -0
- package/dist/register/RegistrationFields/UsernameField/UsernameField.js +119 -0
- package/dist/register/RegistrationFields/UsernameField/UsernameField.js.map +1 -0
- package/dist/register/RegistrationFields/UsernameField/validator.d.ts +4 -0
- package/dist/register/RegistrationFields/UsernameField/validator.js +15 -0
- package/dist/register/RegistrationFields/UsernameField/validator.js.map +1 -0
- package/dist/register/RegistrationFields/index.d.ts +6 -0
- package/{src → dist}/register/RegistrationFields/index.js +1 -0
- package/dist/register/RegistrationFields/index.js.map +1 -0
- package/dist/register/RegistrationPage.d.ts +18 -0
- package/dist/register/RegistrationPage.js +259 -0
- package/dist/register/RegistrationPage.js.map +1 -0
- package/dist/register/components/ConfigurableRegistrationForm.d.ts +37 -0
- package/dist/register/components/ConfigurableRegistrationForm.js +145 -0
- package/dist/register/components/ConfigurableRegistrationForm.js.map +1 -0
- package/dist/register/components/RegisterContext.d.ts +8 -0
- package/dist/register/components/RegisterContext.js +167 -0
- package/dist/register/components/RegisterContext.js.map +1 -0
- package/dist/register/components/RegistrationFailure.d.ts +19 -0
- package/dist/register/components/RegistrationFailure.js +60 -0
- package/dist/register/components/RegistrationFailure.js.map +1 -0
- package/dist/register/data/api.d.ts +9 -0
- package/dist/register/data/api.js +45 -0
- package/dist/register/data/api.js.map +1 -0
- package/dist/register/data/apiHook.d.ts +33 -0
- package/dist/register/data/apiHook.js +66 -0
- package/dist/register/data/apiHook.js.map +1 -0
- package/dist/register/data/constants.d.ts +11 -0
- package/{src → dist}/register/data/constants.js +5 -4
- package/dist/register/data/constants.js.map +1 -0
- package/dist/register/data/utils.d.ts +6 -0
- package/dist/register/data/utils.js +128 -0
- package/dist/register/data/utils.js.map +1 -0
- package/dist/register/index.d.ts +1 -0
- package/dist/register/index.js +2 -0
- package/dist/register/index.js.map +1 -0
- package/dist/register/messages.d.ts +203 -0
- package/dist/register/messages.js +215 -0
- package/dist/register/messages.js.map +1 -0
- package/dist/register/types.d.ts +74 -0
- package/dist/register/types.js +2 -0
- package/dist/register/types.js.map +1 -0
- package/dist/reset-password/ResetPasswordFailure.d.ts +15 -0
- package/dist/reset-password/ResetPasswordFailure.js +44 -0
- package/dist/reset-password/ResetPasswordFailure.js.map +1 -0
- package/dist/reset-password/ResetPasswordPage.d.ts +2 -0
- package/dist/reset-password/ResetPasswordPage.js +182 -0
- package/dist/reset-password/ResetPasswordPage.js.map +1 -0
- package/dist/reset-password/ResetPasswordSuccess.d.ts +2 -0
- package/dist/reset-password/ResetPasswordSuccess.js +10 -0
- package/dist/reset-password/ResetPasswordSuccess.js.map +1 -0
- package/dist/reset-password/data/api.d.ts +4 -0
- package/dist/reset-password/data/api.js +57 -0
- package/dist/reset-password/data/api.js.map +1 -0
- package/dist/reset-password/data/apiHook.d.ts +31 -0
- package/dist/reset-password/data/apiHook.js +74 -0
- package/dist/reset-password/data/apiHook.js.map +1 -0
- package/dist/reset-password/data/constants.d.ts +13 -0
- package/{src → dist}/reset-password/data/constants.js +6 -7
- package/dist/reset-password/data/constants.js.map +1 -0
- package/dist/reset-password/index.d.ts +1 -0
- package/dist/reset-password/index.js +2 -0
- package/dist/reset-password/index.js.map +1 -0
- package/dist/reset-password/messages.d.ts +83 -0
- package/dist/reset-password/messages.js +87 -0
- package/dist/reset-password/messages.js.map +1 -0
- package/dist/routes.d.ts +19 -0
- package/dist/routes.js +76 -0
- package/dist/routes.js.map +1 -0
- package/{src → dist}/sass/_base_component.scss +57 -54
- package/{src → dist}/sass/_progressive_profiling_page.scss +1 -3
- package/{src → dist}/sass/_registration.scss +15 -18
- package/{src → dist}/sass/_style.scss +40 -43
- package/dist/slots/LoginComponentSlot/index.d.ts +12 -0
- package/dist/slots/LoginComponentSlot/index.js +11 -0
- package/dist/slots/LoginComponentSlot/index.js.map +1 -0
- package/package.json +38 -16
- package/src/Main.tsx +0 -23
- package/src/__mocks__/file.js +0 -1
- package/src/__mocks__/svg.js +0 -1
- package/src/app.scss +0 -6
- package/src/app.ts +0 -43
- package/src/base-container/components/default-layout/DefaultLayout.test.jsx +0 -48
- package/src/base-container/components/default-layout/LargeLayout.jsx +0 -42
- package/src/base-container/components/default-layout/MediumLayout.jsx +0 -49
- package/src/base-container/components/default-layout/SmallLayout.jsx +0 -37
- package/src/base-container/components/default-layout/messages.js +0 -16
- package/src/base-container/components/image-layout/ExtraSmallLayout.jsx +0 -31
- package/src/base-container/components/image-layout/LargeLayout.jsx +0 -32
- package/src/base-container/components/image-layout/MediumLayout.jsx +0 -32
- package/src/base-container/components/image-layout/SmallLayout.jsx +0 -31
- package/src/base-container/components/image-layout/messages.js +0 -16
- package/src/base-container/components/welcome-page-layout/LargeLayout.jsx +0 -46
- package/src/base-container/components/welcome-page-layout/MediumLayout.jsx +0 -49
- package/src/base-container/components/welcome-page-layout/SmallLayout.jsx +0 -38
- package/src/base-container/components/welcome-page-layout/messages.js +0 -21
- package/src/base-container/index.jsx +0 -70
- package/src/base-container/tests/BaseContainer.test.jsx +0 -44
- package/src/common-components/EmbeddedRegistrationRoute.jsx +0 -26
- package/src/common-components/EnterpriseSSO.jsx +0 -110
- package/src/common-components/FormGroup.jsx +0 -106
- package/src/common-components/InstitutionLogistration.jsx +0 -102
- package/src/common-components/NotFoundPage.jsx +0 -15
- package/src/common-components/PasswordField.jsx +0 -175
- package/src/common-components/RedirectLogistration.jsx +0 -94
- package/src/common-components/RegisterFaIcons.jsx +0 -8
- package/src/common-components/SocialAuthProviders.jsx +0 -75
- package/src/common-components/ThirdPartyAuth.jsx +0 -123
- package/src/common-components/ThirdPartyAuthAlert.jsx +0 -49
- package/src/common-components/UnAuthOnlyRoute.jsx +0 -41
- package/src/common-components/data/actions.js +0 -27
- package/src/common-components/data/reducers.js +0 -63
- package/src/common-components/data/sagas.js +0 -32
- package/src/common-components/data/selectors.js +0 -28
- package/src/common-components/data/service.js +0 -23
- package/src/common-components/data/tests/reducer.test.js +0 -82
- package/src/common-components/data/tests/sagas.test.js +0 -71
- package/src/common-components/messages.jsx +0 -127
- package/src/common-components/tests/EmbeddedRegistrationRoute.test.jsx +0 -76
- package/src/common-components/tests/FormField.test.jsx +0 -289
- package/src/common-components/tests/SocialAuthProviders.test.jsx +0 -75
- package/src/common-components/tests/ThirdPartyAuthAlert.test.jsx +0 -39
- package/src/common-components/tests/UnAuthOnlyRoute.test.jsx +0 -73
- package/src/common-components/tests/__snapshots__/SocialAuthProviders.test.jsx.snap +0 -156
- package/src/common-components/tests/__snapshots__/ThirdPartyAuthAlert.test.jsx.snap +0 -53
- package/src/constants.ts +0 -1
- package/src/data/configureStore.js +0 -33
- package/src/data/oneTrust.js +0 -3
- package/src/data/reducers.js +0 -36
- package/src/data/sagas.js +0 -19
- package/src/data/tests/cookies.test.js +0 -42
- package/src/data/tests/dataUtils.test.js +0 -19
- package/src/data/tests/reduxUtils.test.js +0 -14
- package/src/data/utils/cookies.js +0 -12
- package/src/data/utils/dataUtils.js +0 -81
- package/src/data/utils/index.js +0 -11
- package/src/data/utils/reduxUtils.js +0 -34
- package/src/data/utils/useMobileResponsive.js +0 -24
- package/src/field-renderer/FieldRenderer.jsx +0 -156
- package/src/field-renderer/tests/FieldRenderer.test.jsx +0 -201
- package/src/forgot-password/ForgotPasswordAlert.jsx +0 -97
- package/src/forgot-password/ForgotPasswordPage.jsx +0 -193
- package/src/forgot-password/data/actions.js +0 -32
- package/src/forgot-password/data/reducers.js +0 -58
- package/src/forgot-password/data/sagas.js +0 -35
- package/src/forgot-password/data/selectors.js +0 -10
- package/src/forgot-password/data/service.js +0 -21
- package/src/forgot-password/data/tests/reducers.test.js +0 -34
- package/src/forgot-password/data/tests/sagas.test.js +0 -67
- package/src/forgot-password/index.js +0 -5
- package/src/forgot-password/messages.js +0 -128
- package/src/forgot-password/tests/ForgotPasswordPage.test.jsx +0 -269
- package/src/i18n/index.js +0 -25
- package/src/login/AccountActivationMessage.jsx +0 -78
- package/src/login/ChangePasswordPrompt.jsx +0 -91
- package/src/login/LoginFailure.jsx +0 -231
- package/src/login/LoginPage.jsx +0 -368
- package/src/login/data/actions.js +0 -39
- package/src/login/data/reducers.js +0 -76
- package/src/login/data/sagas.js +0 -45
- package/src/login/data/service.js +0 -24
- package/src/login/data/tests/reducers.test.js +0 -155
- package/src/login/data/tests/sagas.test.js +0 -110
- package/src/login/index.js +0 -5
- package/src/login/messages.jsx +0 -211
- package/src/login/tests/AccountActivationMessage.test.jsx +0 -122
- package/src/login/tests/ChangePasswordPrompt.test.jsx +0 -75
- package/src/login/tests/LoginFailure.test.jsx +0 -323
- package/src/login/tests/LoginPage.test.jsx +0 -839
- package/src/logistration/Logistration.jsx +0 -189
- package/src/logistration/Logistration.test.jsx +0 -275
- package/src/progressive-profiling/ProgressiveProfiling.jsx +0 -313
- package/src/progressive-profiling/ProgressiveProfilingPageModal.jsx +0 -56
- package/src/progressive-profiling/data/actions.js +0 -22
- package/src/progressive-profiling/data/reducers.js +0 -38
- package/src/progressive-profiling/data/sagas.js +0 -24
- package/src/progressive-profiling/data/selectors.js +0 -14
- package/src/progressive-profiling/data/service.js +0 -17
- package/src/progressive-profiling/messages.jsx +0 -57
- package/src/progressive-profiling/tests/ProgressiveProfiling.test.jsx +0 -322
- package/src/register/RegistrationFields/CountryField/CountryField.jsx +0 -164
- package/src/register/RegistrationFields/CountryField/CountryField.test.jsx +0 -204
- package/src/register/RegistrationFields/CountryField/validator.js +0 -32
- package/src/register/RegistrationFields/EmailField/EmailField.jsx +0 -140
- package/src/register/RegistrationFields/EmailField/EmailField.test.jsx +0 -236
- package/src/register/RegistrationFields/EmailField/constants.js +0 -131
- package/src/register/RegistrationFields/EmailField/validator.js +0 -126
- package/src/register/RegistrationFields/EmailField/validator.test.js +0 -39
- package/src/register/RegistrationFields/HonorCodeField/HonorCode.jsx +0 -104
- package/src/register/RegistrationFields/HonorCodeField/HonorCode.test.jsx +0 -70
- package/src/register/RegistrationFields/NameField/NameField.jsx +0 -68
- package/src/register/RegistrationFields/NameField/NameField.test.jsx +0 -146
- package/src/register/RegistrationFields/NameField/validator.js +0 -22
- package/src/register/RegistrationFields/TermsOfServiceField/TermsOfService.jsx +0 -58
- package/src/register/RegistrationFields/TermsOfServiceField/TermsOfService.test.jsx +0 -55
- package/src/register/RegistrationFields/UsernameField/UsernameField.jsx +0 -162
- package/src/register/RegistrationFields/UsernameField/UsernameField.test.jsx +0 -319
- package/src/register/RegistrationFields/UsernameField/validator.js +0 -16
- package/src/register/RegistrationPage.jsx +0 -428
- package/src/register/RegistrationPage.test.jsx +0 -854
- package/src/register/components/ConfigurableRegistrationForm.jsx +0 -244
- package/src/register/components/RegistrationFailure.jsx +0 -80
- package/src/register/components/tests/ConfigurableRegistrationForm.test.jsx +0 -401
- package/src/register/components/tests/RegistrationFailure.test.jsx +0 -212
- package/src/register/components/tests/ThirdPartyAuth.test.jsx +0 -439
- package/src/register/data/actions.js +0 -85
- package/src/register/data/reducers.js +0 -140
- package/src/register/data/sagas.js +0 -58
- package/src/register/data/selectors.js +0 -34
- package/src/register/data/service.js +0 -45
- package/src/register/data/tests/reducers.test.js +0 -277
- package/src/register/data/tests/sagas.test.js +0 -239
- package/src/register/data/tests/utils.test.js +0 -98
- package/src/register/data/utils.js +0 -153
- package/src/register/index.js +0 -4
- package/src/register/messages.jsx +0 -206
- package/src/reset-password/ResetPasswordFailure.jsx +0 -55
- package/src/reset-password/ResetPasswordPage.jsx +0 -224
- package/src/reset-password/ResetPasswordSuccess.jsx +0 -19
- package/src/reset-password/data/actions.js +0 -50
- package/src/reset-password/data/reducers.js +0 -44
- package/src/reset-password/data/sagas.js +0 -67
- package/src/reset-password/data/selectors.js +0 -10
- package/src/reset-password/data/service.js +0 -61
- package/src/reset-password/data/tests/sagas.test.js +0 -185
- package/src/reset-password/index.js +0 -5
- package/src/reset-password/messages.js +0 -88
- package/src/reset-password/tests/ResetPasswordPage.test.jsx +0 -241
- package/src/routes.jsx +0 -79
- package/src/setupTest.js +0 -68
- /package/{src → dist}/base-container/components/image-layout/index.scss +0 -0
- /package/{src → dist}/sass/_forgot_password.scss +0 -0
- /package/{src → dist}/sass/_login_page.scss +0 -0
- /package/{src → dist}/sass/_reset_password.scss +0 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as NameField } from "./NameField/NameField";
|
|
2
|
+
export { default as EmailField } from "./EmailField/EmailField";
|
|
3
|
+
export { default as UsernameField } from "./UsernameField/UsernameField";
|
|
4
|
+
export { default as CountryField } from "./CountryField/CountryField";
|
|
5
|
+
export { default as HonorCode } from "./HonorCodeField/HonorCode";
|
|
6
|
+
export { default as TermsOfService } from "./TermsOfServiceField/TermsOfService";
|
|
@@ -4,3 +4,4 @@ export { default as UsernameField } from './UsernameField/UsernameField';
|
|
|
4
4
|
export { default as CountryField } from './CountryField/CountryField';
|
|
5
5
|
export { default as HonorCode } from './HonorCodeField/HonorCode';
|
|
6
6
|
export { default as TermsOfService } from './TermsOfServiceField/TermsOfService';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/register/RegistrationFields/index.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sCAAsC,CAAC","sourcesContent":["export { default as NameField } from './NameField/NameField';\nexport { default as EmailField } from './EmailField/EmailField';\nexport { default as UsernameField } from './UsernameField/UsernameField';\nexport { default as CountryField } from './CountryField/CountryField';\nexport { default as HonorCode } from './HonorCodeField/HonorCode';\nexport { default as TermsOfService } from './TermsOfServiceField/TermsOfService';\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default RegistrationPage;
|
|
2
|
+
/**
|
|
3
|
+
* Inner Registration Page component that uses the context
|
|
4
|
+
*/
|
|
5
|
+
declare function RegistrationPage(props: any): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
declare namespace RegistrationPage {
|
|
7
|
+
namespace propTypes {
|
|
8
|
+
let institutionLogin: PropTypes.Requireable<boolean>;
|
|
9
|
+
let handleInstitutionLogin: PropTypes.Requireable<(...args: any[]) => any>;
|
|
10
|
+
}
|
|
11
|
+
namespace defaultProps {
|
|
12
|
+
let handleInstitutionLogin_1: null;
|
|
13
|
+
export { handleInstitutionLogin_1 as handleInstitutionLogin };
|
|
14
|
+
let institutionLogin_1: boolean;
|
|
15
|
+
export { institutionLogin_1 as institutionLogin };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
import PropTypes from 'prop-types';
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
12
|
+
import { fetchAuthenticatedUser, hydrateAuthenticatedUser, useAppConfig, getSiteConfig, sendPageEvent, sendTrackEvent, useIntl, } from '@openedx/frontend-base';
|
|
13
|
+
import { Form, Spinner, StatefulButton } from '@openedx/paragon';
|
|
14
|
+
import classNames from 'classnames';
|
|
15
|
+
import PropTypes from 'prop-types';
|
|
16
|
+
import { Helmet } from 'react-helmet';
|
|
17
|
+
import Skeleton from 'react-loading-skeleton';
|
|
18
|
+
import ConfigurableRegistrationForm from './components/ConfigurableRegistrationForm';
|
|
19
|
+
import { useRegisterContext } from './components/RegisterContext';
|
|
20
|
+
import RegistrationFailure from './components/RegistrationFailure';
|
|
21
|
+
import { useFieldValidations, useRegistration } from './data/apiHook';
|
|
22
|
+
import { FORM_SUBMISSION_ERROR, TPA_AUTHENTICATION_FAILURE, } from './data/constants';
|
|
23
|
+
import { isFormValid, prepareRegistrationPayload, } from './data/utils';
|
|
24
|
+
import messages from './messages';
|
|
25
|
+
import { EmailField, NameField, UsernameField } from './RegistrationFields';
|
|
26
|
+
import { InstitutionLogistration, PasswordField, RedirectLogistration, ThirdPartyAuthAlert, } from '../common-components';
|
|
27
|
+
import { useThirdPartyAuthContext } from '../common-components/components/ThirdPartyAuthContext';
|
|
28
|
+
import { useThirdPartyAuthHook } from '../common-components/data/apiHook';
|
|
29
|
+
import EnterpriseSSO from '../common-components/EnterpriseSSO';
|
|
30
|
+
import ThirdPartyAuth from '../common-components/ThirdPartyAuth';
|
|
31
|
+
import { registerPath } from '../constants';
|
|
32
|
+
import { COMPLETE_STATE, DEFAULT_STATE, PENDING_STATE } from '../data/constants';
|
|
33
|
+
import { getAllPossibleQueryParams, getTpaHint, getTpaProvider, isHostAvailableInQueryParams, setCookie, } from '../data/utils';
|
|
34
|
+
/**
|
|
35
|
+
* Inner Registration Page component that uses the context
|
|
36
|
+
*/
|
|
37
|
+
const RegistrationPage = (props) => {
|
|
38
|
+
var _a;
|
|
39
|
+
const { formatMessage } = useIntl();
|
|
40
|
+
const { fieldDescriptions, optionalFields, thirdPartyAuthApiStatus, thirdPartyAuthContext, setThirdPartyAuthContextBegin, setThirdPartyAuthContextSuccess, setThirdPartyAuthContextFailure, } = useThirdPartyAuthContext();
|
|
41
|
+
const { autoSubmitRegForm, currentProvider, finishAuthUrl, pipelineUserDetails, providers, secondaryProviders, errorMessage: thirdPartyAuthErrorMessage, } = thirdPartyAuthContext;
|
|
42
|
+
const { clearRegistrationBackendError, registrationFormData, registrationResult, registrationError, setEmailSuggestionContext, updateRegistrationFormData, setRegistrationError, setRegistrationResult, setValidationsSuccess, setValidationsFailure, validationApiRateLimited, backendValidations, setBackendCountryCode, } = useRegisterContext();
|
|
43
|
+
const fieldValidationsMutation = useFieldValidations({
|
|
44
|
+
onSuccess: (data) => { setValidationsSuccess(data); },
|
|
45
|
+
onError: () => { setValidationsFailure(); },
|
|
46
|
+
});
|
|
47
|
+
const registrationEmbedded = isHostAvailableInQueryParams();
|
|
48
|
+
const platformName = getSiteConfig().siteName;
|
|
49
|
+
const { handleInstitutionLogin, institutionLogin, } = props;
|
|
50
|
+
const { ENABLE_AUTO_GENERATED_USERNAME, ENABLE_PROGRESSIVE_PROFILING_ON_AUTHN, MARKETING_EMAILS_OPT_IN, USER_RETENTION_COOKIE_NAME, SESSION_COOKIE_DOMAIN, } = useAppConfig();
|
|
51
|
+
const flags = {
|
|
52
|
+
showMarketingEmailOptInCheckbox: MARKETING_EMAILS_OPT_IN,
|
|
53
|
+
autoGeneratedUsernameEnabled: ENABLE_AUTO_GENERATED_USERNAME,
|
|
54
|
+
};
|
|
55
|
+
const backendRegistrationError = registrationError;
|
|
56
|
+
const registrationMutation = useRegistration({
|
|
57
|
+
onSuccess: (data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
58
|
+
const redirectUrl = localNextPath || data.redirectUrl || '';
|
|
59
|
+
if (redirectUrl.startsWith('/')) {
|
|
60
|
+
yield fetchAuthenticatedUser({ forceRefresh: true });
|
|
61
|
+
// Hydrate in the background — publishes AUTHENTICATED_USER_CHANGED after
|
|
62
|
+
// SPA navigation, so the header picks up the full user profile (avatar, etc.)
|
|
63
|
+
hydrateAuthenticatedUser();
|
|
64
|
+
}
|
|
65
|
+
setRegistrationResult(Object.assign(Object.assign({}, data), { redirectUrl }));
|
|
66
|
+
setRegistrationError({});
|
|
67
|
+
}),
|
|
68
|
+
onError: (errorData) => {
|
|
69
|
+
setRegistrationError(errorData);
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
const [userPipelineDataLoaded, setUserPipelineDataLoaded] = useState(false);
|
|
73
|
+
const registrationErrorCode = (registrationError === null || registrationError === void 0 ? void 0 : registrationError.errorCode) || (backendRegistrationError === null || backendRegistrationError === void 0 ? void 0 : backendRegistrationError.errorCode);
|
|
74
|
+
const submitState = registrationMutation.isPending ? PENDING_STATE : DEFAULT_STATE;
|
|
75
|
+
const queryParams = useMemo(() => getAllPossibleQueryParams(), []);
|
|
76
|
+
const localNextPath = ((_a = queryParams.next) === null || _a === void 0 ? void 0 : _a.startsWith('/')) ? queryParams.next : null;
|
|
77
|
+
const tpaHint = useMemo(() => getTpaHint(), []);
|
|
78
|
+
// Initialize form state from local backedUpFormData
|
|
79
|
+
const backedUpFormData = registrationFormData;
|
|
80
|
+
const [formFields, setFormFields] = useState(Object.assign({}, backedUpFormData.formFields));
|
|
81
|
+
const [configurableFormFields, setConfigurableFormFields] = useState(Object.assign({}, backedUpFormData.configurableFormFields));
|
|
82
|
+
const [errors, setErrors] = useState(Object.assign({}, backedUpFormData.errors));
|
|
83
|
+
const [errorCode, setErrorCode] = useState({ type: '', count: 0 });
|
|
84
|
+
const [formStartTime, setFormStartTime] = useState(null);
|
|
85
|
+
// temporary error state for embedded experience because we don't want to show errors on blur
|
|
86
|
+
const [temporaryErrors, setTemporaryErrors] = useState(Object.assign({}, backedUpFormData.errors));
|
|
87
|
+
const { cta, host } = queryParams;
|
|
88
|
+
const buttonLabel = cta
|
|
89
|
+
? formatMessage(messages['create.account.cta.button'], { label: cta })
|
|
90
|
+
: formatMessage(messages['create.account.for.free.button']);
|
|
91
|
+
/**
|
|
92
|
+
* Set the userPipelineDetails data in formFields for only first time
|
|
93
|
+
*/
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (!userPipelineDataLoaded && thirdPartyAuthApiStatus === COMPLETE_STATE) {
|
|
96
|
+
if (thirdPartyAuthErrorMessage) {
|
|
97
|
+
setErrorCode(prevState => ({ type: TPA_AUTHENTICATION_FAILURE, count: prevState.count + 1 }));
|
|
98
|
+
}
|
|
99
|
+
if (pipelineUserDetails && Object.keys(pipelineUserDetails).length !== 0) {
|
|
100
|
+
const { name = '', username = '', email = '' } = pipelineUserDetails;
|
|
101
|
+
setFormFields(prevState => (Object.assign(Object.assign({}, prevState), { name, username, email })));
|
|
102
|
+
setUserPipelineDataLoaded(true);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, [
|
|
106
|
+
thirdPartyAuthApiStatus,
|
|
107
|
+
thirdPartyAuthErrorMessage,
|
|
108
|
+
pipelineUserDetails,
|
|
109
|
+
userPipelineDataLoaded,
|
|
110
|
+
]);
|
|
111
|
+
const params = Object.assign(Object.assign({}, queryParams), { is_register_page: true });
|
|
112
|
+
if (tpaHint) {
|
|
113
|
+
params.tpa_hint = tpaHint;
|
|
114
|
+
}
|
|
115
|
+
const { data, isSuccess, error } = useThirdPartyAuthHook(registerPath, params);
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (!formStartTime) {
|
|
118
|
+
sendPageEvent('login_and_registration', 'register');
|
|
119
|
+
setThirdPartyAuthContextBegin();
|
|
120
|
+
setFormStartTime(Date.now());
|
|
121
|
+
}
|
|
122
|
+
if (formStartTime) {
|
|
123
|
+
if (isSuccess && data) {
|
|
124
|
+
setThirdPartyAuthContextSuccess(data.fieldDescriptions, data.optionalFields, data.thirdPartyAuthContext);
|
|
125
|
+
setBackendCountryCode(data.thirdPartyAuthContext.countryCode);
|
|
126
|
+
}
|
|
127
|
+
if (error) {
|
|
128
|
+
setThirdPartyAuthContextFailure();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}, [formStartTime, isSuccess, data, error,
|
|
132
|
+
setThirdPartyAuthContextBegin, setThirdPartyAuthContextSuccess,
|
|
133
|
+
setBackendCountryCode, setThirdPartyAuthContextFailure]);
|
|
134
|
+
// Handle backend validation errors from context
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
if (backendValidations) {
|
|
137
|
+
if (registrationEmbedded) {
|
|
138
|
+
setTemporaryErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), backendValidations)));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
setErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), backendValidations)));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}, [backendValidations, registrationEmbedded]);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
if (registrationErrorCode) {
|
|
147
|
+
setErrorCode(prevState => ({ type: registrationErrorCode, count: prevState.count + 1 }));
|
|
148
|
+
}
|
|
149
|
+
}, [registrationErrorCode]);
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
if (registrationResult.success) {
|
|
152
|
+
// This event is used by GTM
|
|
153
|
+
sendTrackEvent('edx.bi.user.account.registered.client', {});
|
|
154
|
+
// This is used by the "User Retention Rate Event" on GTM
|
|
155
|
+
setCookie(USER_RETENTION_COOKIE_NAME, true, SESSION_COOKIE_DOMAIN);
|
|
156
|
+
}
|
|
157
|
+
}, [registrationResult, USER_RETENTION_COOKIE_NAME, SESSION_COOKIE_DOMAIN]);
|
|
158
|
+
const handleOnChange = (event) => {
|
|
159
|
+
const { name } = event.target;
|
|
160
|
+
const value = event.target.type === 'checkbox' ? event.target.checked : event.target.value;
|
|
161
|
+
if (backendRegistrationError[name]) {
|
|
162
|
+
clearRegistrationBackendError(name);
|
|
163
|
+
}
|
|
164
|
+
// Clear context registration errors
|
|
165
|
+
if (registrationError.errorCode) {
|
|
166
|
+
setRegistrationError({});
|
|
167
|
+
}
|
|
168
|
+
setErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [name]: '' })));
|
|
169
|
+
// Update local state
|
|
170
|
+
const newFormFields = Object.assign(Object.assign({}, formFields), { [name]: value });
|
|
171
|
+
setFormFields(newFormFields);
|
|
172
|
+
// Save to context for persistence across tab switches
|
|
173
|
+
updateRegistrationFormData({
|
|
174
|
+
formFields: newFormFields,
|
|
175
|
+
errors,
|
|
176
|
+
configurableFormFields,
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
const handleErrorChange = (fieldName, errorMessage) => {
|
|
180
|
+
if (registrationEmbedded) {
|
|
181
|
+
setTemporaryErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [fieldName]: errorMessage })));
|
|
182
|
+
if (errorMessage === '' && errors[fieldName] !== '') {
|
|
183
|
+
setErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [fieldName]: errorMessage })));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
setErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [fieldName]: errorMessage })));
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const registerUser = () => {
|
|
191
|
+
const totalRegistrationTime = (Date.now() - formStartTime) / 1000;
|
|
192
|
+
let payload = Object.assign({}, formFields);
|
|
193
|
+
if (currentProvider) {
|
|
194
|
+
delete payload.password;
|
|
195
|
+
payload.social_auth_provider = currentProvider;
|
|
196
|
+
}
|
|
197
|
+
if (flags.autoGeneratedUsernameEnabled) {
|
|
198
|
+
delete payload.username;
|
|
199
|
+
}
|
|
200
|
+
// Validating form data before submitting
|
|
201
|
+
const { isValid, fieldErrors, emailSuggestion } = isFormValid(payload, registrationEmbedded ? temporaryErrors : errors, configurableFormFields, fieldDescriptions, formatMessage);
|
|
202
|
+
setErrors(Object.assign({}, fieldErrors));
|
|
203
|
+
updateRegistrationFormData({
|
|
204
|
+
formFields,
|
|
205
|
+
errors: fieldErrors,
|
|
206
|
+
configurableFormFields,
|
|
207
|
+
});
|
|
208
|
+
setEmailSuggestionContext(emailSuggestion.suggestion, emailSuggestion.type);
|
|
209
|
+
// returning if not valid
|
|
210
|
+
if (!isValid) {
|
|
211
|
+
setErrorCode(prevState => ({ type: FORM_SUBMISSION_ERROR, count: prevState.count + 1 }));
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Preparing payload for submission
|
|
215
|
+
payload = prepareRegistrationPayload(payload, configurableFormFields, flags.showMarketingEmailOptInCheckbox, totalRegistrationTime, queryParams);
|
|
216
|
+
// making register call with React Query
|
|
217
|
+
registrationMutation.mutate(payload);
|
|
218
|
+
};
|
|
219
|
+
const handleSubmit = (e) => {
|
|
220
|
+
e.preventDefault();
|
|
221
|
+
registerUser();
|
|
222
|
+
};
|
|
223
|
+
useEffect(() => {
|
|
224
|
+
if (autoSubmitRegForm && userPipelineDataLoaded) {
|
|
225
|
+
registerUser();
|
|
226
|
+
}
|
|
227
|
+
}, [autoSubmitRegForm, userPipelineDataLoaded]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
228
|
+
const renderForm = () => {
|
|
229
|
+
if (institutionLogin) {
|
|
230
|
+
return (_jsx(InstitutionLogistration, { secondaryProviders: secondaryProviders, headingTitle: formatMessage(messages['register.institution.login.page.title']) }));
|
|
231
|
+
}
|
|
232
|
+
return (_jsxs(_Fragment, { children: [_jsx(Helmet, { children: _jsx("title", { children: formatMessage(messages['register.page.title'], { siteName: getSiteConfig().siteName }) }) }), _jsx(RedirectLogistration, { host: host, authenticatedUser: registrationResult.authenticatedUser, success: registrationResult.success, redirectUrl: registrationResult.redirectUrl, finishAuthUrl: finishAuthUrl, optionalFields: optionalFields, registrationEmbedded: registrationEmbedded, redirectToProgressiveProfilingPage: ENABLE_PROGRESSIVE_PROFILING_ON_AUTHN && !!Object.keys(optionalFields.fields).length }), autoSubmitRegForm && !errorCode.type ? (_jsx("div", { className: "mw-xs mt-5 text-center", children: _jsx(Spinner, { animation: "border", variant: "primary", id: "tpa-spinner" }) })) : (_jsxs("div", { className: classNames('mw-xs mt-3', { 'w-100 m-auto pt-4 main-content': registrationEmbedded }), children: [_jsx(ThirdPartyAuthAlert, { currentProvider: currentProvider, platformName: platformName, referrer: registerPath }), _jsx(RegistrationFailure, { errorCode: errorCode.type, failureCount: errorCode.count, context: { provider: currentProvider, errorMessage: thirdPartyAuthErrorMessage } }), _jsxs(Form, { id: "registration-form", name: "registration-form", children: [_jsx(NameField, { name: "name", value: formFields.name, shouldFetchUsernameSuggestions: !formFields.username.trim(), handleChange: handleOnChange, handleErrorChange: handleErrorChange, errorMessage: errors.name, helpText: [formatMessage(messages['help.text.name'])], floatingLabel: formatMessage(messages['registration.fullname.label']) }), _jsx(EmailField, { name: "email", value: formFields.email, confirmEmailValue: configurableFormFields === null || configurableFormFields === void 0 ? void 0 : configurableFormFields.confirm_email, handleErrorChange: handleErrorChange, handleChange: handleOnChange, errorMessage: errors.email, helpText: [formatMessage(messages['help.text.email'])], floatingLabel: formatMessage(messages['registration.email.label']) }), !flags.autoGeneratedUsernameEnabled && (_jsx(UsernameField, { name: "username", spellCheck: "false", value: formFields.username, handleChange: handleOnChange, handleErrorChange: handleErrorChange, errorMessage: errors.username, helpText: [formatMessage(messages['help.text.username.1']), formatMessage(messages['help.text.username.2'])], floatingLabel: formatMessage(messages['registration.username.label']) })), !currentProvider && (_jsx(PasswordField, { name: "password", value: formFields.password, handleChange: handleOnChange, handleErrorChange: handleErrorChange, errorMessage: errors.password, floatingLabel: formatMessage(messages['registration.password.label']), clearRegistrationBackendError: clearRegistrationBackendError, validateField: fieldValidationsMutation.mutate, validationApiRateLimited: validationApiRateLimited })), _jsx(ConfigurableRegistrationForm, { email: formFields.email, fieldErrors: errors, formFields: configurableFormFields, setFieldErrors: registrationEmbedded ? setTemporaryErrors : setErrors, setFormFields: setConfigurableFormFields, autoSubmitRegisterForm: autoSubmitRegForm, fieldDescriptions: fieldDescriptions }), _jsx(StatefulButton, { id: "register-user", name: "register-user", type: "submit", variant: "brand", className: "register-button mt-4 mb-4", state: submitState, labels: {
|
|
233
|
+
default: buttonLabel,
|
|
234
|
+
pending: '',
|
|
235
|
+
}, onClick: handleSubmit, onMouseDown: (e) => e.preventDefault() }), !registrationEmbedded && (_jsx(ThirdPartyAuth, { currentProvider: currentProvider, providers: providers, secondaryProviders: secondaryProviders, handleInstitutionLogin: handleInstitutionLogin, thirdPartyAuthApiStatus: thirdPartyAuthApiStatus }))] })] }))] }));
|
|
236
|
+
};
|
|
237
|
+
if (tpaHint) {
|
|
238
|
+
if (thirdPartyAuthApiStatus === PENDING_STATE) {
|
|
239
|
+
return _jsx(Skeleton, { height: 36 });
|
|
240
|
+
}
|
|
241
|
+
const { provider, skipHintedLogin } = getTpaProvider(tpaHint, providers, secondaryProviders);
|
|
242
|
+
if (skipHintedLogin) {
|
|
243
|
+
window.location.href = getSiteConfig().lmsBaseUrl + provider.registerUrl;
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return provider ? _jsx(EnterpriseSSO, { provider: provider }) : renderForm();
|
|
247
|
+
}
|
|
248
|
+
return (renderForm());
|
|
249
|
+
};
|
|
250
|
+
RegistrationPage.propTypes = {
|
|
251
|
+
institutionLogin: PropTypes.bool,
|
|
252
|
+
handleInstitutionLogin: PropTypes.func,
|
|
253
|
+
};
|
|
254
|
+
RegistrationPage.defaultProps = {
|
|
255
|
+
handleInstitutionLogin: null,
|
|
256
|
+
institutionLogin: false,
|
|
257
|
+
};
|
|
258
|
+
export default RegistrationPage;
|
|
259
|
+
//# sourceMappingURL=RegistrationPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistrationPage.js","sourceRoot":"","sources":["../../src/register/RegistrationPage.jsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport {\n fetchAuthenticatedUser,\n hydrateAuthenticatedUser,\n useAppConfig,\n getSiteConfig,\n sendPageEvent, sendTrackEvent,\n useIntl,\n} from '@openedx/frontend-base';\nimport { Form, Spinner, StatefulButton } from '@openedx/paragon';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport { Helmet } from 'react-helmet';\nimport Skeleton from 'react-loading-skeleton';\n\nimport ConfigurableRegistrationForm from './components/ConfigurableRegistrationForm';\nimport { useRegisterContext } from './components/RegisterContext';\nimport RegistrationFailure from './components/RegistrationFailure';\nimport { useFieldValidations, useRegistration } from './data/apiHook';\nimport {\n FORM_SUBMISSION_ERROR,\n TPA_AUTHENTICATION_FAILURE,\n} from './data/constants';\nimport {\n isFormValid, prepareRegistrationPayload,\n} from './data/utils';\nimport messages from './messages';\nimport { EmailField, NameField, UsernameField } from './RegistrationFields';\nimport {\n InstitutionLogistration,\n PasswordField,\n RedirectLogistration,\n ThirdPartyAuthAlert,\n} from '../common-components';\nimport { useThirdPartyAuthContext } from '../common-components/components/ThirdPartyAuthContext';\nimport { useThirdPartyAuthHook } from '../common-components/data/apiHook';\nimport EnterpriseSSO from '../common-components/EnterpriseSSO';\nimport ThirdPartyAuth from '../common-components/ThirdPartyAuth';\nimport { registerPath } from '../constants';\nimport { COMPLETE_STATE, DEFAULT_STATE, PENDING_STATE } from '../data/constants';\nimport {\n getAllPossibleQueryParams, getTpaHint, getTpaProvider, isHostAvailableInQueryParams, setCookie,\n} from '../data/utils';\n\n/**\n * Inner Registration Page component that uses the context\n */\nconst RegistrationPage = (props) => {\n const { formatMessage } = useIntl();\n const {\n fieldDescriptions,\n optionalFields,\n thirdPartyAuthApiStatus,\n thirdPartyAuthContext,\n setThirdPartyAuthContextBegin,\n setThirdPartyAuthContextSuccess,\n setThirdPartyAuthContextFailure,\n } = useThirdPartyAuthContext();\n\n const {\n autoSubmitRegForm,\n currentProvider,\n finishAuthUrl,\n pipelineUserDetails,\n providers,\n secondaryProviders,\n errorMessage: thirdPartyAuthErrorMessage,\n } = thirdPartyAuthContext;\n\n const {\n clearRegistrationBackendError,\n registrationFormData,\n registrationResult,\n registrationError,\n setEmailSuggestionContext,\n updateRegistrationFormData,\n setRegistrationError,\n setRegistrationResult,\n setValidationsSuccess,\n setValidationsFailure,\n validationApiRateLimited,\n backendValidations,\n setBackendCountryCode,\n } = useRegisterContext();\n\n const fieldValidationsMutation = useFieldValidations({\n onSuccess: (data) => { setValidationsSuccess(data); },\n onError: () => { setValidationsFailure(); },\n });\n\n const registrationEmbedded = isHostAvailableInQueryParams();\n const platformName = getSiteConfig().siteName;\n const {\n handleInstitutionLogin,\n institutionLogin,\n } = props;\n const {\n ENABLE_AUTO_GENERATED_USERNAME,\n ENABLE_PROGRESSIVE_PROFILING_ON_AUTHN,\n MARKETING_EMAILS_OPT_IN,\n USER_RETENTION_COOKIE_NAME,\n SESSION_COOKIE_DOMAIN,\n } = useAppConfig();\n const flags = {\n showMarketingEmailOptInCheckbox: MARKETING_EMAILS_OPT_IN,\n autoGeneratedUsernameEnabled: ENABLE_AUTO_GENERATED_USERNAME,\n };\n\n const backendRegistrationError = registrationError;\n const registrationMutation = useRegistration({\n onSuccess: async (data) => {\n const redirectUrl = localNextPath || data.redirectUrl || '';\n if (redirectUrl.startsWith('/')) {\n await fetchAuthenticatedUser({ forceRefresh: true });\n // Hydrate in the background — publishes AUTHENTICATED_USER_CHANGED after\n // SPA navigation, so the header picks up the full user profile (avatar, etc.)\n hydrateAuthenticatedUser();\n }\n setRegistrationResult({ ...data, redirectUrl });\n setRegistrationError({});\n },\n onError: (errorData) => {\n setRegistrationError(errorData);\n },\n });\n\n const [userPipelineDataLoaded, setUserPipelineDataLoaded] = useState(false);\n const registrationErrorCode = registrationError?.errorCode || backendRegistrationError?.errorCode;\n const submitState = registrationMutation.isPending ? PENDING_STATE : DEFAULT_STATE;\n const queryParams = useMemo(() => getAllPossibleQueryParams(), []);\n const localNextPath = queryParams.next?.startsWith('/') ? queryParams.next : null;\n const tpaHint = useMemo(() => getTpaHint(), []);\n // Initialize form state from local backedUpFormData\n const backedUpFormData = registrationFormData;\n const [formFields, setFormFields] = useState({ ...backedUpFormData.formFields });\n const [configurableFormFields, setConfigurableFormFields] = useState({ ...backedUpFormData.configurableFormFields });\n const [errors, setErrors] = useState({ ...backedUpFormData.errors });\n const [errorCode, setErrorCode] = useState({ type: '', count: 0 });\n const [formStartTime, setFormStartTime] = useState(null);\n // temporary error state for embedded experience because we don't want to show errors on blur\n const [temporaryErrors, setTemporaryErrors] = useState({ ...backedUpFormData.errors });\n const { cta, host } = queryParams;\n const buttonLabel = cta\n ? formatMessage(messages['create.account.cta.button'], { label: cta })\n : formatMessage(messages['create.account.for.free.button']);\n\n /**\n * Set the userPipelineDetails data in formFields for only first time\n */\n useEffect(() => {\n if (!userPipelineDataLoaded && thirdPartyAuthApiStatus === COMPLETE_STATE) {\n if (thirdPartyAuthErrorMessage) {\n setErrorCode(prevState => ({ type: TPA_AUTHENTICATION_FAILURE, count: prevState.count + 1 }));\n }\n if (pipelineUserDetails && Object.keys(pipelineUserDetails).length !== 0) {\n const { name = '', username = '', email = '' } = pipelineUserDetails;\n setFormFields(prevState => ({\n ...prevState, name, username, email,\n }));\n setUserPipelineDataLoaded(true);\n }\n }\n }, [\n thirdPartyAuthApiStatus,\n thirdPartyAuthErrorMessage,\n pipelineUserDetails,\n userPipelineDataLoaded,\n ]);\n\n const params = { ...queryParams, is_register_page: true };\n if (tpaHint) {\n params.tpa_hint = tpaHint;\n }\n const { data, isSuccess, error } = useThirdPartyAuthHook(registerPath, params);\n useEffect(() => {\n if (!formStartTime) {\n sendPageEvent('login_and_registration', 'register');\n setThirdPartyAuthContextBegin();\n setFormStartTime(Date.now());\n }\n if (formStartTime) {\n if (isSuccess && data) {\n setThirdPartyAuthContextSuccess(\n data.fieldDescriptions,\n data.optionalFields,\n data.thirdPartyAuthContext,\n );\n setBackendCountryCode(data.thirdPartyAuthContext.countryCode);\n }\n\n if (error) {\n setThirdPartyAuthContextFailure();\n }\n }\n }, [formStartTime, isSuccess, data, error,\n setThirdPartyAuthContextBegin, setThirdPartyAuthContextSuccess,\n setBackendCountryCode, setThirdPartyAuthContextFailure]);\n\n // Handle backend validation errors from context\n useEffect(() => {\n if (backendValidations) {\n if (registrationEmbedded) {\n setTemporaryErrors(prevErrors => ({ ...prevErrors, ...backendValidations }));\n } else {\n setErrors(prevErrors => ({ ...prevErrors, ...backendValidations }));\n }\n }\n }, [backendValidations, registrationEmbedded]);\n\n useEffect(() => {\n if (registrationErrorCode) {\n setErrorCode(prevState => ({ type: registrationErrorCode, count: prevState.count + 1 }));\n }\n }, [registrationErrorCode]);\n\n useEffect(() => {\n if (registrationResult.success) {\n // This event is used by GTM\n sendTrackEvent('edx.bi.user.account.registered.client', {});\n\n // This is used by the \"User Retention Rate Event\" on GTM\n setCookie(USER_RETENTION_COOKIE_NAME, true, SESSION_COOKIE_DOMAIN);\n }\n }, [registrationResult, USER_RETENTION_COOKIE_NAME, SESSION_COOKIE_DOMAIN]);\n\n const handleOnChange = (event) => {\n const { name } = event.target;\n const value = event.target.type === 'checkbox' ? event.target.checked : event.target.value;\n if (backendRegistrationError[name]) {\n clearRegistrationBackendError(name);\n }\n // Clear context registration errors\n if (registrationError.errorCode) {\n setRegistrationError({});\n }\n setErrors(prevErrors => ({ ...prevErrors, [name]: '' }));\n // Update local state\n const newFormFields = { ...formFields, [name]: value };\n setFormFields(newFormFields);\n // Save to context for persistence across tab switches\n updateRegistrationFormData({\n formFields: newFormFields,\n errors,\n configurableFormFields,\n });\n };\n\n const handleErrorChange = (fieldName, errorMessage) => {\n if (registrationEmbedded) {\n setTemporaryErrors(prevErrors => ({\n ...prevErrors,\n [fieldName]: errorMessage,\n }));\n if (errorMessage === '' && errors[fieldName] !== '') {\n setErrors(prevErrors => ({\n ...prevErrors,\n [fieldName]: errorMessage,\n }));\n }\n } else {\n setErrors(prevErrors => ({\n ...prevErrors,\n [fieldName]: errorMessage,\n }));\n }\n };\n\n const registerUser = () => {\n const totalRegistrationTime = (Date.now() - formStartTime) / 1000;\n let payload = { ...formFields };\n\n if (currentProvider) {\n delete payload.password;\n payload.social_auth_provider = currentProvider;\n }\n if (flags.autoGeneratedUsernameEnabled) {\n delete payload.username;\n }\n\n // Validating form data before submitting\n const { isValid, fieldErrors, emailSuggestion } = isFormValid(\n payload,\n registrationEmbedded ? temporaryErrors : errors,\n configurableFormFields,\n fieldDescriptions,\n formatMessage,\n );\n setErrors({ ...fieldErrors });\n updateRegistrationFormData({\n formFields,\n errors: fieldErrors,\n configurableFormFields,\n });\n setEmailSuggestionContext(emailSuggestion.suggestion, emailSuggestion.type);\n\n // returning if not valid\n if (!isValid) {\n setErrorCode(prevState => ({ type: FORM_SUBMISSION_ERROR, count: prevState.count + 1 }));\n return;\n }\n\n // Preparing payload for submission\n payload = prepareRegistrationPayload(\n payload,\n configurableFormFields,\n flags.showMarketingEmailOptInCheckbox,\n totalRegistrationTime,\n queryParams,\n );\n // making register call with React Query\n registrationMutation.mutate(payload);\n };\n\n const handleSubmit = (e) => {\n e.preventDefault();\n registerUser();\n };\n\n useEffect(() => {\n if (autoSubmitRegForm && userPipelineDataLoaded) {\n registerUser();\n }\n }, [autoSubmitRegForm, userPipelineDataLoaded]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const renderForm = () => {\n if (institutionLogin) {\n return (\n <InstitutionLogistration\n secondaryProviders={secondaryProviders}\n headingTitle={formatMessage(messages['register.institution.login.page.title'])}\n />\n );\n }\n return (\n <>\n <Helmet>\n <title>{formatMessage(messages['register.page.title'], { siteName: getSiteConfig().siteName })}</title>\n </Helmet>\n <RedirectLogistration\n host={host}\n authenticatedUser={registrationResult.authenticatedUser}\n success={registrationResult.success}\n redirectUrl={registrationResult.redirectUrl}\n finishAuthUrl={finishAuthUrl}\n optionalFields={optionalFields}\n registrationEmbedded={registrationEmbedded}\n redirectToProgressiveProfilingPage={\n ENABLE_PROGRESSIVE_PROFILING_ON_AUTHN && !!Object.keys(optionalFields.fields).length\n }\n />\n {autoSubmitRegForm && !errorCode.type ? (\n <div className=\"mw-xs mt-5 text-center\">\n <Spinner animation=\"border\" variant=\"primary\" id=\"tpa-spinner\" />\n </div>\n ) : (\n <div\n className={classNames(\n 'mw-xs mt-3',\n { 'w-100 m-auto pt-4 main-content': registrationEmbedded },\n )}\n >\n <ThirdPartyAuthAlert\n currentProvider={currentProvider}\n platformName={platformName}\n referrer={registerPath}\n />\n <RegistrationFailure\n errorCode={errorCode.type}\n failureCount={errorCode.count}\n context={{ provider: currentProvider, errorMessage: thirdPartyAuthErrorMessage }}\n />\n <Form id=\"registration-form\" name=\"registration-form\">\n <NameField\n name=\"name\"\n value={formFields.name}\n shouldFetchUsernameSuggestions={!formFields.username.trim()}\n handleChange={handleOnChange}\n handleErrorChange={handleErrorChange}\n errorMessage={errors.name}\n helpText={[formatMessage(messages['help.text.name'])]}\n floatingLabel={formatMessage(messages['registration.fullname.label'])}\n />\n <EmailField\n name=\"email\"\n value={formFields.email}\n confirmEmailValue={configurableFormFields?.confirm_email}\n handleErrorChange={handleErrorChange}\n handleChange={handleOnChange}\n errorMessage={errors.email}\n helpText={[formatMessage(messages['help.text.email'])]}\n floatingLabel={formatMessage(messages['registration.email.label'])}\n />\n {!flags.autoGeneratedUsernameEnabled && (\n <UsernameField\n name=\"username\"\n spellCheck=\"false\"\n value={formFields.username}\n handleChange={handleOnChange}\n handleErrorChange={handleErrorChange}\n errorMessage={errors.username}\n helpText={[formatMessage(messages['help.text.username.1']), formatMessage(messages['help.text.username.2'])]}\n floatingLabel={formatMessage(messages['registration.username.label'])}\n />\n )}\n {!currentProvider && (\n <PasswordField\n name=\"password\"\n value={formFields.password}\n handleChange={handleOnChange}\n handleErrorChange={handleErrorChange}\n errorMessage={errors.password}\n floatingLabel={formatMessage(messages['registration.password.label'])}\n clearRegistrationBackendError={clearRegistrationBackendError}\n validateField={fieldValidationsMutation.mutate}\n validationApiRateLimited={validationApiRateLimited}\n />\n )}\n <ConfigurableRegistrationForm\n email={formFields.email}\n fieldErrors={errors}\n formFields={configurableFormFields}\n setFieldErrors={registrationEmbedded ? setTemporaryErrors : setErrors}\n setFormFields={setConfigurableFormFields}\n autoSubmitRegisterForm={autoSubmitRegForm}\n fieldDescriptions={fieldDescriptions}\n />\n <StatefulButton\n id=\"register-user\"\n name=\"register-user\"\n type=\"submit\"\n variant=\"brand\"\n className=\"register-button mt-4 mb-4\"\n state={submitState}\n labels={{\n default: buttonLabel,\n pending: '',\n }}\n onClick={handleSubmit}\n onMouseDown={(e) => e.preventDefault()}\n />\n {!registrationEmbedded && (\n <ThirdPartyAuth\n currentProvider={currentProvider}\n providers={providers}\n secondaryProviders={secondaryProviders}\n handleInstitutionLogin={handleInstitutionLogin}\n thirdPartyAuthApiStatus={thirdPartyAuthApiStatus}\n />\n )}\n </Form>\n </div>\n )}\n </>\n );\n };\n\n if (tpaHint) {\n if (thirdPartyAuthApiStatus === PENDING_STATE) {\n return <Skeleton height={36} />;\n }\n const { provider, skipHintedLogin } = getTpaProvider(tpaHint, providers, secondaryProviders);\n if (skipHintedLogin) {\n window.location.href = getSiteConfig().lmsBaseUrl + provider.registerUrl;\n return null;\n }\n return provider ? <EnterpriseSSO provider={provider} /> : renderForm();\n }\n return (\n renderForm()\n );\n};\n\nRegistrationPage.propTypes = {\n institutionLogin: PropTypes.bool,\n handleInstitutionLogin: PropTypes.func,\n};\n\nRegistrationPage.defaultProps = {\n handleInstitutionLogin: null,\n institutionLogin: false,\n};\n\nexport default RegistrationPage;\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export default ConfigurableRegistrationForm;
|
|
2
|
+
/**
|
|
3
|
+
* Fields on registration page that are not the default required fields (name, email, username, password).
|
|
4
|
+
* These configurable required fields are defined on the backend using REGISTRATION_EXTRA_FIELDS setting.
|
|
5
|
+
*
|
|
6
|
+
* Country and Honor Code/Terms of Services (if enabled) will appear at the bottom of the form, even if they
|
|
7
|
+
* appear higher in order returned by backend. This is to make the user experience better.
|
|
8
|
+
*
|
|
9
|
+
* */
|
|
10
|
+
declare function ConfigurableRegistrationForm(props: any): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
declare namespace ConfigurableRegistrationForm {
|
|
12
|
+
namespace propTypes {
|
|
13
|
+
let email: PropTypes.Validator<string>;
|
|
14
|
+
let fieldDescriptions: PropTypes.Requireable<PropTypes.InferProps<{}>>;
|
|
15
|
+
let fieldErrors: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
|
|
16
|
+
country: PropTypes.Requireable<string>;
|
|
17
|
+
}>>>;
|
|
18
|
+
let formFields: PropTypes.Validator<NonNullable<PropTypes.InferProps<{
|
|
19
|
+
country: PropTypes.Requireable<PropTypes.InferProps<{
|
|
20
|
+
displayValue: PropTypes.Requireable<string>;
|
|
21
|
+
countryCode: PropTypes.Requireable<string>;
|
|
22
|
+
}>>;
|
|
23
|
+
honor_code: PropTypes.Requireable<boolean>;
|
|
24
|
+
marketingEmailsOptIn: PropTypes.Requireable<boolean>;
|
|
25
|
+
}>>>;
|
|
26
|
+
let setFieldErrors: PropTypes.Validator<(...args: any[]) => any>;
|
|
27
|
+
let setFormFields: PropTypes.Validator<(...args: any[]) => any>;
|
|
28
|
+
let autoSubmitRegistrationForm: PropTypes.Requireable<boolean>;
|
|
29
|
+
}
|
|
30
|
+
namespace defaultProps {
|
|
31
|
+
let fieldDescriptions_1: {};
|
|
32
|
+
export { fieldDescriptions_1 as fieldDescriptions };
|
|
33
|
+
let autoSubmitRegistrationForm_1: boolean;
|
|
34
|
+
export { autoSubmitRegistrationForm_1 as autoSubmitRegistrationForm };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
import PropTypes from 'prop-types';
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo } from 'react';
|
|
3
|
+
import { useAppConfig, getSiteConfig, getLocale, useIntl } from '@openedx/frontend-base';
|
|
4
|
+
import PropTypes from 'prop-types';
|
|
5
|
+
import { getCountryList } from '../../data/countries';
|
|
6
|
+
import { FormFieldRenderer } from '../../field-renderer';
|
|
7
|
+
import { FIELDS } from '../data/constants';
|
|
8
|
+
import messages from '../messages';
|
|
9
|
+
import { CountryField, HonorCode, TermsOfService } from '../RegistrationFields';
|
|
10
|
+
/**
|
|
11
|
+
* Fields on registration page that are not the default required fields (name, email, username, password).
|
|
12
|
+
* These configurable required fields are defined on the backend using REGISTRATION_EXTRA_FIELDS setting.
|
|
13
|
+
*
|
|
14
|
+
* Country and Honor Code/Terms of Services (if enabled) will appear at the bottom of the form, even if they
|
|
15
|
+
* appear higher in order returned by backend. This is to make the user experience better.
|
|
16
|
+
*
|
|
17
|
+
* */
|
|
18
|
+
const ConfigurableRegistrationForm = (props) => {
|
|
19
|
+
const { formatMessage } = useIntl();
|
|
20
|
+
const { email, fieldDescriptions, fieldErrors, formFields, setFieldErrors, setFormFields, autoSubmitRegistrationForm, } = props;
|
|
21
|
+
const { ENABLE_DYNAMIC_REGISTRATION_FIELDS, MARKETING_EMAILS_OPT_IN, } = useAppConfig();
|
|
22
|
+
/**
|
|
23
|
+
* The reason for adding the entry 'United States' is that Chrome auto-fills the form with 'United
|
|
24
|
+
* States' instead of 'United States of America', which does not exist in the country dropdown list.
|
|
25
|
+
* So we added the United States entry in the dropdown list.
|
|
26
|
+
*/
|
|
27
|
+
const countryList = useMemo(() => getCountryList(getLocale()).concat([{ code: 'US', name: 'United States' }]), []);
|
|
28
|
+
let showTermsOfServiceAndHonorCode = false;
|
|
29
|
+
let showCountryField = false;
|
|
30
|
+
const formFieldDescriptions = [];
|
|
31
|
+
const honorCode = [];
|
|
32
|
+
const flags = {
|
|
33
|
+
showConfigurableRegistrationFields: ENABLE_DYNAMIC_REGISTRATION_FIELDS,
|
|
34
|
+
showMarketingEmailOptInCheckbox: MARKETING_EMAILS_OPT_IN,
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* If auto submitting register form, we will check tos and honor code fields if they exist for feature parity.
|
|
38
|
+
*/
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (autoSubmitRegistrationForm) {
|
|
41
|
+
if (Object.keys(fieldDescriptions).includes(FIELDS.HONOR_CODE)) {
|
|
42
|
+
setFormFields(prevState => (Object.assign(Object.assign({}, prevState), { [FIELDS.HONOR_CODE]: true })));
|
|
43
|
+
}
|
|
44
|
+
if (Object.keys(fieldDescriptions).includes(FIELDS.TERMS_OF_SERVICE)) {
|
|
45
|
+
setFormFields(prevState => (Object.assign(Object.assign({}, prevState), { [FIELDS.TERMS_OF_SERVICE]: true })));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, [autoSubmitRegistrationForm]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
49
|
+
const handleErrorChange = (fieldName, error) => {
|
|
50
|
+
if (fieldName) {
|
|
51
|
+
setFieldErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [fieldName]: error })));
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const handleOnChange = (event, countryValue = null) => {
|
|
55
|
+
const { name } = event.target;
|
|
56
|
+
let value;
|
|
57
|
+
if (countryValue) {
|
|
58
|
+
value = Object.assign({}, countryValue);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
value = event.target.type === 'checkbox' ? event.target.checked : event.target.value;
|
|
62
|
+
if (event.target.type === 'checkbox') {
|
|
63
|
+
setFieldErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [name]: '' })));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setFormFields(prevState => (Object.assign(Object.assign({}, prevState), { [name]: value })));
|
|
67
|
+
};
|
|
68
|
+
const handleOnBlur = (event) => {
|
|
69
|
+
var _a;
|
|
70
|
+
const { name, value } = event.target;
|
|
71
|
+
let error = '';
|
|
72
|
+
if ((!value || !value.trim()) && ((_a = fieldDescriptions[name]) === null || _a === void 0 ? void 0 : _a.error_message)) {
|
|
73
|
+
error = fieldDescriptions[name].error_message;
|
|
74
|
+
}
|
|
75
|
+
else if (name === 'confirm_email' && value !== email) {
|
|
76
|
+
error = formatMessage(messages['email.do.not.match']);
|
|
77
|
+
}
|
|
78
|
+
setFieldErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [name]: error })));
|
|
79
|
+
};
|
|
80
|
+
const handleOnFocus = (event) => {
|
|
81
|
+
const { name } = event.target;
|
|
82
|
+
setFieldErrors(prevErrors => (Object.assign(Object.assign({}, prevErrors), { [name]: '' })));
|
|
83
|
+
};
|
|
84
|
+
if (flags.showConfigurableRegistrationFields) {
|
|
85
|
+
Object.keys(fieldDescriptions).forEach(fieldName => {
|
|
86
|
+
const fieldData = fieldDescriptions[fieldName];
|
|
87
|
+
switch (fieldData.name) {
|
|
88
|
+
case FIELDS.COUNTRY:
|
|
89
|
+
showCountryField = true;
|
|
90
|
+
break;
|
|
91
|
+
case FIELDS.HONOR_CODE:
|
|
92
|
+
if (fieldData.type === 'tos_and_honor_code') {
|
|
93
|
+
showTermsOfServiceAndHonorCode = true;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
honorCode.push(_jsx("span", { children: _jsx(HonorCode, { fieldType: fieldData.type, value: formFields[fieldData.name], onChangeHandler: handleOnChange, errorMessage: fieldErrors[fieldData.name] }) }, fieldData.name));
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case FIELDS.TERMS_OF_SERVICE:
|
|
100
|
+
honorCode.push(_jsx("span", { children: _jsx(TermsOfService, { value: formFields[fieldData.name], onChangeHandler: handleOnChange, errorMessage: fieldErrors[fieldData.name] }) }, fieldData.name));
|
|
101
|
+
break;
|
|
102
|
+
default:
|
|
103
|
+
formFieldDescriptions.push(_jsx("span", { children: _jsx(FormFieldRenderer, { fieldData: fieldData, value: formFields[fieldData.name], onChangeHandler: handleOnChange, handleBlur: handleOnBlur, handleFocus: handleOnFocus, errorMessage: fieldErrors[fieldData.name], isRequired: true }) }, fieldData.name));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
if (showCountryField) {
|
|
108
|
+
formFieldDescriptions.push(_jsx("span", { children: _jsx(CountryField, { countryList: countryList, selectedCountry: formFields.country, errorMessage: fieldErrors.country || '', onChangeHandler: handleOnChange, handleErrorChange: handleErrorChange, onBlurHandler: handleOnBlur, onFocusHandler: handleOnFocus }) }, "country"));
|
|
109
|
+
}
|
|
110
|
+
if (flags.showMarketingEmailOptInCheckbox) {
|
|
111
|
+
formFieldDescriptions.push(_jsx("span", { children: _jsx(FormFieldRenderer, { fieldData: {
|
|
112
|
+
type: 'checkbox',
|
|
113
|
+
label: formatMessage(messages['registration.opt.in.label'], { siteName: getSiteConfig().siteName }),
|
|
114
|
+
name: 'marketingEmailsOptIn',
|
|
115
|
+
}, value: formFields.marketingEmailsOptIn, className: "form-field--checkbox", onChangeHandler: handleOnChange, handleBlur: handleOnBlur, handleFocus: handleOnFocus }) }, "marketing_email_opt_in"));
|
|
116
|
+
}
|
|
117
|
+
if (showTermsOfServiceAndHonorCode) {
|
|
118
|
+
formFieldDescriptions.push(_jsx("span", { children: _jsx(HonorCode, { fieldType: "tos_and_honor_code", onChangeHandler: handleOnChange, value: formFields.honor_code }) }, "honor_code"));
|
|
119
|
+
}
|
|
120
|
+
return (_jsxs(_Fragment, { children: [formFieldDescriptions, _jsx("div", { children: honorCode })] }));
|
|
121
|
+
};
|
|
122
|
+
ConfigurableRegistrationForm.propTypes = {
|
|
123
|
+
email: PropTypes.string.isRequired,
|
|
124
|
+
fieldDescriptions: PropTypes.shape({}),
|
|
125
|
+
fieldErrors: PropTypes.shape({
|
|
126
|
+
country: PropTypes.string,
|
|
127
|
+
}).isRequired,
|
|
128
|
+
formFields: PropTypes.shape({
|
|
129
|
+
country: PropTypes.shape({
|
|
130
|
+
displayValue: PropTypes.string,
|
|
131
|
+
countryCode: PropTypes.string,
|
|
132
|
+
}),
|
|
133
|
+
honor_code: PropTypes.bool,
|
|
134
|
+
marketingEmailsOptIn: PropTypes.bool,
|
|
135
|
+
}).isRequired,
|
|
136
|
+
setFieldErrors: PropTypes.func.isRequired,
|
|
137
|
+
setFormFields: PropTypes.func.isRequired,
|
|
138
|
+
autoSubmitRegistrationForm: PropTypes.bool,
|
|
139
|
+
};
|
|
140
|
+
ConfigurableRegistrationForm.defaultProps = {
|
|
141
|
+
fieldDescriptions: {},
|
|
142
|
+
autoSubmitRegistrationForm: false,
|
|
143
|
+
};
|
|
144
|
+
export default ConfigurableRegistrationForm;
|
|
145
|
+
//# sourceMappingURL=ConfigurableRegistrationForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigurableRegistrationForm.js","sourceRoot":"","sources":["../../../src/register/components/ConfigurableRegistrationForm.jsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo } from 'react';\n\nimport {\n useAppConfig,\n getSiteConfig, getLocale, useIntl\n} from '@openedx/frontend-base';\nimport PropTypes from 'prop-types';\n\nimport { getCountryList } from '../../data/countries';\nimport { FormFieldRenderer } from '../../field-renderer';\nimport { FIELDS } from '../data/constants';\nimport messages from '../messages';\nimport { CountryField, HonorCode, TermsOfService } from '../RegistrationFields';\n\n/**\n * Fields on registration page that are not the default required fields (name, email, username, password).\n * These configurable required fields are defined on the backend using REGISTRATION_EXTRA_FIELDS setting.\n *\n * Country and Honor Code/Terms of Services (if enabled) will appear at the bottom of the form, even if they\n * appear higher in order returned by backend. This is to make the user experience better.\n *\n * */\nconst ConfigurableRegistrationForm = (props) => {\n const { formatMessage } = useIntl();\n const {\n email,\n fieldDescriptions,\n fieldErrors,\n formFields,\n setFieldErrors,\n setFormFields,\n autoSubmitRegistrationForm,\n } = props;\n const {\n ENABLE_DYNAMIC_REGISTRATION_FIELDS,\n MARKETING_EMAILS_OPT_IN,\n } = useAppConfig();\n\n /**\n * The reason for adding the entry 'United States' is that Chrome auto-fills the form with 'United\n * States' instead of 'United States of America', which does not exist in the country dropdown list.\n * So we added the United States entry in the dropdown list.\n */\n const countryList = useMemo(() => getCountryList(getLocale()).concat([{ code: 'US', name: 'United States' }]), []);\n\n let showTermsOfServiceAndHonorCode = false;\n let showCountryField = false;\n\n const formFieldDescriptions = [];\n const honorCode = [];\n const flags = {\n showConfigurableRegistrationFields: ENABLE_DYNAMIC_REGISTRATION_FIELDS,\n showMarketingEmailOptInCheckbox: MARKETING_EMAILS_OPT_IN,\n };\n\n /**\n * If auto submitting register form, we will check tos and honor code fields if they exist for feature parity.\n */\n useEffect(() => {\n if (autoSubmitRegistrationForm) {\n if (Object.keys(fieldDescriptions).includes(FIELDS.HONOR_CODE)) {\n setFormFields(prevState => ({\n ...prevState,\n [FIELDS.HONOR_CODE]: true,\n }));\n }\n if (Object.keys(fieldDescriptions).includes(FIELDS.TERMS_OF_SERVICE)) {\n setFormFields(prevState => ({\n ...prevState,\n [FIELDS.TERMS_OF_SERVICE]: true,\n }));\n }\n }\n }, [autoSubmitRegistrationForm]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleErrorChange = (fieldName, error) => {\n if (fieldName) {\n setFieldErrors(prevErrors => ({\n ...prevErrors,\n [fieldName]: error,\n }));\n }\n };\n\n const handleOnChange = (event, countryValue = null) => {\n const { name } = event.target;\n let value;\n if (countryValue) {\n value = { ...countryValue };\n } else {\n value = event.target.type === 'checkbox' ? event.target.checked : event.target.value;\n if (event.target.type === 'checkbox') {\n setFieldErrors(prevErrors => ({ ...prevErrors, [name]: '' }));\n }\n }\n setFormFields(prevState => ({ ...prevState, [name]: value }));\n };\n\n const handleOnBlur = (event) => {\n const { name, value } = event.target;\n let error = '';\n if ((!value || !value.trim()) && fieldDescriptions[name]?.error_message) {\n error = fieldDescriptions[name].error_message;\n } else if (name === 'confirm_email' && value !== email) {\n error = formatMessage(messages['email.do.not.match']);\n }\n setFieldErrors(prevErrors => ({ ...prevErrors, [name]: error }));\n };\n\n const handleOnFocus = (event) => {\n const { name } = event.target;\n setFieldErrors(prevErrors => ({ ...prevErrors, [name]: '' }));\n };\n\n if (flags.showConfigurableRegistrationFields) {\n Object.keys(fieldDescriptions).forEach(fieldName => {\n const fieldData = fieldDescriptions[fieldName];\n switch (fieldData.name) {\n case FIELDS.COUNTRY:\n showCountryField = true;\n break;\n case FIELDS.HONOR_CODE:\n if (fieldData.type === 'tos_and_honor_code') {\n showTermsOfServiceAndHonorCode = true;\n } else {\n honorCode.push(\n <span key={fieldData.name}>\n <HonorCode\n fieldType={fieldData.type}\n value={formFields[fieldData.name]}\n onChangeHandler={handleOnChange}\n errorMessage={fieldErrors[fieldData.name]}\n />\n </span>,\n );\n }\n break;\n case FIELDS.TERMS_OF_SERVICE:\n honorCode.push(\n <span key={fieldData.name}>\n <TermsOfService\n value={formFields[fieldData.name]}\n onChangeHandler={handleOnChange}\n errorMessage={fieldErrors[fieldData.name]}\n />\n </span>,\n );\n break;\n default:\n formFieldDescriptions.push(\n <span key={fieldData.name}>\n <FormFieldRenderer\n fieldData={fieldData}\n value={formFields[fieldData.name]}\n onChangeHandler={handleOnChange}\n handleBlur={handleOnBlur}\n handleFocus={handleOnFocus}\n errorMessage={fieldErrors[fieldData.name]}\n isRequired\n />\n </span>,\n );\n }\n });\n }\n\n if (showCountryField) {\n formFieldDescriptions.push(\n <span key=\"country\">\n <CountryField\n countryList={countryList}\n selectedCountry={formFields.country}\n errorMessage={fieldErrors.country || ''}\n onChangeHandler={handleOnChange}\n handleErrorChange={handleErrorChange}\n onBlurHandler={handleOnBlur}\n onFocusHandler={handleOnFocus}\n />\n </span>,\n );\n }\n\n if (flags.showMarketingEmailOptInCheckbox) {\n formFieldDescriptions.push(\n <span key=\"marketing_email_opt_in\">\n <FormFieldRenderer\n fieldData={{\n type: 'checkbox',\n label: formatMessage(messages['registration.opt.in.label'], { siteName: getSiteConfig().siteName }),\n name: 'marketingEmailsOptIn',\n }}\n value={formFields.marketingEmailsOptIn}\n className=\"form-field--checkbox\"\n onChangeHandler={handleOnChange}\n handleBlur={handleOnBlur}\n handleFocus={handleOnFocus}\n />\n </span>,\n );\n }\n\n if (showTermsOfServiceAndHonorCode) {\n formFieldDescriptions.push(\n <span key=\"honor_code\">\n <HonorCode fieldType=\"tos_and_honor_code\" onChangeHandler={handleOnChange} value={formFields.honor_code} />\n </span>,\n );\n }\n\n return (\n <>\n {formFieldDescriptions}\n <div>\n {honorCode}\n </div>\n </>\n );\n};\n\nConfigurableRegistrationForm.propTypes = {\n email: PropTypes.string.isRequired,\n fieldDescriptions: PropTypes.shape({}),\n fieldErrors: PropTypes.shape({\n country: PropTypes.string,\n }).isRequired,\n formFields: PropTypes.shape({\n country: PropTypes.shape({\n displayValue: PropTypes.string,\n countryCode: PropTypes.string,\n }),\n honor_code: PropTypes.bool,\n marketingEmailsOptIn: PropTypes.bool,\n }).isRequired,\n setFieldErrors: PropTypes.func.isRequired,\n setFormFields: PropTypes.func.isRequired,\n autoSubmitRegistrationForm: PropTypes.bool,\n};\n\nConfigurableRegistrationForm.defaultProps = {\n fieldDescriptions: {},\n autoSubmitRegistrationForm: false,\n};\n\nexport default ConfigurableRegistrationForm;\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
import { RegisterContextType } from '../types';
|
|
3
|
+
interface RegisterProviderProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare const RegisterProvider: FC<RegisterProviderProps>;
|
|
7
|
+
export declare const useRegisterContext: () => RegisterContextType;
|
|
8
|
+
export {};
|