diff --git a/src/base-component/AuthLargeLayout.jsx b/src/base-component/AuthLargeLayout.jsx index 12030e46..7e3c7681 100644 --- a/src/base-component/AuthLargeLayout.jsx +++ b/src/base-component/AuthLargeLayout.jsx @@ -1,46 +1,49 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from './messages'; -const AuthLargeLayout = ({ intl, username }) => ( -
-
- - {getConfig().SITE_NAME} - -
-
-
-

- {intl.formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} -

-

- {intl.formatMessage(messages['complete.your.profile.1'])} -
- {intl.formatMessage(messages['complete.your.profile.2'])} -
-

+const AuthLargeLayout = ({ username }) => { + const { formatMessage } = useIntl(); + + return ( +
+
+ + {getConfig().SITE_NAME} + +
+
+
+

+ {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} +

+

+ {formatMessage(messages['complete.your.profile.1'])} +
+ {formatMessage(messages['complete.your.profile.2'])} +
+

+
+
+ + + + + +
-
- - - - - -
-
-); + ); +}; AuthLargeLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, username: PropTypes.string.isRequired, }; -export default injectIntl(AuthLargeLayout); +export default AuthLargeLayout; diff --git a/src/base-component/AuthMediumLayout.jsx b/src/base-component/AuthMediumLayout.jsx index a118448e..970624f7 100644 --- a/src/base-component/AuthMediumLayout.jsx +++ b/src/base-component/AuthMediumLayout.jsx @@ -1,49 +1,52 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from './messages'; -const AuthMediumLayout = ({ intl, username }) => ( - <> -
-
-
- - {getConfig().SITE_NAME} - -
-
-
-

- {intl.formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} -

-

- {intl.formatMessage(messages['complete.your.profile.1'])} -
- {intl.formatMessage(messages['complete.your.profile.2'])} -
-

+const AuthMediumLayout = ({ username }) => { + const { formatMessage } = useIntl(); + + return ( + <> +
+
+
+ + {getConfig().SITE_NAME} + +
+
+
+

+ {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} +

+

+ {formatMessage(messages['complete.your.profile.1'])} +
+ {formatMessage(messages['complete.your.profile.2'])} +
+

+
+
+ + + + + +
-
- - - - - -
-
- -); + + ); +}; AuthMediumLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, username: PropTypes.string.isRequired, }; -export default injectIntl(AuthMediumLayout); +export default AuthMediumLayout; diff --git a/src/base-component/AuthSmallLayout.jsx b/src/base-component/AuthSmallLayout.jsx index 7717a521..35da5622 100644 --- a/src/base-component/AuthSmallLayout.jsx +++ b/src/base-component/AuthSmallLayout.jsx @@ -1,38 +1,41 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from './messages'; -const AuthSmallLayout = ({ intl, username }) => ( -
-
- - {getConfig().SITE_NAME} - -
-
-
-

- {intl.formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} -

-

- {intl.formatMessage(messages['complete.your.profile.1'])} -
- {intl.formatMessage(messages['complete.your.profile.2'])} -
-

+const AuthSmallLayout = ({ username }) => { + const { formatMessage } = useIntl(); + + return ( +
+
+ + {getConfig().SITE_NAME} + +
+
+
+

+ {formatMessage(messages['welcome.to.platform'], { siteName: getConfig().SITE_NAME, username })} +

+

+ {formatMessage(messages['complete.your.profile.1'])} +
+ {formatMessage(messages['complete.your.profile.2'])} +
+

+
-
-); + ); +}; AuthSmallLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, username: PropTypes.string.isRequired, }; -export default injectIntl(AuthSmallLayout); +export default AuthSmallLayout; diff --git a/src/base-component/LargeLayout.jsx b/src/base-component/LargeLayout.jsx index 59df50e7..0555dffe 100644 --- a/src/base-component/LargeLayout.jsx +++ b/src/base-component/LargeLayout.jsx @@ -1,46 +1,45 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import classNames from 'classnames'; -import PropTypes from 'prop-types'; import messages from './messages'; -const LargeLayout = ({ intl }) => ( -
-
- - {getConfig().SITE_NAME} - -
-
-

- {intl.formatMessage(messages['start.learning'])} -
- {intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} -
-

+const LargeLayout = () => { + const { formatMessage } = useIntl(); + + return ( +
+
+ + {getConfig().SITE_NAME} + +
+
+

+ {formatMessage(messages['start.learning'])} +
+ {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} +
+

+
+
+
+ + + + +
-
- - - - - -
-
-); - -LargeLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, + ); }; -export default injectIntl(LargeLayout); +export default LargeLayout; diff --git a/src/base-component/MediumLayout.jsx b/src/base-component/MediumLayout.jsx index 2bc46e73..d63d20c3 100644 --- a/src/base-component/MediumLayout.jsx +++ b/src/base-component/MediumLayout.jsx @@ -1,51 +1,50 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import classNames from 'classnames'; -import PropTypes from 'prop-types'; import messages from './messages'; -const MediumLayout = ({ intl }) => ( - <> -
-
-
- - {getConfig().SITE_NAME} - -
-
-
-

- {intl.formatMessage(messages['start.learning'])} - - {intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} - -

+const MediumLayout = () => { + const { formatMessage } = useIntl(); + + return ( + <> +
+
+
+ + {getConfig().SITE_NAME} + +
+
+
+

+ {formatMessage(messages['start.learning'])} + + {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} + +

+
+
+ + + + + +
-
- - - - - -
-
- -); - -MediumLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, + + ); }; -export default injectIntl(MediumLayout); +export default MediumLayout; diff --git a/src/base-component/SmallLayout.jsx b/src/base-component/SmallLayout.jsx index d185b1d1..12e568a4 100644 --- a/src/base-component/SmallLayout.jsx +++ b/src/base-component/SmallLayout.jsx @@ -1,40 +1,39 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image } from '@edx/paragon'; import classNames from 'classnames'; -import PropTypes from 'prop-types'; import messages from './messages'; -const SmallLayout = ({ intl }) => ( - -
-
- - {getConfig().SITE_NAME} - -
-
-

- {intl.formatMessage(messages['start.learning'])} - - {intl.formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} - -

-
-
- -); +const SmallLayout = () => { + const { formatMessage } = useIntl(); -SmallLayout.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, + return ( + +
+
+ + {getConfig().SITE_NAME} + +
+
+

+ {formatMessage(messages['start.learning'])} + + {formatMessage(messages['with.site.name'], { siteName: getConfig().SITE_NAME })} + +

+
+
+ + ); }; -export default injectIntl(SmallLayout); +export default SmallLayout; diff --git a/src/common-components/EnterpriseSSO.jsx b/src/common-components/EnterpriseSSO.jsx index 953edd8a..9005c12f 100644 --- a/src/common-components/EnterpriseSSO.jsx +++ b/src/common-components/EnterpriseSSO.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Button, Form, } from '@edx/paragon'; @@ -16,7 +16,7 @@ import messages from './messages'; * This component renders the Single sign-on (SSO) button only for the tpa provider passed * */ const EnterpriseSSO = (props) => { - const { intl } = props; + const { formatMessage } = useIntl(); const tpaProvider = props.provider; const disablePublicAccountCreation = getConfig().ALLOW_PUBLIC_ACCOUNT_CREATION === false; @@ -36,7 +36,7 @@ const EnterpriseSSO = (props) => {
-

{intl.formatMessage(messages['enterprisetpa.title.heading'], { providerName: tpaProvider.name })}

+

{formatMessage(messages['enterprisetpa.title.heading'], { providerName: tpaProvider.name })}

@@ -104,7 +104,6 @@ EnterpriseSSO.propTypes = { loginUrl: PropTypes.string, registerUrl: PropTypes.string, }), - intl: PropTypes.objectOf(PropTypes.object).isRequired, }; -export default injectIntl(EnterpriseSSO); +export default EnterpriseSSO; diff --git a/src/common-components/InstitutionLogistration.jsx b/src/common-components/InstitutionLogistration.jsx index b74e7804..41c56890 100644 --- a/src/common-components/InstitutionLogistration.jsx +++ b/src/common-components/InstitutionLogistration.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Button, Hyperlink, Icon } from '@edx/paragon'; import { Institution } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -32,8 +32,8 @@ export const RenderInstitutionButton = props => { * */ const InstitutionLogistration = props => { const lmsBaseUrl = getConfig().LMS_BASE_URL; + const { formatMessage } = useIntl(); const { - intl, secondaryProviders, headingTitle, } = props; @@ -46,7 +46,7 @@ const InstitutionLogistration = props => { {headingTitle}

- {intl.formatMessage(messages['institution.login.page.sub.heading'])} + {formatMessage(messages['institution.login.page.sub.heading'])}

@@ -95,7 +95,6 @@ RenderInstitutionButton.defaultProps = { InstitutionLogistration.propTypes = { ...LogistrationProps, - intl: PropTypes.objectOf(PropTypes.object).isRequired, headingTitle: PropTypes.string, }; InstitutionLogistration.defaultProps = { @@ -103,4 +102,4 @@ InstitutionLogistration.defaultProps = { headingTitle: '', }; -export default injectIntl(InstitutionLogistration); +export default InstitutionLogistration; diff --git a/src/common-components/Logistration.jsx b/src/common-components/Logistration.jsx index aef2b8f4..62ca9207 100644 --- a/src/common-components/Logistration.jsx +++ b/src/common-components/Logistration.jsx @@ -4,7 +4,7 @@ import { connect } from 'react-redux'; import { getConfig } from '@edx/frontend-platform'; import { sendPageEvent, sendTrackEvent } from '@edx/frontend-platform/analytics'; import { getAuthService } from '@edx/frontend-platform/auth'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Icon, Tab, @@ -26,11 +26,12 @@ import { import messages from './messages'; const Logistration = (props) => { - const { intl, selectedPage, tpaProviders } = props; + const { selectedPage, tpaProviders } = props; const tpaHint = getTpaHint(); const { providers, secondaryProviders, } = tpaProviders; + const { formatMessage } = useIntl(); const [institutionLogin, setInstitutionLogin] = useState(false); const [key, setKey] = useState(''); const disablePublicAccountCreation = getConfig().ALLOW_PUBLIC_ACCOUNT_CREATION === false; @@ -66,8 +67,8 @@ const Logistration = (props) => { {selectedPage === LOGIN_PAGE - ? intl.formatMessage(messages['logistration.sign.in']) - : intl.formatMessage(messages['logistration.register'])} + ? formatMessage(messages['logistration.sign.in']) + : formatMessage(messages['logistration.register'])}
); @@ -91,7 +92,7 @@ const Logistration = (props) => { )}
{!institutionLogin && ( -

{intl.formatMessage(messages['logistration.sign.in'])}

+

{formatMessage(messages['logistration.sign.in'])}

)}
@@ -108,8 +109,8 @@ const Logistration = (props) => { : (!isValidTpaHint() && ( <> - - + + ))} @@ -134,7 +135,6 @@ const Logistration = (props) => { }; Logistration.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, selectedPage: PropTypes.string, backupRegistrationForm: PropTypes.func.isRequired, tpaProviders: PropTypes.shape({ @@ -163,4 +163,4 @@ export default connect( { backupRegistrationForm, }, -)(injectIntl(Logistration)); +)(Logistration); diff --git a/src/common-components/PasswordField.jsx b/src/common-components/PasswordField.jsx index 5f557f5d..33d9b297 100644 --- a/src/common-components/PasswordField.jsx +++ b/src/common-components/PasswordField.jsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Form, Icon, IconButton, OverlayTrigger, Tooltip, useToggle, } from '@edx/paragon'; @@ -13,7 +13,7 @@ import { LETTER_REGEX, NUMBER_REGEX } from '../data/constants'; import messages from './messages'; const PasswordField = (props) => { - const { formatMessage } = props.intl; + const { formatMessage } = useIntl(); const [isPasswordHidden, setHiddenTrue, setHiddenFalse] = useToggle(true); const [showTooltip, setShowTooltip] = useState(false); @@ -100,11 +100,10 @@ PasswordField.propTypes = { handleBlur: PropTypes.func, handleFocus: PropTypes.func, handleChange: PropTypes.func, - intl: PropTypes.objectOf(PropTypes.object).isRequired, name: PropTypes.string.isRequired, showRequirements: PropTypes.bool, value: PropTypes.string.isRequired, autoComplete: PropTypes.string, }; -export default injectIntl(PasswordField); +export default PasswordField; diff --git a/src/common-components/SocialAuthProviders.jsx b/src/common-components/SocialAuthProviders.jsx index b08e9a57..93f687e7 100644 --- a/src/common-components/SocialAuthProviders.jsx +++ b/src/common-components/SocialAuthProviders.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { faSignInAlt } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import PropTypes from 'prop-types'; @@ -10,7 +10,8 @@ import { LOGIN_PAGE, SUPPORTED_ICON_CLASSES } from '../data/constants'; import messages from './messages'; function SocialAuthProviders(props) { - const { intl, referrer, socialAuthProviders } = props; + const { formatMessage } = useIntl(); + const { referrer, socialAuthProviders } = props; function handleSubmit(e) { e.preventDefault(); @@ -45,8 +46,8 @@ function SocialAuthProviders(props) { {referrer === LOGIN_PAGE - ? intl.formatMessage(messages['sso.sign.in.with'], { providerName: provider.name }) - : intl.formatMessage(messages['sso.create.account.using'], { providerName: provider.name })} + ? formatMessage(messages['sso.sign.in.with'], { providerName: provider.name }) + : formatMessage(messages['sso.create.account.using'], { providerName: provider.name })} )); @@ -60,7 +61,6 @@ SocialAuthProviders.defaultProps = { }; SocialAuthProviders.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, referrer: PropTypes.string, socialAuthProviders: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.string, @@ -72,4 +72,4 @@ SocialAuthProviders.propTypes = { })), }; -export default injectIntl(SocialAuthProviders); +export default SocialAuthProviders; diff --git a/src/common-components/ThirdPartyAuthAlert.jsx b/src/common-components/ThirdPartyAuthAlert.jsx index 2537fbd9..39e7c947 100644 --- a/src/common-components/ThirdPartyAuthAlert.jsx +++ b/src/common-components/ThirdPartyAuthAlert.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Alert } from '@edx/paragon'; import PropTypes from 'prop-types'; @@ -9,14 +9,15 @@ import { LOGIN_PAGE, REGISTER_PAGE } from '../data/constants'; import messages from './messages'; const ThirdPartyAuthAlert = (props) => { - const { currentProvider, intl, referrer } = props; + const { formatMessage } = useIntl(); + const { currentProvider, referrer } = props; const platformName = getConfig().SITE_NAME; let message; if (referrer === LOGIN_PAGE) { - message = intl.formatMessage(messages['login.third.party.auth.account.not.linked'], { currentProvider, platformName }); + message = formatMessage(messages['login.third.party.auth.account.not.linked'], { currentProvider, platformName }); } else { - message = intl.formatMessage(messages['register.third.party.auth.account.not.linked'], { currentProvider, platformName }); + message = formatMessage(messages['register.third.party.auth.account.not.linked'], { currentProvider, platformName }); } if (!currentProvider) { @@ -27,12 +28,12 @@ const ThirdPartyAuthAlert = (props) => { <> {referrer === REGISTER_PAGE ? ( - {intl.formatMessage(messages['tpa.alert.heading'])} + {formatMessage(messages['tpa.alert.heading'])} ) : null}

{ message }

{referrer === REGISTER_PAGE ? ( -

{intl.formatMessage(messages['registration.using.tpa.form.heading'])}

+

{formatMessage(messages['registration.using.tpa.form.heading'])}

) : null} ); @@ -45,8 +46,7 @@ ThirdPartyAuthAlert.defaultProps = { ThirdPartyAuthAlert.propTypes = { currentProvider: PropTypes.string, - intl: PropTypes.objectOf(PropTypes.object).isRequired, referrer: PropTypes.string, }; -export default injectIntl(ThirdPartyAuthAlert); +export default ThirdPartyAuthAlert; diff --git a/src/forgot-password/ForgotPasswordAlert.jsx b/src/forgot-password/ForgotPasswordAlert.jsx index 9b9a76c4..38a1806b 100644 --- a/src/forgot-password/ForgotPasswordAlert.jsx +++ b/src/forgot-password/ForgotPasswordAlert.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n'; +import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n'; import { Alert } from '@edx/paragon'; import { CheckCircle, Error } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -13,9 +13,10 @@ import { PASSWORD_RESET } from '../reset-password/data/constants'; import messages from './messages'; const ForgotPasswordAlert = (props) => { - const { email, emailError, intl } = props; + const { formatMessage } = useIntl(); + const { email, emailError } = props; let message = ''; - let heading = intl.formatMessage(messages['forgot.password.error.alert.title']); + let heading = formatMessage(messages['forgot.password.error.alert.title']); let { status } = props; if (emailError) { @@ -24,7 +25,7 @@ const ForgotPasswordAlert = (props) => { switch (status) { case COMPLETE_STATE: - heading = intl.formatMessage(messages['confirmation.message.title']); + heading = formatMessage(messages['confirmation.message.title']); message = ( { email: {email}, supportLink: ( - {intl.formatMessage(messages['confirmation.support.link'])} + {formatMessage(messages['confirmation.support.link'])} ), }} @@ -44,26 +45,26 @@ const ForgotPasswordAlert = (props) => { ); break; case INTERNAL_SERVER_ERROR: - message = intl.formatMessage(messages['internal.server.error']); + message = formatMessage(messages['internal.server.error']); break; case FORBIDDEN_STATE: - heading = intl.formatMessage(messages['forgot.password.error.message.title']); - message = intl.formatMessage(messages['forgot.password.request.in.progress.message']); + heading = formatMessage(messages['forgot.password.error.message.title']); + message = formatMessage(messages['forgot.password.request.in.progress.message']); break; case FORM_SUBMISSION_ERROR: - message = intl.formatMessage(messages['extend.field.errors'], { emailError }); + message = formatMessage(messages['extend.field.errors'], { emailError }); break; case PASSWORD_RESET.INVALID_TOKEN: - heading = intl.formatMessage(messages['invalid.token.heading']); - message = intl.formatMessage(messages['invalid.token.error.message']); + heading = formatMessage(messages['invalid.token.heading']); + message = formatMessage(messages['invalid.token.error.message']); break; case PASSWORD_RESET.FORBIDDEN_REQUEST: - heading = intl.formatMessage(messages['token.validation.rate.limit.error.heading']); - message = intl.formatMessage(messages['token.validation.rate.limit.error']); + heading = formatMessage(messages['token.validation.rate.limit.error.heading']); + message = formatMessage(messages['token.validation.rate.limit.error']); break; case PASSWORD_RESET.INTERNAL_SERVER_ERROR: - heading = intl.formatMessage(messages['token.validation.internal.sever.error.heading']); - message = intl.formatMessage(messages['token.validation.internal.sever.error']); + heading = formatMessage(messages['token.validation.internal.sever.error.heading']); + message = formatMessage(messages['token.validation.internal.sever.error']); break; default: break; @@ -93,8 +94,7 @@ ForgotPasswordAlert.defaultProps = { ForgotPasswordAlert.propTypes = { status: PropTypes.string.isRequired, email: PropTypes.string, - intl: PropTypes.objectOf(PropTypes.object).isRequired, emailError: PropTypes.string, }; -export default injectIntl(ForgotPasswordAlert); +export default ForgotPasswordAlert; diff --git a/src/forgot-password/ForgotPasswordPage.jsx b/src/forgot-password/ForgotPasswordPage.jsx index c0f34927..f2b92c0f 100644 --- a/src/forgot-password/ForgotPasswordPage.jsx +++ b/src/forgot-password/ForgotPasswordPage.jsx @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import { getConfig } from '@edx/frontend-platform'; import { sendPageEvent, sendTrackEvent } from '@edx/frontend-platform/analytics'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Form, Hyperlink, @@ -30,9 +30,10 @@ const ForgotPasswordPage = (props) => { const platformName = getConfig().SITE_NAME; const emailRegex = new RegExp(VALID_EMAIL_REGEX, 'i'); const { - intl, status, submitState, emailValidationError, + status, submitState, emailValidationError, } = props; + const { formatMessage } = useIntl(); const [email, setEmail] = useState(props.email); const [bannerEmail, setBannerEmail] = useState(''); const [formErrors, setFormErrors] = useState(''); @@ -58,9 +59,9 @@ const ForgotPasswordPage = (props) => { let error = ''; if (value === '') { - error = intl.formatMessage(messages['forgot.password.empty.email.field.error']); + error = formatMessage(messages['forgot.password.empty.email.field.error']); } else if (!emailRegex.test(value)) { - error = intl.formatMessage(messages['forgot.password.page.invalid.email.message']); + error = formatMessage(messages['forgot.password.page.invalid.email.message']); } return error; @@ -89,14 +90,14 @@ const ForgotPasswordPage = (props) => { const tabTitle = (
- {intl.formatMessage(messages['sign.in.text'])} + {formatMessage(messages['sign.in.text'])}
); return ( - {intl.formatMessage(messages['forgot.password.page.title'], + <title>{formatMessage(messages['forgot.password.page.title'], { siteName: getConfig().SITE_NAME })} @@ -111,13 +112,13 @@ const ForgotPasswordPage = (props) => {

- {intl.formatMessage(messages['forgot.password.page.heading'])} + {formatMessage(messages['forgot.password.page.heading'])}

- {intl.formatMessage(messages['forgot.password.page.instructions'])} + {formatMessage(messages['forgot.password.page.instructions'])}

{ handleChange={(e) => setEmail(e.target.value)} handleBlur={handleBlur} handleFocus={handleFocus} - helpText={[intl.formatMessage(messages['forgot.password.email.help.text'], { platformName })]} + helpText={[formatMessage(messages['forgot.password.email.help.text'], { platformName })]} /> { className="forgot-password-button-width" state={submitState} labels={{ - default: intl.formatMessage(messages['forgot.password.page.submit.button']), + default: formatMessage(messages['forgot.password.page.submit.button']), pending: '', }} onClick={handleSubmit} @@ -150,11 +151,11 @@ const ForgotPasswordPage = (props) => { target="_blank" showLaunchIcon={false} > - {intl.formatMessage(messages['need.help.sign.in.text'])} + {formatMessage(messages['need.help.sign.in.text'])} )}

- {intl.formatMessage(messages['additional.help.text'], { platformName })} + {formatMessage(messages['additional.help.text'], { platformName })} {getConfig().INFO_EMAIL} @@ -170,7 +171,6 @@ ForgotPasswordPage.propTypes = { email: PropTypes.string, emailValidationError: PropTypes.string, forgotPassword: PropTypes.func.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, setForgotPasswordFormData: PropTypes.func.isRequired, status: PropTypes.string, submitState: PropTypes.string, @@ -189,4 +189,4 @@ export default connect( forgotPassword, setForgotPasswordFormData, }, -)(injectIntl(ForgotPasswordPage)); +)(ForgotPasswordPage); diff --git a/src/login/AccountActivationMessage.jsx b/src/login/AccountActivationMessage.jsx index 35bbf230..2832ddf8 100644 --- a/src/login/AccountActivationMessage.jsx +++ b/src/login/AccountActivationMessage.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n'; +import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n'; import { Alert } from '@edx/paragon'; import { CheckCircle, Error } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -10,7 +10,8 @@ import { ACCOUNT_ACTIVATION_MESSAGE } from './data/constants'; import messages from './messages'; const AccountActivationMessage = (props) => { - const { intl, messageType } = props; + const { formatMessage } = useIntl(); + const { messageType } = props; const variant = messageType === ACCOUNT_ACTIVATION_MESSAGE.ERROR ? 'danger' : messageType; const activationOrVerification = getConfig().MARKETING_EMAILS_OPT_IN ? 'confirmation' : 'activation'; @@ -25,22 +26,22 @@ const AccountActivationMessage = (props) => { switch (messageType) { case ACCOUNT_ACTIVATION_MESSAGE.SUCCESS: { - heading = intl.formatMessage(messages[`account.${activationOrVerification}.success.message.title`]); - activationMessage = {intl.formatMessage(messages[`account.${activationOrVerification}.success.message`])}; + heading = formatMessage(messages[`account.${activationOrVerification}.success.message.title`]); + activationMessage = {formatMessage(messages[`account.${activationOrVerification}.success.message`])}; break; } case ACCOUNT_ACTIVATION_MESSAGE.INFO: { - activationMessage = intl.formatMessage(messages[`account.${activationOrVerification}.info.message`]); + activationMessage = formatMessage(messages[`account.${activationOrVerification}.info.message`]); break; } case ACCOUNT_ACTIVATION_MESSAGE.ERROR: { const supportLink = ( - {intl.formatMessage(messages['account.activation.support.link'])} + {formatMessage(messages['account.activation.support.link'])} ); - heading = intl.formatMessage(messages[`account.${activationOrVerification}.error.message.title`]); + heading = formatMessage(messages[`account.${activationOrVerification}.error.message.title`]); activationMessage = ( { AccountActivationMessage.propTypes = { messageType: PropTypes.string.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, }; -export default injectIntl(AccountActivationMessage); +export default AccountActivationMessage; diff --git a/src/login/ChangePasswordPrompt.jsx b/src/login/ChangePasswordPrompt.jsx index 324372e8..2ce7cfca 100644 --- a/src/login/ChangePasswordPrompt.jsx +++ b/src/login/ChangePasswordPrompt.jsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { ActionRow, ModalDialog, useToggle, } from '@edx/paragon'; @@ -14,7 +14,7 @@ import { updatePathWithQueryParams } from '../data/utils'; import useMobileResponsive from '../data/utils/useMobileResponsive'; import messages from './messages'; -const ChangePasswordPrompt = ({ intl, variant, redirectUrl }) => { +const ChangePasswordPrompt = ({ variant, redirectUrl }) => { const isMobileView = useMobileResponsive(); const [redirectToResetPasswordPage, setRedirectToResetPasswordPage] = useState(false); const handlers = { @@ -28,6 +28,7 @@ const ChangePasswordPrompt = ({ intl, variant, redirectUrl }) => { }; // eslint-disable-next-line no-unused-vars const [isOpen, open, close] = useToggle(true, handlers); + const { formatMessage } = useIntl(); if (redirectToResetPasswordPage) { return ; @@ -42,11 +43,11 @@ const ChangePasswordPrompt = ({ intl, variant, redirectUrl }) => { > - {intl.formatMessage(messages[`password.security.${variant}.title`])} + {formatMessage(messages[`password.security.${variant}.title`])} - {intl.formatMessage(messages[`password.security.${variant}.body`])} + {formatMessage(messages[`password.security.${variant}.body`])} { > {variant === 'nudge' ? ( - {intl.formatMessage(messages['password.security.close.button'])} + {formatMessage(messages['password.security.close.button'])} ) : null} { )} to={updatePathWithQueryParams(RESET_PAGE)} > - {intl.formatMessage(messages['password.security.redirect.to.reset.password.button'])} + {formatMessage(messages['password.security.redirect.to.reset.password.button'])} @@ -80,9 +81,8 @@ ChangePasswordPrompt.defaultProps = { }; ChangePasswordPrompt.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, variant: PropTypes.oneOf(['nudge', 'block']), redirectUrl: PropTypes.string, }; -export default injectIntl(ChangePasswordPrompt); +export default ChangePasswordPrompt; diff --git a/src/login/LoginFailure.jsx b/src/login/LoginFailure.jsx index 3cd635c4..f2a145e9 100644 --- a/src/login/LoginFailure.jsx +++ b/src/login/LoginFailure.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; import { getAuthService } from '@edx/frontend-platform/auth'; -import { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n'; +import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n'; import { Alert, Hyperlink } from '@edx/paragon'; import { Error } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -24,13 +24,13 @@ import { import messages from './messages'; const LoginFailureMessage = (props) => { - const { intl } = props; + const { formatMessage } = useIntl(); const { context, errorCode } = props.loginError; const authService = getAuthService(); let errorList; let resetLink = ( - {intl.formatMessage(messages['login.incorrect.credentials.error.reset.link.text'])} + {formatMessage(messages['login.incorrect.credentials.error.reset.link.text'])} ); @@ -38,19 +38,19 @@ const LoginFailureMessage = (props) => { case NON_COMPLIANT_PASSWORD_EXCEPTION: { errorList = ( <> - {intl.formatMessage(messages['non.compliant.password.title'])} -

{intl.formatMessage(messages['non.compliant.password.message'])}

+ {formatMessage(messages['non.compliant.password.title'])} +

{formatMessage(messages['non.compliant.password.message'])}

); break; } case FORBIDDEN_REQUEST: - errorList =

{intl.formatMessage(messages['login.rate.limit.reached.message'])}

; + errorList =

{formatMessage(messages['login.rate.limit.reached.message'])}

; break; case INACTIVE_USER: { const supportLink = ( - {intl.formatMessage(messages['contact.support.link'], { platformName: context.platformName })} + {formatMessage(messages['contact.support.link'], { platformName: context.platformName })} ); errorList = ( @@ -74,7 +74,7 @@ const LoginFailureMessage = (props) => { const url = `${getConfig().LMS_BASE_URL}/dashboard/?tpa_hint=${context.tpaHint}`; const tpaLink = ( - {intl.formatMessage(messages['tpa.account.link'], { provider: context.provider })} + {formatMessage(messages['tpa.account.link'], { provider: context.provider })} ); errorList = ( @@ -90,12 +90,12 @@ const LoginFailureMessage = (props) => { break; } case INVALID_FORM: - errorList =

{intl.formatMessage(messages['login.form.invalid.error.message'])}

; + errorList =

{formatMessage(messages['login.form.invalid.error.message'])}

; break; case FAILED_LOGIN_ATTEMPT: { resetLink = ( - {intl.formatMessage(messages['login.incorrect.credentials.error.before.account.blocked.text'])} + {formatMessage(messages['login.incorrect.credentials.error.before.account.blocked.text'])} ); errorList = ( @@ -124,7 +124,7 @@ const LoginFailureMessage = (props) => { case ACCOUNT_LOCKED_OUT: { errorList = ( <> -

{intl.formatMessage(messages['account.locked.out.message.1'])}

+

{formatMessage(messages['account.locked.out.message.1'])}

{ } case INCORRECT_EMAIL_PASSWORD: if (context.failureCount <= 1) { - errorList =

{intl.formatMessage(messages['login.incorrect.credentials.error'])}

; + errorList =

{formatMessage(messages['login.incorrect.credentials.error'])}

; } else if (context.failureCount === 2) { errorList = (

@@ -167,13 +167,13 @@ const LoginFailureMessage = (props) => { return ; case INTERNAL_SERVER_ERROR: default: - errorList =

{intl.formatMessage(messages['internal.server.error.message'])}

; + errorList =

{formatMessage(messages['internal.server.error.message'])}

; break; } return ( - {intl.formatMessage(messages['login.failure.header.title'])} + {formatMessage(messages['login.failure.header.title'])} { errorList } ); @@ -193,7 +193,6 @@ LoginFailureMessage.propTypes = { errorCode: PropTypes.string, redirectUrl: PropTypes.string, }), - intl: PropTypes.objectOf(PropTypes.object).isRequired, }; -export default injectIntl(LoginFailureMessage); +export default LoginFailureMessage; diff --git a/src/progressive-profiling/ProgressiveProfiling.jsx b/src/progressive-profiling/ProgressiveProfiling.jsx index aa0abcfb..7341d82c 100644 --- a/src/progressive-profiling/ProgressiveProfiling.jsx +++ b/src/progressive-profiling/ProgressiveProfiling.jsx @@ -10,7 +10,7 @@ import { getAuthenticatedUser, hydrateAuthenticatedUser, } from '@edx/frontend-platform/auth'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { getLoggingService } from '@edx/frontend-platform/logging'; import { Alert, @@ -40,10 +40,12 @@ import ProgressiveProfilingPageModal from './ProgressiveProfilingPageModal'; const ProgressiveProfiling = (props) => { const { - formRenderState, intl, submitState, showError, location, + formRenderState, submitState, showError, location, } = props; const enablePersonalizedRecommendations = getConfig().ENABLE_PERSONALIZED_RECOMMENDATIONS; const registrationResponse = location.state?.registrationResult; + + const { formatMessage } = useIntl(); const [ready, setReady] = useState(false); const [registrationResult, setRegistrationResult] = useState({ redirectUrl: '' }); const [values, setValues] = useState({}); @@ -160,7 +162,7 @@ const ProgressiveProfiling = (props) => { <> - {intl.formatMessage(messages['progressive.profiling.page.title'], + <title>{formatMessage(messages['progressive.profiling.page.title'], { siteName: getConfig().SITE_NAME })} @@ -176,13 +178,13 @@ const ProgressiveProfiling = (props) => { ) : null}
-

{intl.formatMessage(messages['progressive.profiling.page.heading'])}

+

{formatMessage(messages['progressive.profiling.page.heading'])}


{showError ? ( - {intl.formatMessage(messages['welcome.page.error.heading'])} -

{intl.formatMessage(messages['welcome.page.error.message'])}

+ {formatMessage(messages['welcome.page.error.heading'])} +

{formatMessage(messages['welcome.page.error.message'])}

) : null} @@ -197,7 +199,7 @@ const ProgressiveProfiling = (props) => { showLaunchIcon={false} onClick={() => (sendTrackEvent('edx.bi.welcome.page.support.link.clicked'))} > - {intl.formatMessage(messages['optional.fields.information.link'])} + {formatMessage(messages['optional.fields.information.link'])} )} @@ -208,7 +210,7 @@ const ProgressiveProfiling = (props) => { className="login-button-width" state={submitState} labels={{ - default: showRecommendationsPage ? intl.formatMessage(messages['optional.fields.next.button']) : intl.formatMessage(messages['optional.fields.submit.button']), + default: showRecommendationsPage ? formatMessage(messages['optional.fields.next.button']) : formatMessage(messages['optional.fields.submit.button']), pending: '', }} onClick={handleSubmit} @@ -219,7 +221,7 @@ const ProgressiveProfiling = (props) => { type="submit" variant="link" labels={{ - default: intl.formatMessage(messages['optional.fields.skip.button']), + default: formatMessage(messages['optional.fields.skip.button']), }} onClick={handleSkip} onMouseDown={(e) => e.preventDefault()} @@ -234,7 +236,6 @@ const ProgressiveProfiling = (props) => { ProgressiveProfiling.propTypes = { formRenderState: PropTypes.string.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, location: PropTypes.shape({ state: PropTypes.object, }), @@ -263,4 +264,4 @@ export default connect( { saveUserProfile, }, -)(injectIntl(ProgressiveProfiling)); +)(ProgressiveProfiling); diff --git a/src/progressive-profiling/ProgressiveProfilingPageModal.jsx b/src/progressive-profiling/ProgressiveProfilingPageModal.jsx index 11689a94..c53c24dc 100644 --- a/src/progressive-profiling/ProgressiveProfilingPageModal.jsx +++ b/src/progressive-profiling/ProgressiveProfilingPageModal.jsx @@ -1,14 +1,15 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { ActionRow, Button, ModalDialog } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from './messages'; const ProgressiveProfilingPageModal = (props) => { - const { intl, isOpen, redirectUrl } = props; + const { formatMessage } = useIntl(); + const { isOpen, redirectUrl } = props; const platformName = getConfig().SITE_NAME; const handleSubmit = (e) => { @@ -18,7 +19,7 @@ const ProgressiveProfilingPageModal = (props) => { return ( {}} size="sm" @@ -27,18 +28,18 @@ const ProgressiveProfilingPageModal = (props) => { > - {intl.formatMessage(messages['modal.title'])} + {formatMessage(messages['modal.title'])} - {intl.formatMessage(messages['modal.description'])} + {formatMessage(messages['modal.description'])} @@ -47,7 +48,6 @@ const ProgressiveProfilingPageModal = (props) => { }; ProgressiveProfilingPageModal.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, isOpen: PropTypes.bool, redirectUrl: PropTypes.string.isRequired, }; @@ -56,4 +56,4 @@ ProgressiveProfilingPageModal.defaultProps = { isOpen: false, }; -export default injectIntl(ProgressiveProfilingPageModal); +export default ProgressiveProfilingPageModal; diff --git a/src/recommendations/RecommendationCard.jsx b/src/recommendations/RecommendationCard.jsx index c083172f..2f73bc83 100644 --- a/src/recommendations/RecommendationCard.jsx +++ b/src/recommendations/RecommendationCard.jsx @@ -1,6 +1,5 @@ import React from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; import { Card, Hyperlink } from '@edx/paragon'; import PropTypes from 'prop-types'; @@ -84,4 +83,4 @@ RecommendationCard.defaultProps = { userId: null, }; -export default injectIntl(RecommendationCard); +export default RecommendationCard; diff --git a/src/recommendations/RecommendationsList.jsx b/src/recommendations/RecommendationsList.jsx index ecd20fcc..61f49ce2 100644 --- a/src/recommendations/RecommendationsList.jsx +++ b/src/recommendations/RecommendationsList.jsx @@ -1,6 +1,5 @@ import React from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; import { Container } from '@edx/paragon'; import PropTypes from 'prop-types'; @@ -53,4 +52,4 @@ RecommendationsList.defaultProps = { userId: null, }; -export default injectIntl(RecommendationsList); +export default RecommendationsList; diff --git a/src/recommendations/RecommendationsPage.jsx b/src/recommendations/RecommendationsPage.jsx index 8ac2bdcb..ae109c39 100644 --- a/src/recommendations/RecommendationsPage.jsx +++ b/src/recommendations/RecommendationsPage.jsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Hyperlink, Image, Spinner, StatefulButton, } from '@edx/paragon'; @@ -17,11 +17,12 @@ import RecommendationsList from './RecommendationsList'; import { trackRecommendationsViewed } from './track'; const RecommendationsPage = (props) => { - const { intl, location } = props; + const { location } = props; const registrationResponse = location.state?.registrationResult; const userId = location.state?.userId; const DASHBOARD_URL = getConfig().LMS_BASE_URL.concat(DEFAULT_REDIRECT_URL); + const { formatMessage } = useIntl(); const [isLoading, setIsLoading] = useState(true); const [recommendations, setRecommendations] = useState([]); const [algoliaRecommendations, setAlgoliaRecommendations] = useState([]); @@ -94,7 +95,7 @@ const RecommendationsPage = (props) => { return ( <> - {intl.formatMessage(messages['recommendation.page.title'], + <title>{formatMessage(messages['recommendation.page.title'], { siteName: getConfig().SITE_NAME })} @@ -108,7 +109,7 @@ const RecommendationsPage = (props) => { {(!isLoading && recommendations.length === RECOMMENDATIONS_COUNT) ? (
@@ -118,7 +119,7 @@ const RecommendationsPage = (props) => { type="submit" variant="brand" labels={{ - default: intl.formatMessage(messages['recommendation.skip.button']), + default: formatMessage(messages['recommendation.skip.button']), }} onClick={handleSkip} /> @@ -134,7 +135,6 @@ const RecommendationsPage = (props) => { }; RecommendationsPage.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, location: PropTypes.shape({ state: PropTypes.object, }), @@ -145,4 +145,4 @@ RecommendationsPage.defaultProps = { location: { state: {} }, }; -export default injectIntl(RecommendationsPage); +export default RecommendationsPage; diff --git a/src/register/ConfigurableRegistrationForm.jsx b/src/register/ConfigurableRegistrationForm.jsx index ffec16c1..49788281 100644 --- a/src/register/ConfigurableRegistrationForm.jsx +++ b/src/register/ConfigurableRegistrationForm.jsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; import FormFieldRenderer from '../field-renderer'; @@ -24,13 +24,13 @@ import CountryField from './registrationFields/CountryField'; * it for edX. * */ const ConfigurableRegistrationForm = (props) => { + const { formatMessage } = useIntl(); const { countryList, email, fieldDescriptions, fieldErrors, formFields, - intl, setFieldErrors, setFocusedField, setFormFields, @@ -72,7 +72,7 @@ const ConfigurableRegistrationForm = (props) => { let error = ''; if (name === 'country') { const countryValidation = validateCountryField( - value.trim(), countryList, intl.formatMessage(messages['empty.country.field.error']), + value.trim(), countryList, formatMessage(messages['empty.country.field.error']), ); const { countryCode, displayValue } = countryValidation; error = countryValidation.error; @@ -80,7 +80,7 @@ const ConfigurableRegistrationForm = (props) => { } else if (!value || !value.trim()) { error = fieldDescriptions[name].error_message; } else if (name === 'confirm_email' && value !== email) { - error = intl.formatMessage(messages['email.do.not.match']); + error = formatMessage(messages['email.do.not.match']); } setFocusedField(null); setFieldErrors(prevErrors => ({ ...prevErrors, [name]: error })); @@ -167,7 +167,7 @@ const ConfigurableRegistrationForm = (props) => { { + const { formatMessage } = useIntl(); const { - context, errorCode, failureCount, intl, + context, errorCode, failureCount, } = props; useEffect(() => { @@ -25,22 +26,22 @@ const RegistrationFailureMessage = (props) => { let errorMessage; switch (errorCode) { case INTERNAL_SERVER_ERROR: - errorMessage = intl.formatMessage(messages['registration.request.server.error']); + errorMessage = formatMessage(messages['registration.request.server.error']); break; case FORBIDDEN_REQUEST: - errorMessage = intl.formatMessage(messages['registration.rate.limit.error']); + errorMessage = formatMessage(messages['registration.rate.limit.error']); break; case TPA_SESSION_EXPIRED: - errorMessage = intl.formatMessage(messages['registration.tpa.session.expired'], { provider: context.provider }); + errorMessage = formatMessage(messages['registration.tpa.session.expired'], { provider: context.provider }); break; default: - errorMessage = intl.formatMessage(messages['registration.empty.form.submission.error']); + errorMessage = formatMessage(messages['registration.empty.form.submission.error']); break; } return ( - {props.intl.formatMessage(messages['registration.request.failure.header'])} + {formatMessage(messages['registration.request.failure.header'])}

{errorMessage}

); @@ -56,7 +57,6 @@ RegistrationFailureMessage.propTypes = { }), errorCode: PropTypes.string.isRequired, failureCount: PropTypes.number.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, }; -export default injectIntl(RegistrationFailureMessage); +export default RegistrationFailureMessage; diff --git a/src/register/RegistrationPage.jsx b/src/register/RegistrationPage.jsx index 429c545e..772721cb 100644 --- a/src/register/RegistrationPage.jsx +++ b/src/register/RegistrationPage.jsx @@ -6,7 +6,7 @@ import { connect } from 'react-redux'; import { getConfig, snakeCaseObject } from '@edx/frontend-platform'; import { sendPageEvent } from '@edx/frontend-platform/analytics'; import { - getCountryList, getLocale, injectIntl, + getCountryList, getLocale, useIntl, } from '@edx/frontend-platform/i18n'; import { Form, StatefulButton } from '@edx/paragon'; import PropTypes from 'prop-types'; @@ -56,7 +56,6 @@ const RegistrationPage = (props) => { backendValidations, fieldDescriptions, handleInstitutionLogin, - intl, institutionLogin, optionalFields, registrationError, @@ -77,6 +76,7 @@ const RegistrationPage = (props) => { clearBackendError, } = props; + const { formatMessage } = useIntl(); const countryList = useMemo(() => getCountryList(getLocale()), []); const queryParams = useMemo(() => getAllPossibleQueryParams(), []); const tpaHint = useMemo(() => getTpaHint(), []); @@ -212,24 +212,24 @@ const RegistrationPage = (props) => { switch (fieldName) { case 'name': if (!value.trim()) { - fieldError = intl.formatMessage(messages['empty.name.field.error']); + fieldError = formatMessage(messages['empty.name.field.error']); } else if (value && value.match(urlRegex)) { - fieldError = intl.formatMessage(messages['name.validation.message']); + fieldError = formatMessage(messages['name.validation.message']); } else if (value && !payload.username.trim() && shouldValidateFromBackend) { validateFromBackend(payload); } break; case 'email': if (!value) { - fieldError = intl.formatMessage(messages['empty.email.field.error']); + fieldError = formatMessage(messages['empty.email.field.error']); } else if (value.length <= 2) { - fieldError = intl.formatMessage(messages['email.invalid.format.error']); + fieldError = formatMessage(messages['email.invalid.format.error']); } else { const [username, domainName] = value.split('@'); // Check if email address is invalid. If we have a suggestion for invalid email // provide that along with the error message. if (!emailRegex.test(value)) { - fieldError = intl.formatMessage(messages['email.invalid.format.error']); + fieldError = formatMessage(messages['email.invalid.format.error']); setEmailSuggestion({ suggestion: getSuggestionForInvalidEmail(domainName, username), type: 'error', @@ -237,7 +237,7 @@ const RegistrationPage = (props) => { } else { const response = validateEmailAddress(value, username, domainName); if (response.hasError) { - fieldError = intl.formatMessage(messages['email.invalid.format.error']); + fieldError = formatMessage(messages['email.invalid.format.error']); delete response.hasError; } else if (shouldValidateFromBackend) { validateFromBackend(payload); @@ -245,23 +245,23 @@ const RegistrationPage = (props) => { setEmailSuggestion({ ...response }); if (configurableFormFields.confirm_email && value !== configurableFormFields.confirm_email) { - confirmEmailError = intl.formatMessage(messages['email.do.not.match']); + confirmEmailError = formatMessage(messages['email.do.not.match']); } } } break; case 'username': if (!value || value.length <= 1 || value.length > 30) { - fieldError = intl.formatMessage(messages['username.validation.message']); + fieldError = formatMessage(messages['username.validation.message']); } else if (!value.match(/^[a-zA-Z0-9_-]*$/i)) { - fieldError = intl.formatMessage(messages['username.format.validation.message']); + fieldError = formatMessage(messages['username.format.validation.message']); } else if (shouldValidateFromBackend) { validateFromBackend(payload); } break; case 'password': if (!value || !LETTER_REGEX.test(value) || !NUMBER_REGEX.test(value) || value.length < 8) { - fieldError = intl.formatMessage(messages['password.validation.message']); + fieldError = formatMessage(messages['password.validation.message']); } else if (shouldValidateFromBackend) { validateFromBackend(payload); } @@ -269,7 +269,7 @@ const RegistrationPage = (props) => { case 'country': if (flags.showConfigurableEdxFields || flags.showConfigurableRegistrationFields) { const { countryCode, displayValue, error } = validateCountryField( - value.displayValue.trim(), countryList, intl.formatMessage(messages['empty.country.field.error']), + value.displayValue.trim(), countryList, formatMessage(messages['empty.country.field.error']), ); fieldError = error; countryFieldCode = countryCode; @@ -281,7 +281,7 @@ const RegistrationPage = (props) => { if (!value && fieldDescriptions[fieldName].error_message) { fieldError = fieldDescriptions[fieldName].error_message; } else if (fieldName === 'confirm_email' && formFields.email && value !== formFields.email) { - fieldError = intl.formatMessage(messages['email.do.not.match']); + fieldError = formatMessage(messages['email.do.not.match']); } } break; @@ -301,7 +301,7 @@ const RegistrationPage = (props) => { let isValid = !focusedFieldError; Object.keys(payload).forEach(key => { if (!payload[key]) { - fieldErrors[key] = intl.formatMessage(messages[`empty.${key}.field.error`]); + fieldErrors[key] = formatMessage(messages[`empty.${key}.field.error`]); } if (fieldErrors[key]) { isValid = false; @@ -310,7 +310,7 @@ const RegistrationPage = (props) => { if (flags.showConfigurableEdxFields) { if (!configurableFormFields.country.displayValue) { - fieldErrors.country = intl.formatMessage(messages['empty.country.field.error']); + fieldErrors.country = formatMessage(messages['empty.country.field.error']); } if (fieldErrors.country) { isValid = false; @@ -320,7 +320,7 @@ const RegistrationPage = (props) => { if (flags.showConfigurableRegistrationFields) { Object.keys(fieldDescriptions).forEach(key => { if (key === 'country' && !configurableFormFields.country.displayValue) { - fieldErrors[key] = intl.formatMessage(messages['empty.country.field.error']); + fieldErrors[key] = formatMessage(messages['empty.country.field.error']); } else if (!configurableFormFields[key]) { fieldErrors[key] = fieldDescriptions[key].error_message; } @@ -463,14 +463,14 @@ const RegistrationPage = (props) => { return ( ); } return ( <> - {intl.formatMessage(messages['register.page.title'], { siteName: getConfig().SITE_NAME })} + {formatMessage(messages['register.page.title'], { siteName: getConfig().SITE_NAME })} { handleBlur={handleOnBlur} handleFocus={handleOnFocus} errorMessage={errors.name} - helpText={[intl.formatMessage(messages['help.text.name'])]} - floatingLabel={intl.formatMessage(messages['registration.fullname.label'])} + helpText={[formatMessage(messages['help.text.name'])]} + floatingLabel={formatMessage(messages['registration.fullname.label'])} /> { handleOnClose={handleEmailSuggestionClosed} emailSuggestion={emailSuggestion} errorMessage={errors.email} - helpText={[intl.formatMessage(messages['help.text.email'])]} - floatingLabel={intl.formatMessage(messages['registration.email.label'])} + helpText={[formatMessage(messages['help.text.email'])]} + floatingLabel={formatMessage(messages['registration.email.label'])} /> { handleUsernameSuggestionClose={handleUsernameSuggestionClosed} usernameSuggestions={usernameSuggestions} errorMessage={errors.username} - helpText={[intl.formatMessage(messages['help.text.username.1']), intl.formatMessage(messages['help.text.username.2'])]} - floatingLabel={intl.formatMessage(messages['registration.username.label'])} + helpText={[formatMessage(messages['help.text.username.1']), formatMessage(messages['help.text.username.2'])]} + floatingLabel={formatMessage(messages['registration.username.label'])} /> {!currentProvider && ( { handleBlur={handleOnBlur} handleFocus={handleOnFocus} errorMessage={errors.password} - floatingLabel={intl.formatMessage(messages['registration.password.label'])} + floatingLabel={formatMessage(messages['registration.password.label'])} /> )} { className="register-stateful-button-width mt-4 mb-4" state={submitState} labels={{ - default: intl.formatMessage(messages['create.account.for.free.button']), + default: formatMessage(messages['create.account.for.free.button']), pending: '', }} onClick={handleSubmit} @@ -587,7 +587,7 @@ const RegistrationPage = (props) => { window.location.href = getConfig().LMS_BASE_URL + provider.registerUrl; return null; } - return provider ? : renderForm(); + return provider ? : renderForm(); } return ( renderForm() @@ -631,7 +631,6 @@ RegistrationPage.propTypes = { }), fieldDescriptions: PropTypes.shape({}), institutionLogin: PropTypes.bool.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, optionalFields: PropTypes.shape({}), registrationErrorCode: PropTypes.string, registrationResult: PropTypes.shape({ @@ -717,4 +716,4 @@ export default connect( setUserPipelineDetailsLoaded: setUserPipelineDataLoaded, clearBackendError: clearRegistertionBackendError, }, -)(injectIntl(RegistrationPage)); +)(RegistrationPage); diff --git a/src/register/ThirdPartyAuth.jsx b/src/register/ThirdPartyAuth.jsx index 83afe999..dd46d277 100644 --- a/src/register/ThirdPartyAuth.jsx +++ b/src/register/ThirdPartyAuth.jsx @@ -1,7 +1,7 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import PropTypes from 'prop-types'; import Skeleton from 'react-loading-skeleton'; @@ -18,8 +18,9 @@ import messages from './messages'; * This component renders the Single sign-on (SSO) buttons for the providers passed. * */ const ThirdPartyAuth = (props) => { + const { formatMessage } = useIntl(); const { - providers, secondaryProviders, currentProvider, handleInstitutionLogin, thirdPartyAuthApiStatus, intl, + providers, secondaryProviders, currentProvider, handleInstitutionLogin, thirdPartyAuthApiStatus, } = props; const isInstitutionAuthActive = !!secondaryProviders.length && !currentProvider; const isSocialAuthActive = !!providers.length && !currentProvider; @@ -29,7 +30,7 @@ const ThirdPartyAuth = (props) => { <> {((isEnterpriseLoginDisabled && isInstitutionAuthActive) || isSocialAuthActive) && (
- {intl.formatMessage(messages['registration.other.options.heading'])} + {formatMessage(messages['registration.other.options.heading'])}
)} @@ -40,7 +41,7 @@ const ThirdPartyAuth = (props) => { {(isEnterpriseLoginDisabled && isInstitutionAuthActive) && ( )} {isSocialAuthActive && ( @@ -64,10 +65,9 @@ ThirdPartyAuth.defaultProps = { ThirdPartyAuth.propTypes = { currentProvider: PropTypes.string, handleInstitutionLogin: PropTypes.func.isRequired, - intl: PropTypes.objectOf(PropTypes.object).isRequired, providers: PropTypes.arrayOf(PropTypes.any), secondaryProviders: PropTypes.arrayOf(PropTypes.any), thirdPartyAuthApiStatus: PropTypes.string, }; -export default injectIntl(ThirdPartyAuth); +export default ThirdPartyAuth; diff --git a/src/register/registrationFields/CountryField.jsx b/src/register/registrationFields/CountryField.jsx index 6005a415..be1b43c7 100644 --- a/src/register/registrationFields/CountryField.jsx +++ b/src/register/registrationFields/CountryField.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef, useState } from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Icon, IconButton } from '@edx/paragon'; import { ExpandLess, ExpandMore } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -10,11 +10,10 @@ import { COUNTRY_CODE_KEY, COUNTRY_DISPLAY_KEY } from '../data/constants'; import messages from '../messages'; const CountryField = (props) => { - const { - intl, countryList, selectedCountry, - } = props; + const { countryList, selectedCountry } = props; const dropdownRef = useRef(null); + const { formatMessage } = useIntl(); const [errorMessage, setErrorMessage] = useState(props.errorMessage); const [dropDownItems, setDropDownItems] = useState([]); const [displayValue, setDisplayValue] = useState(''); @@ -160,7 +159,7 @@ const CountryField = (props) => { name="country" autoComplete="chrome-off" className="mb-0" - floatingLabel={intl.formatMessage(messages['registration.country.label'])} + floatingLabel={formatMessage(messages['registration.country.label'])} trailingElement={trailingIcon} value={displayValue} errorMessage={errorMessage} @@ -178,7 +177,6 @@ const CountryField = (props) => { CountryField.propTypes = { countryList: PropTypes.arrayOf(PropTypes.object).isRequired, errorMessage: PropTypes.string, - intl: PropTypes.objectOf(PropTypes.object).isRequired, onBlurHandler: PropTypes.func.isRequired, onChangeHandler: PropTypes.func.isRequired, onFocusHandler: PropTypes.func.isRequired, @@ -195,4 +193,4 @@ CountryField.defaultProps = { }, }; -export default injectIntl(CountryField); +export default CountryField; diff --git a/src/register/registrationFields/EmailField.jsx b/src/register/registrationFields/EmailField.jsx index fc2c50be..938f75f2 100644 --- a/src/register/registrationFields/EmailField.jsx +++ b/src/register/registrationFields/EmailField.jsx @@ -1,6 +1,6 @@ import React from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Alert, Icon } from '@edx/paragon'; import { Close, Error } from '@edx/paragon/icons'; import PropTypes from 'prop-types'; @@ -9,8 +9,8 @@ import { FormGroup } from '../../common-components'; import messages from '../messages'; const EmailField = (props) => { + const { formatMessage } = useIntl(); const { - intl, emailSuggestion, handleSuggestionClick, handleOnClose, @@ -21,7 +21,7 @@ const EmailField = (props) => { return ( - {intl.formatMessage(messages['did.you.mean.alert.text'])}{' '} + {formatMessage(messages['did.you.mean.alert.text'])}{' '} { } return ( - {intl.formatMessage(messages['did.you.mean.alert.text'])}:{' '} + {formatMessage(messages['did.you.mean.alert.text'])}:{' '} { + const { formatMessage } = useIntl(); const { - intl, errorMessage, onChangeHandler, fieldType, value, + errorMessage, onChangeHandler, fieldType, value, } = props; useEffect(() => { @@ -30,12 +31,12 @@ const HonorCode = (props) => { platformName: getConfig().SITE_NAME, tosAndHonorCode: ( - {intl.formatMessage(messages['terms.of.service.and.honor.code'])} + {formatMessage(messages['terms.of.service.and.honor.code'])} ), privacyPolicy: ( - {intl.formatMessage(messages['privacy.policy'])} + {formatMessage(messages['privacy.policy'])} ), }} @@ -62,7 +63,7 @@ const HonorCode = (props) => { platformName: getConfig().SITE_NAME, tosAndHonorCode: ( - {intl.formatMessage(messages['honor.code'])} + {formatMessage(messages['honor.code'])} ), }} @@ -85,11 +86,10 @@ HonorCode.defaultProps = { }; HonorCode.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, errorMessage: PropTypes.string, onChangeHandler: PropTypes.func, fieldType: PropTypes.string, value: PropTypes.bool, }; -export default injectIntl(HonorCode); +export default HonorCode; diff --git a/src/register/registrationFields/TermsOfService.jsx b/src/register/registrationFields/TermsOfService.jsx index 331bf075..33a4d7c2 100644 --- a/src/register/registrationFields/TermsOfService.jsx +++ b/src/register/registrationFields/TermsOfService.jsx @@ -1,15 +1,16 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { FormattedMessage, injectIntl } from '@edx/frontend-platform/i18n'; +import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n'; import { Form, Hyperlink } from '@edx/paragon'; import PropTypes from 'prop-types'; import messages from '../messages'; const TermsOfService = (props) => { + const { formatMessage } = useIntl(); const { - intl, errorMessage, onChangeHandler, value, + errorMessage, onChangeHandler, value, } = props; return ( @@ -31,7 +32,7 @@ const TermsOfService = (props) => { platformName: getConfig().SITE_NAME, termsOfService: ( - {intl.formatMessage(messages['terms.of.service'])} + {formatMessage(messages['terms.of.service'])} ), }} @@ -52,10 +53,9 @@ TermsOfService.defaultProps = { }; TermsOfService.propTypes = { - intl: PropTypes.objectOf(PropTypes.object).isRequired, errorMessage: PropTypes.string, onChangeHandler: PropTypes.func.isRequired, value: PropTypes.bool, }; -export default injectIntl(TermsOfService); +export default TermsOfService; diff --git a/src/register/registrationFields/UsernameField.jsx b/src/register/registrationFields/UsernameField.jsx index 44cb760a..f7ec4924 100644 --- a/src/register/registrationFields/UsernameField.jsx +++ b/src/register/registrationFields/UsernameField.jsx @@ -1,6 +1,6 @@ import React from 'react'; -import { injectIntl } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Button, Icon, IconButton } from '@edx/paragon'; import { Close } from '@edx/paragon/icons'; import PropTypes, { string } from 'prop-types'; @@ -9,15 +9,16 @@ import { FormGroup } from '../../common-components'; import messages from '../messages'; const UsernameField = (props) => { + const { formatMessage } = useIntl(); const { - intl, handleSuggestionClick, handleUsernameSuggestionClose, usernameSuggestions, errorMessage, + handleSuggestionClick, handleUsernameSuggestionClose, usernameSuggestions, errorMessage, } = props; let className = ''; let suggestedUsernameDiv = <>; let iconButton = <>; const suggestedUsernames = () => (
- {intl.formatMessage(messages['registration.username.suggestion.label'])} + {formatMessage(messages['registration.username.suggestion.label'])}
{usernameSuggestions.map((username, index) => (