@openedx/frontend-app-authn 1.0.0-alpha.6 → 1.0.0-alpha.8
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.js +1 -3
- package/dist/Main.js.map +1 -1
- package/dist/app.js +0 -2
- package/dist/app.js.map +1 -1
- package/dist/common-components/EmbeddedRegistrationRoute.js +2 -2
- package/dist/common-components/EmbeddedRegistrationRoute.js.map +1 -1
- package/dist/common-components/EnterpriseSSO.js +6 -3
- package/dist/common-components/EnterpriseSSO.js.map +1 -1
- package/dist/common-components/PasswordField.d.ts +17 -9
- package/dist/common-components/PasswordField.js +10 -6
- package/dist/common-components/PasswordField.js.map +1 -1
- package/dist/common-components/RedirectLogistration.js +7 -3
- package/dist/common-components/RedirectLogistration.js.map +1 -1
- package/dist/common-components/SocialAuthProviders.d.ts +2 -2
- package/dist/common-components/SocialAuthProviders.js +5 -4
- package/dist/common-components/SocialAuthProviders.js.map +1 -1
- package/dist/common-components/ThirdPartyAuth.js +3 -2
- package/dist/common-components/ThirdPartyAuth.js.map +1 -1
- package/dist/common-components/ThirdPartyAuthAlert.d.ts +2 -2
- package/dist/common-components/ThirdPartyAuthAlert.js +4 -4
- package/dist/common-components/ThirdPartyAuthAlert.js.map +1 -1
- package/dist/common-components/UnAuthOnlyRoute.js +5 -4
- package/dist/common-components/UnAuthOnlyRoute.js.map +1 -1
- 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 +0 -3
- package/dist/common-components/index.js +0 -3
- package/dist/common-components/index.js.map +1 -1
- package/dist/constants.d.ts +13 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -1
- package/dist/data/constants.d.ts +0 -8
- package/dist/data/constants.js +0 -9
- package/dist/data/constants.js.map +1 -1
- package/dist/data/utils/dataUtils.d.ts +1 -0
- package/dist/data/utils/dataUtils.js +14 -0
- package/dist/data/utils/dataUtils.js.map +1 -1
- package/dist/data/utils/index.d.ts +1 -2
- package/dist/data/utils/index.js +1 -2
- package/dist/data/utils/index.js.map +1 -1
- package/dist/forgot-password/ForgotPasswordPage.d.ts +2 -36
- package/dist/forgot-password/ForgotPasswordPage.js +45 -44
- package/dist/forgot-password/ForgotPasswordPage.js.map +1 -1
- package/dist/forgot-password/data/api.d.ts +2 -0
- package/dist/forgot-password/data/{service.js → api.js} +13 -14
- 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 +0 -4
- package/dist/forgot-password/index.js +0 -4
- package/dist/forgot-password/index.js.map +1 -1
- package/dist/forgot-password/messages.js +1 -1
- package/dist/forgot-password/messages.js.map +1 -1
- package/dist/i18n/index.d.ts +1 -25
- package/dist/i18n/index.js +1 -25
- package/dist/i18n/index.js.map +1 -1
- package/dist/login/ChangePasswordPrompt.js +11 -5
- package/dist/login/ChangePasswordPrompt.js.map +1 -1
- package/dist/login/LoginPage.d.ts +12 -10
- package/dist/login/LoginPage.js +85 -127
- package/dist/login/LoginPage.js.map +1 -1
- 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/index.d.ts +0 -3
- package/dist/login/index.js +0 -3
- package/dist/login/index.js.map +1 -1
- package/dist/logistration/Logistration.d.ts +5 -32
- package/dist/logistration/Logistration.js +28 -54
- package/dist/logistration/Logistration.js.map +1 -1
- package/dist/progressive-profiling/ProgressiveProfiling.d.ts +2 -46
- package/dist/progressive-profiling/ProgressiveProfiling.js +47 -71
- package/dist/progressive-profiling/ProgressiveProfiling.js.map +1 -1
- package/dist/progressive-profiling/ProgressiveProfilingPageModal.js +8 -1
- package/dist/progressive-profiling/ProgressiveProfilingPageModal.js.map +1 -1
- 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/{service.js → api.js} +11 -12
- 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 +0 -2
- package/dist/progressive-profiling/index.js +0 -2
- package/dist/progressive-profiling/index.js.map +1 -1
- package/dist/register/RegistrationFields/CountryField/CountryField.d.ts +1 -1
- package/dist/register/RegistrationFields/CountryField/CountryField.js +5 -7
- package/dist/register/RegistrationFields/CountryField/CountryField.js.map +1 -1
- package/dist/register/RegistrationFields/EmailField/EmailField.js +17 -9
- package/dist/register/RegistrationFields/EmailField/EmailField.js.map +1 -1
- package/dist/register/RegistrationFields/NameField/NameField.js +14 -7
- package/dist/register/RegistrationFields/NameField/NameField.js.map +1 -1
- package/dist/register/RegistrationFields/NameField/validator.d.ts +1 -0
- package/dist/register/RegistrationFields/NameField/validator.js +4 -0
- package/dist/register/RegistrationFields/NameField/validator.js.map +1 -1
- package/dist/register/RegistrationFields/UsernameField/UsernameField.js +20 -14
- package/dist/register/RegistrationFields/UsernameField/UsernameField.js.map +1 -1
- package/dist/register/RegistrationPage.d.ts +1 -1
- package/dist/register/RegistrationPage.js +102 -59
- package/dist/register/RegistrationPage.js.map +1 -1
- 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.js +4 -1
- package/dist/register/components/RegistrationFailure.js.map +1 -1
- 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 +1 -0
- package/dist/register/data/constants.js +1 -0
- package/dist/register/data/constants.js.map +1 -1
- package/dist/register/index.d.ts +0 -2
- package/dist/register/index.js +0 -3
- package/dist/register/index.js.map +1 -1
- package/dist/register/messages.d.ts +10 -0
- package/dist/register/messages.js +10 -0
- package/dist/register/messages.js.map +1 -1
- 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/ResetPasswordPage.d.ts +2 -32
- package/dist/reset-password/ResetPasswordPage.js +90 -58
- package/dist/reset-password/ResetPasswordPage.js.map +1 -1
- 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/index.d.ts +0 -4
- package/dist/reset-password/index.js +0 -4
- package/dist/reset-password/index.js.map +1 -1
- package/dist/routes.d.ts +1 -0
- package/dist/routes.js +15 -14
- package/dist/routes.js.map +1 -1
- package/dist/sass/_registration.scss +8 -10
- 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 +25 -14
- package/dist/common-components/data/actions.d.ts +0 -26
- package/dist/common-components/data/actions.js +0 -22
- package/dist/common-components/data/actions.js.map +0 -1
- package/dist/common-components/data/reducers.d.ts +0 -62
- package/dist/common-components/data/reducers.js +0 -39
- package/dist/common-components/data/reducers.js.map +0 -1
- package/dist/common-components/data/sagas.d.ts +0 -12
- package/dist/common-components/data/sagas.js +0 -21
- package/dist/common-components/data/sagas.js.map +0 -1
- package/dist/common-components/data/selectors.d.ts +0 -98
- package/dist/common-components/data/selectors.js +0 -11
- package/dist/common-components/data/selectors.js.map +0 -1
- package/dist/common-components/data/service.d.ts +0 -5
- package/dist/common-components/data/service.js +0 -31
- package/dist/common-components/data/service.js.map +0 -1
- package/dist/data/configureStore.d.ts +0 -3
- package/dist/data/configureStore.js +0 -24
- package/dist/data/configureStore.js.map +0 -1
- package/dist/data/reducers.d.ts +0 -254
- package/dist/data/reducers.js +0 -17
- package/dist/data/reducers.js.map +0 -1
- package/dist/data/sagas.d.ts +0 -1
- package/dist/data/sagas.js +0 -18
- package/dist/data/sagas.js.map +0 -1
- package/dist/data/utils/reduxUtils.d.ts +0 -15
- package/dist/data/utils/reduxUtils.js +0 -29
- package/dist/data/utils/reduxUtils.js.map +0 -1
- package/dist/forgot-password/data/actions.d.ts +0 -30
- package/dist/forgot-password/data/actions.js +0 -26
- package/dist/forgot-password/data/actions.js.map +0 -1
- package/dist/forgot-password/data/reducers.d.ts +0 -13
- package/dist/forgot-password/data/reducers.js +0 -46
- package/dist/forgot-password/data/reducers.js.map +0 -1
- package/dist/forgot-password/data/sagas.d.ts +0 -4
- package/dist/forgot-password/data/sagas.js +0 -28
- package/dist/forgot-password/data/sagas.js.map +0 -1
- package/dist/forgot-password/data/selectors.d.ts +0 -23
- package/dist/forgot-password/data/selectors.js +0 -5
- package/dist/forgot-password/data/selectors.js.map +0 -1
- package/dist/forgot-password/data/service.d.ts +0 -1
- package/dist/forgot-password/data/service.js.map +0 -1
- package/dist/login/data/actions.d.ts +0 -36
- package/dist/login/data/actions.js +0 -32
- package/dist/login/data/actions.js.map +0 -1
- package/dist/login/data/reducers.d.ts +0 -82
- package/dist/login/data/reducers.js +0 -44
- package/dist/login/data/reducers.js.map +0 -1
- package/dist/login/data/sagas.d.ts +0 -10
- package/dist/login/data/sagas.js +0 -34
- package/dist/login/data/sagas.js.map +0 -1
- package/dist/login/data/service.d.ts +0 -4
- package/dist/login/data/service.js +0 -32
- package/dist/login/data/service.js.map +0 -1
- package/dist/progressive-profiling/data/actions.d.ts +0 -19
- package/dist/progressive-profiling/data/actions.js +0 -18
- package/dist/progressive-profiling/data/actions.js.map +0 -1
- package/dist/progressive-profiling/data/reducers.d.ts +0 -22
- package/dist/progressive-profiling/data/reducers.js +0 -23
- package/dist/progressive-profiling/data/reducers.js.map +0 -1
- package/dist/progressive-profiling/data/sagas.d.ts +0 -4
- package/dist/progressive-profiling/data/sagas.js +0 -17
- package/dist/progressive-profiling/data/sagas.js.map +0 -1
- package/dist/progressive-profiling/data/selectors.d.ts +0 -39
- package/dist/progressive-profiling/data/selectors.js +0 -9
- package/dist/progressive-profiling/data/selectors.js.map +0 -1
- package/dist/progressive-profiling/data/service.d.ts +0 -1
- package/dist/progressive-profiling/data/service.js.map +0 -1
- package/dist/register/data/actions.d.ts +0 -80
- package/dist/register/data/actions.js +0 -69
- package/dist/register/data/actions.js.map +0 -1
- package/dist/register/data/reducers.d.ts +0 -237
- package/dist/register/data/reducers.js +0 -86
- package/dist/register/data/reducers.js.map +0 -1
- package/dist/register/data/sagas.d.ts +0 -19
- package/dist/register/data/sagas.js +0 -45
- package/dist/register/data/sagas.js.map +0 -1
- package/dist/register/data/selectors.d.ts +0 -26
- package/dist/register/data/selectors.js +0 -25
- package/dist/register/data/selectors.js.map +0 -1
- package/dist/register/data/service.d.ts +0 -8
- package/dist/register/data/service.js +0 -46
- package/dist/register/data/service.js.map +0 -1
- package/dist/reset-password/data/actions.d.ts +0 -56
- package/dist/reset-password/data/actions.js +0 -41
- package/dist/reset-password/data/actions.js.map +0 -1
- package/dist/reset-password/data/reducers.d.ts +0 -19
- package/dist/reset-password/data/reducers.js +0 -25
- package/dist/reset-password/data/reducers.js.map +0 -1
- package/dist/reset-password/data/sagas.d.ts +0 -7
- package/dist/reset-password/data/sagas.js +0 -63
- package/dist/reset-password/data/sagas.js.map +0 -1
- package/dist/reset-password/data/selectors.d.ts +0 -23
- package/dist/reset-password/data/selectors.js +0 -5
- package/dist/reset-password/data/selectors.js.map +0 -1
- package/dist/reset-password/data/service.d.ts +0 -3
- package/dist/reset-password/data/service.js +0 -62
- package/dist/reset-password/data/service.js.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo, useState, useCallback } from 'react';
|
|
3
|
+
import { DEFAULT_STATE, } from '../../data/constants';
|
|
4
|
+
const ProgressiveProfilingContext = createContext(undefined);
|
|
5
|
+
export const ProgressiveProfilingProvider = ({ children }) => {
|
|
6
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
7
|
+
const [showError, setShowError] = useState(false);
|
|
8
|
+
const [success, setSuccess] = useState(false);
|
|
9
|
+
const [submitState, setSubmitState] = useState(DEFAULT_STATE);
|
|
10
|
+
const setLoading = useCallback((loading) => {
|
|
11
|
+
setIsLoading(loading);
|
|
12
|
+
if (loading) {
|
|
13
|
+
setShowError(false);
|
|
14
|
+
setSuccess(false);
|
|
15
|
+
}
|
|
16
|
+
}, []);
|
|
17
|
+
const clearState = useCallback(() => {
|
|
18
|
+
setIsLoading(false);
|
|
19
|
+
setShowError(false);
|
|
20
|
+
setSuccess(false);
|
|
21
|
+
}, []);
|
|
22
|
+
const value = useMemo(() => ({
|
|
23
|
+
isLoading,
|
|
24
|
+
showError,
|
|
25
|
+
success,
|
|
26
|
+
setLoading,
|
|
27
|
+
setShowError,
|
|
28
|
+
setSuccess,
|
|
29
|
+
clearState,
|
|
30
|
+
submitState,
|
|
31
|
+
setSubmitState,
|
|
32
|
+
}), [
|
|
33
|
+
isLoading,
|
|
34
|
+
showError,
|
|
35
|
+
success,
|
|
36
|
+
setLoading,
|
|
37
|
+
setShowError,
|
|
38
|
+
setSuccess,
|
|
39
|
+
clearState,
|
|
40
|
+
submitState,
|
|
41
|
+
setSubmitState,
|
|
42
|
+
]);
|
|
43
|
+
return (_jsx(ProgressiveProfilingContext.Provider, { value: value, children: children }));
|
|
44
|
+
};
|
|
45
|
+
export const useProgressiveProfilingContext = () => {
|
|
46
|
+
const context = useContext(ProgressiveProfilingContext);
|
|
47
|
+
if (context === undefined) {
|
|
48
|
+
throw new Error('useProgressiveProfilingContext must be used within a ProgressiveProfilingProvider');
|
|
49
|
+
}
|
|
50
|
+
return context;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=ProgressiveProfilingContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressiveProfilingContext.js","sourceRoot":"","sources":["../../../src/progressive-profiling/components/ProgressiveProfilingContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAiB,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEjG,OAAO,EACL,aAAa,GACd,MAAM,sBAAsB,CAAC;AAc9B,MAAM,2BAA2B,GAAG,aAAa,CAA8C,SAAS,CAAC,CAAC;AAM1G,MAAM,CAAC,MAAM,4BAA4B,GAA0C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAClG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,aAAa,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,OAAgB,EAAE,EAAE;QAClD,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3B,SAAS;QACT,SAAS;QACT,OAAO;QACP,UAAU;QACV,YAAY;QACZ,UAAU;QACV,UAAU;QACV,WAAW;QACX,cAAc;KACf,CAAC,EAAE;QACF,SAAS;QACT,SAAS;QACT,OAAO;QACP,UAAU;QACV,YAAY;QACZ,UAAU;QACV,UAAU;QACV,WAAW;QACX,cAAc;KACf,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,2BAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC/C,QAAQ,GAC4B,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAoC,EAAE;IAClF,MAAM,OAAO,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["import { createContext, FC, ReactNode, useContext, useMemo, useState, useCallback } from 'react';\n\nimport {\n DEFAULT_STATE,\n} from '../../data/constants';\n\ninterface ProgressiveProfilingContextType {\n isLoading: boolean,\n showError: boolean,\n success: boolean,\n submitState?: string,\n setLoading: (loading: boolean) => void,\n setShowError: (showError: boolean) => void,\n setSuccess: (success: boolean) => void,\n setSubmitState: (state: string) => void,\n clearState: () => void,\n}\n\nconst ProgressiveProfilingContext = createContext<ProgressiveProfilingContextType | undefined>(undefined);\n\ninterface ProgressiveProfilingProviderProps {\n children: ReactNode,\n}\n\nexport const ProgressiveProfilingProvider: FC<ProgressiveProfilingProviderProps> = ({ children }) => {\n const [isLoading, setIsLoading] = useState(false);\n const [showError, setShowError] = useState(false);\n const [success, setSuccess] = useState(false);\n const [submitState, setSubmitState] = useState<string>(DEFAULT_STATE);\n\n const setLoading = useCallback((loading: boolean) => {\n setIsLoading(loading);\n if (loading) {\n setShowError(false);\n setSuccess(false);\n }\n }, []);\n\n const clearState = useCallback(() => {\n setIsLoading(false);\n setShowError(false);\n setSuccess(false);\n }, []);\n\n const value = useMemo(() => ({\n isLoading,\n showError,\n success,\n setLoading,\n setShowError,\n setSuccess,\n clearState,\n submitState,\n setSubmitState,\n }), [\n isLoading,\n showError,\n success,\n setLoading,\n setShowError,\n setSuccess,\n clearState,\n submitState,\n setSubmitState,\n ]);\n\n return (\n <ProgressiveProfilingContext.Provider value={value}>\n {children}\n </ProgressiveProfilingContext.Provider>\n );\n};\n\nexport const useProgressiveProfilingContext = (): ProgressiveProfilingContextType => {\n const context = useContext(ProgressiveProfilingContext);\n if (context === undefined) {\n throw new Error('useProgressiveProfilingContext must be used within a ProgressiveProfilingProvider');\n }\n return context;\n};\n"]}
|
|
@@ -8,16 +8,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { getAuthenticatedHttpClient, getSiteConfig } from '@openedx/frontend-base';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
throw (error);
|
|
20
|
-
});
|
|
11
|
+
const patchAccount = (username, commitValues) => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
|
+
const requestConfig = {
|
|
13
|
+
headers: { 'Content-Type': 'application/merge-patch+json' },
|
|
14
|
+
};
|
|
15
|
+
yield getAuthenticatedHttpClient()
|
|
16
|
+
.patch(`${getSiteConfig().lmsBaseUrl}/api/user/v1/accounts/${username}`, commitValues, requestConfig)
|
|
17
|
+
.catch((error) => {
|
|
18
|
+
throw (error);
|
|
21
19
|
});
|
|
22
|
-
}
|
|
23
|
-
|
|
20
|
+
});
|
|
21
|
+
export { patchAccount, };
|
|
22
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/progressive-profiling/data/api.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEnF,MAAM,YAAY,GAAG,CAAO,QAAQ,EAAE,YAAY,EAAE,EAAE;IACpD,MAAM,aAAa,GAAG;QACpB,OAAO,EAAE,EAAE,cAAc,EAAE,8BAA8B,EAAE;KAC5D,CAAC;IAEF,MAAM,0BAA0B,EAAE;SAC/B,KAAK,CACJ,GAAG,aAAa,EAAE,CAAC,UAAU,yBAAyB,QAAQ,EAAE,EAChE,YAAY,EACZ,aAAa,CACd;SACA,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAA,CAAC;AAEF,OAAO,EACL,YAAY,GACb,CAAC","sourcesContent":["import { getAuthenticatedHttpClient, getSiteConfig } from '@openedx/frontend-base';\n\nconst patchAccount = async (username, commitValues) => {\n const requestConfig = {\n headers: { 'Content-Type': 'application/merge-patch+json' },\n };\n\n await getAuthenticatedHttpClient()\n .patch(\n `${getSiteConfig().lmsBaseUrl}/api/user/v1/accounts/${username}`,\n commitValues,\n requestConfig,\n )\n .catch((error) => {\n throw (error);\n });\n};\n\nexport {\n patchAccount,\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface SaveUserProfilePayload {
|
|
2
|
+
username: string;
|
|
3
|
+
data: Record<string, any>;
|
|
4
|
+
}
|
|
5
|
+
interface UseSaveUserProfileOptions {
|
|
6
|
+
onSuccess?: () => void;
|
|
7
|
+
onError?: (error: unknown) => void;
|
|
8
|
+
}
|
|
9
|
+
declare const useSaveUserProfile: (options?: UseSaveUserProfileOptions) => import("@tanstack/react-query").UseMutationResult<void, unknown, SaveUserProfilePayload, unknown>;
|
|
10
|
+
export { useSaveUserProfile, };
|
|
@@ -0,0 +1,36 @@
|
|
|
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 { useMutation } from '@tanstack/react-query';
|
|
11
|
+
import { patchAccount } from './api';
|
|
12
|
+
import { COMPLETE_STATE, DEFAULT_STATE, } from '../../data/constants';
|
|
13
|
+
import { useProgressiveProfilingContext } from '../components/ProgressiveProfilingContext';
|
|
14
|
+
const useSaveUserProfile = (options = {}) => {
|
|
15
|
+
const { setSuccess, setSubmitState } = useProgressiveProfilingContext();
|
|
16
|
+
return useMutation({
|
|
17
|
+
mutationFn: (_a) => __awaiter(void 0, [_a], void 0, function* ({ username, data }) {
|
|
18
|
+
return (patchAccount(username, data));
|
|
19
|
+
}),
|
|
20
|
+
onSuccess: () => {
|
|
21
|
+
setSuccess(true);
|
|
22
|
+
setSubmitState(COMPLETE_STATE);
|
|
23
|
+
if (options.onSuccess) {
|
|
24
|
+
options.onSuccess();
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
onError: (error) => {
|
|
28
|
+
setSubmitState(DEFAULT_STATE);
|
|
29
|
+
if (options.onError) {
|
|
30
|
+
options.onError(error);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
export { useSaveUserProfile, };
|
|
36
|
+
//# sourceMappingURL=apiHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiHook.js","sourceRoot":"","sources":["../../../src/progressive-profiling/data/apiHook.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EACL,cAAc,EAAE,aAAa,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAC;AAY3F,MAAM,kBAAkB,GAAG,CAAC,UAAqC,EAAE,EAAE,EAAE;IACrE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,8BAA8B,EAAE,CAAC;IACxE,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAmD,EAAE,4CAA9C,EAAE,QAAQ,EAAE,IAAI,EAA0B;YAAK,OAAA,CAChE,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAC7B,CAAA;UAAA;QACD,SAAS,EAAE,GAAG,EAAE;YACd,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,cAAc,CAAC,cAAc,CAAC,CAAC;YAC/B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;YAC1B,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EACL,kBAAkB,GACnB,CAAC","sourcesContent":["import { useMutation } from '@tanstack/react-query';\n\nimport { patchAccount } from './api';\nimport {\n COMPLETE_STATE, DEFAULT_STATE,\n} from '../../data/constants';\nimport { useProgressiveProfilingContext } from '../components/ProgressiveProfilingContext';\n\ninterface SaveUserProfilePayload {\n username: string,\n data: Record<string, any>,\n}\n\ninterface UseSaveUserProfileOptions {\n onSuccess?: () => void,\n onError?: (error: unknown) => void,\n}\n\nconst useSaveUserProfile = (options: UseSaveUserProfileOptions = {}) => {\n const { setSuccess, setSubmitState } = useProgressiveProfilingContext();\n return useMutation({\n mutationFn: async ({ username, data }: SaveUserProfilePayload) => (\n patchAccount(username, data)\n ),\n onSuccess: () => {\n setSuccess(true);\n setSubmitState(COMPLETE_STATE);\n if (options.onSuccess) {\n options.onSuccess();\n }\n },\n onError: (error: unknown) => {\n setSubmitState(DEFAULT_STATE);\n if (options.onError) {\n options.onError(error);\n }\n },\n });\n};\n\nexport {\n useSaveUserProfile,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/progressive-profiling/index.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/progressive-profiling/index.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["export const storeName = 'welcomePage';\nexport { default as ProgressiveProfiling } from './ProgressiveProfiling';\n"]}
|
|
@@ -5,7 +5,7 @@ export default CountryField;
|
|
|
5
5
|
* - handleErrorChange for setting error
|
|
6
6
|
*
|
|
7
7
|
* It is responsible for
|
|
8
|
-
* - Auto populating country field if backendCountryCode is available in
|
|
8
|
+
* - Auto populating country field if backendCountryCode is available in context
|
|
9
9
|
* - Performing country field validations
|
|
10
10
|
* - clearing error on focus
|
|
11
11
|
* - setting value on change and selection
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect } from 'react';
|
|
3
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
4
3
|
import { useIntl } from '@openedx/frontend-base';
|
|
5
4
|
import { FormAutosuggest, FormAutosuggestOption, FormControlFeedback } from '@openedx/paragon';
|
|
6
5
|
import classNames from 'classnames';
|
|
7
6
|
import PropTypes from 'prop-types';
|
|
8
|
-
import { clearRegistrationBackendError } from '../../data/actions';
|
|
9
|
-
import messages from '../../messages';
|
|
10
7
|
import validateCountryField, { COUNTRY_CODE_KEY, COUNTRY_DISPLAY_KEY } from './validator';
|
|
8
|
+
import { useRegisterContext } from '../../components/RegisterContext';
|
|
9
|
+
import messages from '../../messages';
|
|
11
10
|
/**
|
|
12
11
|
* Country field wrapper. It accepts following handlers
|
|
13
12
|
* - handleChange for setting value change and
|
|
14
13
|
* - handleErrorChange for setting error
|
|
15
14
|
*
|
|
16
15
|
* It is responsible for
|
|
17
|
-
* - Auto populating country field if backendCountryCode is available in
|
|
16
|
+
* - Auto populating country field if backendCountryCode is available in context
|
|
18
17
|
* - Performing country field validations
|
|
19
18
|
* - clearing error on focus
|
|
20
19
|
* - setting value on change and selection
|
|
@@ -22,13 +21,12 @@ import validateCountryField, { COUNTRY_CODE_KEY, COUNTRY_DISPLAY_KEY } from './v
|
|
|
22
21
|
const CountryField = (props) => {
|
|
23
22
|
const { countryList, selectedCountry, onChangeHandler, handleErrorChange, onFocusHandler, } = props;
|
|
24
23
|
const { formatMessage } = useIntl();
|
|
25
|
-
const
|
|
24
|
+
const { clearRegistrationBackendError, backendCountryCode, } = useRegisterContext();
|
|
26
25
|
const countryFieldValue = {
|
|
27
26
|
userProvidedText: selectedCountry.displayValue,
|
|
28
27
|
selectionValue: selectedCountry.displayValue,
|
|
29
28
|
selectionId: selectedCountry.countryCode,
|
|
30
29
|
};
|
|
31
|
-
const backendCountryCode = useSelector(state => state.register.backendCountryCode);
|
|
32
30
|
useEffect(() => {
|
|
33
31
|
if (backendCountryCode && backendCountryCode !== (selectedCountry === null || selectedCountry === void 0 ? void 0 : selectedCountry.countryCode)) {
|
|
34
32
|
let countryCode = '';
|
|
@@ -55,7 +53,7 @@ const CountryField = (props) => {
|
|
|
55
53
|
};
|
|
56
54
|
const handleOnFocus = (event) => {
|
|
57
55
|
handleErrorChange('country', '');
|
|
58
|
-
|
|
56
|
+
clearRegistrationBackendError('country');
|
|
59
57
|
onFocusHandler(event);
|
|
60
58
|
};
|
|
61
59
|
const handleOnChange = (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CountryField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/CountryField/CountryField.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CountryField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/CountryField/CountryField.jsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect } from 'react';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { FormAutosuggest, FormAutosuggestOption, FormControlFeedback } from '@openedx/paragon';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\n\nimport validateCountryField, { COUNTRY_CODE_KEY, COUNTRY_DISPLAY_KEY } from './validator';\nimport { useRegisterContext } from '../../components/RegisterContext';\nimport messages from '../../messages';\n\n/**\n * Country field wrapper. It accepts following handlers\n * - handleChange for setting value change and\n * - handleErrorChange for setting error\n *\n * It is responsible for\n * - Auto populating country field if backendCountryCode is available in context\n * - Performing country field validations\n * - clearing error on focus\n * - setting value on change and selection\n */\nconst CountryField = (props) => {\n const {\n countryList,\n selectedCountry,\n onChangeHandler,\n handleErrorChange,\n onFocusHandler,\n } = props;\n const { formatMessage } = useIntl();\n\n const {\n clearRegistrationBackendError,\n backendCountryCode,\n } = useRegisterContext();\n\n const countryFieldValue = {\n userProvidedText: selectedCountry.displayValue,\n selectionValue: selectedCountry.displayValue,\n selectionId: selectedCountry.countryCode,\n };\n\n useEffect(() => {\n if (backendCountryCode && backendCountryCode !== selectedCountry?.countryCode) {\n let countryCode = '';\n let countryDisplayValue = '';\n\n const countryVal = countryList.find(\n (country) => (country[COUNTRY_CODE_KEY].toLowerCase() === backendCountryCode.toLowerCase()),\n );\n if (countryVal) {\n countryCode = countryVal[COUNTRY_CODE_KEY];\n countryDisplayValue = countryVal[COUNTRY_DISPLAY_KEY];\n }\n onChangeHandler(\n { target: { name: 'country' } },\n { countryCode, displayValue: countryDisplayValue },\n );\n } else if (!selectedCountry.displayValue) {\n onChangeHandler(\n { target: { name: 'country' } },\n { countryCode: '', displayValue: '' },\n );\n }\n }, [backendCountryCode, countryList]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleOnBlur = (event) => {\n // Do not run validations when drop-down arrow is clicked\n if (event.relatedTarget && event.relatedTarget.className.includes('pgn__form-autosuggest__icon-button')) {\n return;\n }\n\n const { value } = event.target;\n\n const { error } = validateCountryField(\n value.trim(), countryList, formatMessage(messages['empty.country.field.error']), formatMessage(messages['invalid.country.field.error']),\n );\n handleErrorChange('country', error);\n };\n\n const handleOnFocus = (event) => {\n handleErrorChange('country', '');\n clearRegistrationBackendError('country');\n onFocusHandler(event);\n };\n\n const handleOnChange = (value) => {\n onChangeHandler({ target: { name: 'country' } }, { countryCode: value.selectionId, displayValue: value.userProvidedText });\n\n // We have put this check because proviously we also had onSelected event handler and we call\n // the onBlur on that event handler but now there is no such handler and we only have\n // onChange so we check the is there is proper sectionId which only be\n // proper one when we select it from dropdown's item otherwise its null.\n if (value.selectionId !== '') {\n handleOnBlur({ target: { name: 'country', value: value.userProvidedText } });\n }\n };\n\n const getCountryList = () => countryList.map((country) => (\n <FormAutosuggestOption key={country[COUNTRY_DISPLAY_KEY]} id={country[COUNTRY_CODE_KEY]}>\n {country[COUNTRY_DISPLAY_KEY]}\n </FormAutosuggestOption>\n ));\n\n return (\n <div className=\"mb-4\">\n <FormAutosuggest\n floatingLabel={formatMessage(messages['registration.country.label'])}\n aria-label=\"form autosuggest\"\n name=\"country\"\n value={countryFieldValue || {}}\n className={classNames({ 'form-field-error': props.errorMessage })}\n onFocus={(e) => handleOnFocus(e)}\n onBlur={(e) => handleOnBlur(e)}\n onChange={(value) => handleOnChange(value)}\n >\n {getCountryList()}\n </FormAutosuggest>\n {props.errorMessage !== '' && (\n <FormControlFeedback\n key=\"error\"\n className=\"form-text-size\"\n hasIcon={false}\n feedback-for=\"country\"\n type=\"invalid\"\n >\n {props.errorMessage}\n </FormControlFeedback>\n )}\n </div>\n );\n};\n\nCountryField.propTypes = {\n countryList: PropTypes.arrayOf(\n PropTypes.shape({\n code: PropTypes.string,\n name: PropTypes.string,\n }),\n ).isRequired,\n errorMessage: PropTypes.string,\n onChangeHandler: PropTypes.func.isRequired,\n handleErrorChange: PropTypes.func.isRequired,\n onFocusHandler: PropTypes.func.isRequired,\n selectedCountry: PropTypes.shape({\n displayValue: PropTypes.string,\n countryCode: PropTypes.string,\n }),\n};\n\nCountryField.defaultProps = {\n errorMessage: null,\n selectedCountry: {\n value: '',\n },\n};\n\nexport default CountryField;\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
4
3
|
import { useIntl } from '@openedx/frontend-base';
|
|
5
4
|
import { Alert, Icon } from '@openedx/paragon';
|
|
6
5
|
import { Close, Error } from '@openedx/paragon/icons';
|
|
7
6
|
import PropTypes from 'prop-types';
|
|
7
|
+
import validateEmail from './validator';
|
|
8
8
|
import { FormGroup } from '../../../common-components';
|
|
9
|
-
import {
|
|
9
|
+
import { useRegisterContext } from '../../components/RegisterContext';
|
|
10
|
+
import { useFieldValidations } from '../../data/apiHook';
|
|
10
11
|
import messages from '../../messages';
|
|
11
|
-
import validateEmail from './validator';
|
|
12
12
|
/**
|
|
13
13
|
* Email field wrapper. It accepts following handlers
|
|
14
14
|
* - handleChange for setting value change and
|
|
@@ -23,10 +23,17 @@ import validateEmail from './validator';
|
|
|
23
23
|
*/
|
|
24
24
|
const EmailField = (props) => {
|
|
25
25
|
const { formatMessage } = useIntl();
|
|
26
|
-
const
|
|
26
|
+
const { setValidationsSuccess, setValidationsFailure, validationApiRateLimited, clearRegistrationBackendError, registrationFormData, setEmailSuggestionContext, } = useRegisterContext();
|
|
27
27
|
const { handleChange, handleErrorChange, confirmEmailValue, } = props;
|
|
28
|
-
const
|
|
29
|
-
|
|
28
|
+
const fieldValidationsMutation = useFieldValidations({
|
|
29
|
+
onSuccess: (data) => {
|
|
30
|
+
setValidationsSuccess(data);
|
|
31
|
+
},
|
|
32
|
+
onError: () => {
|
|
33
|
+
setValidationsFailure();
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const backedUpFormData = registrationFormData;
|
|
30
37
|
const [emailSuggestion, setEmailSuggestion] = useState(Object.assign({}, backedUpFormData === null || backedUpFormData === void 0 ? void 0 : backedUpFormData.emailSuggestion));
|
|
31
38
|
useEffect(() => {
|
|
32
39
|
setEmailSuggestion(backedUpFormData.emailSuggestion);
|
|
@@ -37,24 +44,25 @@ const EmailField = (props) => {
|
|
|
37
44
|
if (confirmEmailError) {
|
|
38
45
|
handleErrorChange('confirm_email', confirmEmailError);
|
|
39
46
|
}
|
|
40
|
-
|
|
47
|
+
setEmailSuggestionContext(suggestion.suggestion, suggestion.type);
|
|
41
48
|
setEmailSuggestion(suggestion);
|
|
42
49
|
if (fieldError) {
|
|
43
50
|
handleErrorChange('email', fieldError);
|
|
44
51
|
}
|
|
45
52
|
else if (!validationApiRateLimited) {
|
|
46
|
-
|
|
53
|
+
fieldValidationsMutation.mutate({ email: value });
|
|
47
54
|
}
|
|
48
55
|
};
|
|
49
56
|
const handleOnFocus = () => {
|
|
50
57
|
handleErrorChange('email', '');
|
|
51
|
-
|
|
58
|
+
clearRegistrationBackendError('email');
|
|
52
59
|
};
|
|
53
60
|
const handleSuggestionClick = (event) => {
|
|
54
61
|
event.preventDefault();
|
|
55
62
|
handleErrorChange('email', '');
|
|
56
63
|
handleChange({ target: { name: 'email', value: emailSuggestion.suggestion } });
|
|
57
64
|
setEmailSuggestion({ suggestion: '', type: '' });
|
|
65
|
+
setEmailSuggestionContext('', '');
|
|
58
66
|
};
|
|
59
67
|
const handleSuggestionClosed = () => setEmailSuggestion({ suggestion: '', type: '' });
|
|
60
68
|
const renderEmailFeedback = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/EmailField/EmailField.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"EmailField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/EmailField/EmailField.jsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useIntl } from '@openedx/frontend-base';\nimport { Alert, Icon } from '@openedx/paragon';\nimport { Close, Error } from '@openedx/paragon/icons';\nimport PropTypes from 'prop-types';\n\nimport validateEmail from './validator';\nimport { FormGroup } from '../../../common-components';\nimport { useRegisterContext } from '../../components/RegisterContext';\nimport { useFieldValidations } from '../../data/apiHook';\nimport messages from '../../messages';\n\n/**\n * Email field wrapper. It accepts following handlers\n * - handleChange for setting value change and\n * - handleErrorChange for setting error\n *\n * It is responsible for\n * - Generating email warning and error suggestions\n * - Setting and clearing email suggestions\n * - Performing email field validations\n * - clearing error on focus\n * - setting value on change\n */\nconst EmailField = (props) => {\n const { formatMessage } = useIntl();\n\n const {\n setValidationsSuccess,\n setValidationsFailure,\n validationApiRateLimited,\n clearRegistrationBackendError,\n registrationFormData,\n setEmailSuggestionContext,\n } = useRegisterContext();\n\n const {\n handleChange,\n handleErrorChange,\n confirmEmailValue,\n } = props;\n\n const fieldValidationsMutation = useFieldValidations({\n onSuccess: (data) => {\n setValidationsSuccess(data);\n },\n onError: () => {\n setValidationsFailure();\n },\n });\n\n const backedUpFormData = registrationFormData;\n const [emailSuggestion, setEmailSuggestion] = useState({ ...backedUpFormData?.emailSuggestion });\n\n useEffect(() => {\n setEmailSuggestion(backedUpFormData.emailSuggestion);\n }, [backedUpFormData.emailSuggestion]);\n\n const handleOnBlur = (e) => {\n const { value } = e.target;\n const { fieldError, confirmEmailError, suggestion } = validateEmail(value, confirmEmailValue, formatMessage);\n\n if (confirmEmailError) {\n handleErrorChange('confirm_email', confirmEmailError);\n }\n setEmailSuggestionContext(suggestion.suggestion, suggestion.type);\n setEmailSuggestion(suggestion);\n\n if (fieldError) {\n handleErrorChange('email', fieldError);\n } else if (!validationApiRateLimited) {\n fieldValidationsMutation.mutate({ email: value });\n }\n };\n\n const handleOnFocus = () => {\n handleErrorChange('email', '');\n clearRegistrationBackendError('email');\n };\n\n const handleSuggestionClick = (event) => {\n event.preventDefault();\n handleErrorChange('email', '');\n handleChange({ target: { name: 'email', value: emailSuggestion.suggestion } });\n setEmailSuggestion({ suggestion: '', type: '' });\n setEmailSuggestionContext('', '');\n };\n\n const handleSuggestionClosed = () => setEmailSuggestion({ suggestion: '', type: '' });\n\n const renderEmailFeedback = () => {\n if (emailSuggestion.type === 'error') {\n return (\n <Alert variant=\"danger\" className=\"email-suggestion-alert-error mt-1\" icon={Error}>\n <span className=\"email-suggestion__text\">\n {formatMessage(messages['did.you.mean.alert.text'])}{' '}\n <Alert.Link\n href=\"#\"\n name=\"email\"\n onClick={handleSuggestionClick}\n >\n {emailSuggestion.suggestion}\n </Alert.Link>?\n <Icon src={Close} className=\"email-suggestion__close\" onClick={handleSuggestionClosed} tabIndex=\"0\" />\n </span>\n </Alert>\n );\n }\n return (\n <span id=\"email-warning\" className=\"small\">\n {formatMessage(messages['did.you.mean.alert.text'])}:{' '}\n <Alert.Link\n href=\"#\"\n name=\"email\"\n className=\"email-suggestion-alert-warning\"\n onClick={handleSuggestionClick}\n >\n {emailSuggestion.suggestion}\n </Alert.Link>?\n </span>\n );\n };\n\n return (\n <FormGroup\n borderClass={emailSuggestion.type === 'warning' ? 'yellow-border' : ''}\n maxLength={254} // Limit per RFCs is 254\n {...props}\n handleBlur={handleOnBlur}\n handleFocus={handleOnFocus}\n >\n {emailSuggestion.suggestion ? renderEmailFeedback() : null}\n </FormGroup>\n );\n};\n\nEmailField.defaultProps = {\n errorMessage: '',\n confirmEmailValue: null,\n};\n\nEmailField.propTypes = {\n errorMessage: PropTypes.string,\n value: PropTypes.string.isRequired,\n handleChange: PropTypes.func.isRequired,\n handleErrorChange: PropTypes.func.isRequired,\n confirmEmailValue: PropTypes.string,\n};\n\nexport default EmailField;\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
3
2
|
import { useIntl } from '@openedx/frontend-base';
|
|
4
3
|
import PropTypes from 'prop-types';
|
|
5
|
-
import { FormGroup } from '../../../common-components';
|
|
6
|
-
import { clearRegistrationBackendError, fetchRealtimeValidations } from '../../data/actions';
|
|
7
4
|
import validateName from './validator';
|
|
5
|
+
import { FormGroup } from '../../../common-components';
|
|
6
|
+
import { useRegisterContext } from '../../components/RegisterContext';
|
|
7
|
+
import { useFieldValidations } from '../../data/apiHook';
|
|
8
8
|
/**
|
|
9
9
|
* Name field wrapper. It accepts following handlers
|
|
10
10
|
* - handleChange for setting value change and
|
|
@@ -18,8 +18,15 @@ import validateName from './validator';
|
|
|
18
18
|
*/
|
|
19
19
|
const NameField = (props) => {
|
|
20
20
|
const { formatMessage } = useIntl();
|
|
21
|
-
const
|
|
22
|
-
const
|
|
21
|
+
const { setValidationsSuccess, setValidationsFailure, validationApiRateLimited, clearRegistrationBackendError, } = useRegisterContext();
|
|
22
|
+
const fieldValidationsMutation = useFieldValidations({
|
|
23
|
+
onSuccess: (data) => {
|
|
24
|
+
setValidationsSuccess(data);
|
|
25
|
+
},
|
|
26
|
+
onError: () => {
|
|
27
|
+
setValidationsFailure();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
23
30
|
const { handleErrorChange, shouldFetchUsernameSuggestions, } = props;
|
|
24
31
|
const handleOnBlur = (e) => {
|
|
25
32
|
const { value } = e.target;
|
|
@@ -28,12 +35,12 @@ const NameField = (props) => {
|
|
|
28
35
|
handleErrorChange('name', fieldError);
|
|
29
36
|
}
|
|
30
37
|
else if (shouldFetchUsernameSuggestions && !validationApiRateLimited) {
|
|
31
|
-
|
|
38
|
+
fieldValidationsMutation.mutate({ name: value });
|
|
32
39
|
}
|
|
33
40
|
};
|
|
34
41
|
const handleOnFocus = () => {
|
|
35
42
|
handleErrorChange('name', '');
|
|
36
|
-
|
|
43
|
+
clearRegistrationBackendError('name');
|
|
37
44
|
};
|
|
38
45
|
return (_jsx(FormGroup, Object.assign({}, props, { handleBlur: handleOnBlur, handleFocus: handleOnFocus })));
|
|
39
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NameField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/NameField/NameField.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"NameField.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/NameField/NameField.jsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,YAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;IAC1B,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IACpC,MAAM,EACJ,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,GAC9B,GAAG,kBAAkB,EAAE,CAAC;IAEzB,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;QACnD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAClB,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,qBAAqB,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;IACH,MAAM,EACJ,iBAAiB,EACjB,8BAA8B,GAC/B,GAAG,KAAK,CAAC;IAEV,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,8BAA8B,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACvE,wBAAwB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,SAAS,oBACJ,KAAK,IACT,UAAU,EAAE,YAAY,EACxB,WAAW,EAAE,aAAa,IAC1B,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,CAAC,YAAY,GAAG;IACvB,YAAY,EAAE,EAAE;IAChB,8BAA8B,EAAE,KAAK;CACtC,CAAC;AAEF,SAAS,CAAC,SAAS,GAAG;IACpB,YAAY,EAAE,SAAS,CAAC,MAAM;IAC9B,8BAA8B,EAAE,SAAS,CAAC,IAAI;IAC9C,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;IAClC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;IACvC,iBAAiB,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU;CAC7C,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["import { useIntl } from '@openedx/frontend-base';\nimport PropTypes from 'prop-types';\n\nimport validateName from './validator';\nimport { FormGroup } from '../../../common-components';\nimport { useRegisterContext } from '../../components/RegisterContext';\nimport { useFieldValidations } from '../../data/apiHook';\n\n/**\n * Name field wrapper. It accepts following handlers\n * - handleChange for setting value change and\n * - handleErrorChange for setting error\n *\n * It is responsible for\n * - Making backend call for generating username suggestions\n * - Performing name field validations\n * - Clearing error on focus\n * - Setting value on change\n */\nconst NameField = (props) => {\n const { formatMessage } = useIntl();\n const {\n setValidationsSuccess,\n setValidationsFailure,\n validationApiRateLimited,\n clearRegistrationBackendError,\n } = useRegisterContext();\n\n const fieldValidationsMutation = useFieldValidations({\n onSuccess: (data) => {\n setValidationsSuccess(data);\n },\n onError: () => {\n setValidationsFailure();\n },\n });\n const {\n handleErrorChange,\n shouldFetchUsernameSuggestions,\n } = props;\n\n const handleOnBlur = (e) => {\n const { value } = e.target;\n const fieldError = validateName(value, formatMessage);\n if (fieldError) {\n handleErrorChange('name', fieldError);\n } else if (shouldFetchUsernameSuggestions && !validationApiRateLimited) {\n fieldValidationsMutation.mutate({ name: value });\n }\n };\n\n const handleOnFocus = () => {\n handleErrorChange('name', '');\n clearRegistrationBackendError('name');\n };\n\n return (\n <FormGroup\n {...props}\n handleBlur={handleOnBlur}\n handleFocus={handleOnFocus}\n />\n );\n};\n\nNameField.defaultProps = {\n errorMessage: '',\n shouldFetchUsernameSuggestions: false,\n};\n\nNameField.propTypes = {\n errorMessage: PropTypes.string,\n shouldFetchUsernameSuggestions: PropTypes.bool,\n value: PropTypes.string.isRequired,\n handleChange: PropTypes.func.isRequired,\n handleErrorChange: PropTypes.func.isRequired,\n};\n\nexport default NameField;\n"]}
|
|
@@ -5,6 +5,7 @@ export const URL_REGEX = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-
|
|
|
5
5
|
export const HTML_REGEX = /<|>/u;
|
|
6
6
|
// regex from backend
|
|
7
7
|
export const INVALID_NAME_REGEX = /https?:\/\/(?:[-\w.]|(?:%[\da-fA-F]{2}))*/g;
|
|
8
|
+
export const MAX_FULL_NAME_LENGTH = 255;
|
|
8
9
|
const validateName = (value, formatMessage) => {
|
|
9
10
|
let fieldError = '';
|
|
10
11
|
if (!value.trim()) {
|
|
@@ -13,6 +14,9 @@ const validateName = (value, formatMessage) => {
|
|
|
13
14
|
else if (URL_REGEX.test(value) || HTML_REGEX.test(value) || INVALID_NAME_REGEX.test(value)) {
|
|
14
15
|
fieldError = formatMessage(messages['name.validation.message']);
|
|
15
16
|
}
|
|
17
|
+
else if (value && value.length > MAX_FULL_NAME_LENGTH) {
|
|
18
|
+
fieldError = formatMessage(messages['name.validation.length.message'], { limit: MAX_FULL_NAME_LENGTH });
|
|
19
|
+
}
|
|
16
20
|
return fieldError;
|
|
17
21
|
};
|
|
18
22
|
export default validateName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/NameField/validator.js"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,uFAAuF,CAAC,CAAC,wCAAwC;AAE1J,sBAAsB;AACtB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;IAC5C,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import messages from '../../messages';\n\n// regex more focused towards url matching\nexport const URL_REGEX = /[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?/gi; // eslint-disable-line no-useless-escape\n\n// regex for html tags\nexport const HTML_REGEX = /<|>/u;\n\n// regex from backend\nexport const INVALID_NAME_REGEX = /https?:\\/\\/(?:[-\\w.]|(?:%[\\da-fA-F]{2}))*/g;\n\nconst validateName = (value, formatMessage) => {\n let fieldError = '';\n if (!value.trim()) {\n fieldError = formatMessage(messages['empty.name.field.error']);\n } else if (URL_REGEX.test(value) || HTML_REGEX.test(value) || INVALID_NAME_REGEX.test(value)) {\n fieldError = formatMessage(messages['name.validation.message']);\n }\n return fieldError;\n};\n\nexport default validateName;\n"]}
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/register/RegistrationFields/NameField/validator.js"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,uFAAuF,CAAC,CAAC,wCAAwC;AAE1J,sBAAsB;AACtB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;IAC5C,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7F,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACxD,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import messages from '../../messages';\n\n// regex more focused towards url matching\nexport const URL_REGEX = /[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?/gi; // eslint-disable-line no-useless-escape\n\n// regex for html tags\nexport const HTML_REGEX = /<|>/u;\n\n// regex from backend\nexport const INVALID_NAME_REGEX = /https?:\\/\\/(?:[-\\w.]|(?:%[\\da-fA-F]{2}))*/g;\n\nexport const MAX_FULL_NAME_LENGTH = 255;\n\nconst validateName = (value, formatMessage) => {\n let fieldError = '';\n if (!value.trim()) {\n fieldError = formatMessage(messages['empty.name.field.error']);\n } else if (URL_REGEX.test(value) || HTML_REGEX.test(value) || INVALID_NAME_REGEX.test(value)) {\n fieldError = formatMessage(messages['name.validation.message']);\n } else if (value && value.length > MAX_FULL_NAME_LENGTH) {\n fieldError = formatMessage(messages['name.validation.length.message'], { limit: MAX_FULL_NAME_LENGTH });\n }\n return fieldError;\n};\n\nexport default validateName;\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect } from 'react';
|
|
3
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
4
3
|
import { useIntl } from '@openedx/frontend-base';
|
|
5
4
|
import { Button, Icon, IconButton } from '@openedx/paragon';
|
|
6
5
|
import { Close } from '@openedx/paragon/icons';
|
|
7
6
|
import PropTypes from 'prop-types';
|
|
7
|
+
import validateUsername from './validator';
|
|
8
8
|
import { FormGroup } from '../../../common-components';
|
|
9
|
-
import {
|
|
9
|
+
import { useRegisterContext } from '../../components/RegisterContext';
|
|
10
|
+
import { useFieldValidations } from '../../data/apiHook';
|
|
10
11
|
import messages from '../../messages';
|
|
11
|
-
import validateUsername from './validator';
|
|
12
12
|
/**
|
|
13
13
|
* Username field wrapper. It accepts following handlers
|
|
14
14
|
* - handleChange for setting value change and
|
|
@@ -23,13 +23,19 @@ import validateUsername from './validator';
|
|
|
23
23
|
*/
|
|
24
24
|
const UsernameField = (props) => {
|
|
25
25
|
const { formatMessage } = useIntl();
|
|
26
|
-
const dispatch = useDispatch();
|
|
27
26
|
const { value, errorMessage, handleChange, handleErrorChange, } = props;
|
|
28
27
|
let className = '';
|
|
29
28
|
let suggestedUsernameDiv = null;
|
|
30
29
|
let iconButton = null;
|
|
31
|
-
const usernameSuggestions =
|
|
32
|
-
const
|
|
30
|
+
const { usernameSuggestions, validationApiRateLimited, setValidationsSuccess, setValidationsFailure, clearUsernameSuggestions, clearRegistrationBackendError, } = useRegisterContext();
|
|
31
|
+
const fieldValidationsMutation = useFieldValidations({
|
|
32
|
+
onSuccess: (data) => {
|
|
33
|
+
setValidationsSuccess(data);
|
|
34
|
+
},
|
|
35
|
+
onError: () => {
|
|
36
|
+
setValidationsFailure();
|
|
37
|
+
},
|
|
38
|
+
});
|
|
33
39
|
/**
|
|
34
40
|
* We need to remove the placeholder from the field, adding a space will do that.
|
|
35
41
|
* This is needed because we are placing the username suggestions on top of the field.
|
|
@@ -46,7 +52,7 @@ const UsernameField = (props) => {
|
|
|
46
52
|
handleErrorChange('username', fieldError);
|
|
47
53
|
}
|
|
48
54
|
else if (!validationApiRateLimited) {
|
|
49
|
-
|
|
55
|
+
fieldValidationsMutation.mutate({ username });
|
|
50
56
|
}
|
|
51
57
|
};
|
|
52
58
|
const handleOnChange = (event) => {
|
|
@@ -61,7 +67,7 @@ const UsernameField = (props) => {
|
|
|
61
67
|
};
|
|
62
68
|
const handleOnFocus = (event) => {
|
|
63
69
|
const username = event.target.value;
|
|
64
|
-
|
|
70
|
+
clearUsernameSuggestions();
|
|
65
71
|
// If we added a space character to username field to display the suggestion
|
|
66
72
|
// remove it before user enters the input. This is to ensure user doesn't
|
|
67
73
|
// have a space prefixed to the username.
|
|
@@ -69,21 +75,21 @@ const UsernameField = (props) => {
|
|
|
69
75
|
handleChange({ target: { name: 'username', value: '' } });
|
|
70
76
|
}
|
|
71
77
|
handleErrorChange('username', '');
|
|
72
|
-
|
|
78
|
+
clearRegistrationBackendError('username');
|
|
73
79
|
};
|
|
74
80
|
const handleSuggestionClick = (event, suggestion = '') => {
|
|
75
81
|
event.preventDefault();
|
|
76
82
|
handleErrorChange('username', ''); // clear error
|
|
77
83
|
handleChange({ target: { name: 'username', value: suggestion } }); // to set suggestion as value
|
|
78
|
-
|
|
84
|
+
clearUsernameSuggestions();
|
|
79
85
|
};
|
|
80
86
|
const handleUsernameSuggestionClose = () => {
|
|
81
87
|
handleChange({ target: { name: 'username', value: '' } }); // to remove space in field
|
|
82
|
-
|
|
88
|
+
clearUsernameSuggestions();
|
|
83
89
|
};
|
|
84
|
-
const suggestedUsernames = () => (_jsxs("div", { className: className, children: [_jsx("span", { className: "text-gray username-suggestion--label", children: formatMessage(messages['registration.username.suggestion.label']) }), _jsx("div", { className: "username-scroll-suggested--form-field", children: usernameSuggestions.map((username, index) => (_jsx(Button, { type: "button", name: "username", variant: "outline-dark", className: "username-suggestions--chip data-hj-suppress", autoComplete: props.autoComplete, onClick: (e) => handleSuggestionClick(e, username), children: username }, `suggestion-${index.toString()}`))) }), iconButton] }));
|
|
90
|
+
const suggestedUsernames = () => (_jsxs("div", { className: className, role: "listbox", children: [_jsx("span", { className: "text-gray username-suggestion--label", children: formatMessage(messages['registration.username.suggestion.label']) }), _jsx("div", { className: "username-scroll-suggested--form-field", children: usernameSuggestions.map((username, index) => (_jsx(Button, { type: "button", name: "username", variant: "outline-dark", className: "username-suggestions--chip data-hj-suppress", autoComplete: props.autoComplete, tabIndex: 0, onClick: (e) => handleSuggestionClick(e, username), role: "option", children: username }, `suggestion-${index.toString()}`))) }), iconButton] }));
|
|
85
91
|
if (usernameSuggestions.length > 0 && errorMessage && value === ' ') {
|
|
86
|
-
className = 'username-
|
|
92
|
+
className = 'username-suggestions';
|
|
87
93
|
iconButton = _jsx(IconButton, { src: Close, iconAs: Icon, alt: "Close", onClick: () => handleUsernameSuggestionClose(), variant: "black", size: "sm", className: "username-suggestions__close__button" });
|
|
88
94
|
suggestedUsernameDiv = suggestedUsernames();
|
|
89
95
|
}
|
|
@@ -95,7 +101,7 @@ const UsernameField = (props) => {
|
|
|
95
101
|
else if (usernameSuggestions.length > 0 && errorMessage) {
|
|
96
102
|
suggestedUsernameDiv = suggestedUsernames();
|
|
97
103
|
}
|
|
98
|
-
return (_jsx(FormGroup, Object.assign({}, props, { handleChange: handleOnChange, handleFocus: handleOnFocus, handleBlur: handleOnBlur
|
|
104
|
+
return (_jsxs("div", { className: "username__form-group-wrapper", children: [suggestedUsernameDiv, _jsx(FormGroup, Object.assign({}, props, { handleChange: handleOnChange, handleFocus: handleOnFocus, handleBlur: handleOnBlur }))] }));
|
|
99
105
|
};
|
|
100
106
|
UsernameField.defaultProps = {
|
|
101
107
|
errorMessage: '',
|