diff --git a/src/Header.jsx b/src/Header.jsx index 2f190f205..366373d5c 100644 --- a/src/Header.jsx +++ b/src/Header.jsx @@ -1,6 +1,6 @@ import React, { useContext } from 'react'; import Responsive from 'react-responsive'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { AppContext } from '@edx/frontend-platform/react'; import { APP_CONFIG_INITIALIZED, @@ -47,9 +47,10 @@ subscribe(APP_CONFIG_INITIALIZED, () => { * See the documentation for the structure of user menu item. */ const Header = ({ - intl, mainMenuItems, secondaryMenuItems, userMenuItems, + mainMenuItems, secondaryMenuItems, userMenuItems, }) => { const { authenticatedUser, config } = useContext(AppContext); + const intl = useIntl(); const defaultMainMenu = [ { @@ -139,7 +140,6 @@ Header.defaultProps = { }; Header.propTypes = { - intl: intlShape.isRequired, mainMenuItems: PropTypes.oneOfType([ PropTypes.node, PropTypes.array, @@ -159,4 +159,4 @@ Header.propTypes = { })), }; -export default injectIntl(Header); +export default Header; diff --git a/src/desktop-header/DesktopHeader.jsx b/src/desktop-header/DesktopHeader.jsx index 973b86f02..5828ae6da 100644 --- a/src/desktop-header/DesktopHeader.jsx +++ b/src/desktop-header/DesktopHeader.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { getConfig } from '@edx/frontend-platform'; // Local Components @@ -21,91 +21,73 @@ import messages from '../Header.messages'; // Assets -class DesktopHeader extends React.Component { - constructor(props) { // eslint-disable-line @typescript-eslint/no-useless-constructor - super(props); - } - - renderMainMenu() { - const { mainMenu } = this.props; - return ; - } - - renderSecondaryMenu() { - const { secondaryMenu } = this.props; - return ; - } - - renderUserMenu() { - const { - userMenu, - avatar, - username, - intl, - } = this.props; - - return ( - - - - - - - - - ); - } - - renderLoggedOutItems() { - const { loggedOutItems } = this.props; - return ; - } - - render() { - const { - logo, - logoAltText, - logoDestination, - loggedIn, - intl, - } = this.props; - const logoProps = { src: logo, alt: logoAltText, href: logoDestination }; - const logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'mw-100' : null; - - return ( -
- {intl.formatMessage(messages['header.label.skip.nav'])} -
-
- - - -
+const DesktopHeader = ({ + mainMenu, + secondaryMenu, + userMenu, + loggedOutItems, + logo, + logoAltText, + logoDestination, + avatar, + username, + loggedIn, +}) => { + const intl = useIntl(); + + const renderMainMenu = () => ; + + const renderSecondaryMenu = () => ; + + const renderUserMenu = () => ( + + + + + + + + + ); + + const renderLoggedOutItems = () => ; + + const logoProps = { src: logo, alt: logoAltText, href: logoDestination }; + const logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'mw-100' : null; + + return ( +
+ {intl.formatMessage(messages['header.label.skip.nav'])} +
+
+ + +
-
- ); - } -} +
+
+ ); +}; export const desktopHeaderDataShape = { mainMenu: desktopHeaderMainOrSecondaryMenuDataShape, @@ -131,9 +113,6 @@ DesktopHeader.propTypes = { avatar: desktopHeaderDataShape.avatar, username: desktopHeaderDataShape.username, loggedIn: desktopHeaderDataShape.loggedIn, - - // i18n - intl: intlShape.isRequired, }; DesktopHeader.defaultProps = { @@ -149,4 +128,4 @@ DesktopHeader.defaultProps = { loggedIn: false, }; -export default injectIntl(DesktopHeader); +export default DesktopHeader; diff --git a/src/learning-header/AnonymousUserMenu.jsx b/src/learning-header/AnonymousUserMenu.jsx index d98593c6b..5fe18a703 100644 --- a/src/learning-header/AnonymousUserMenu.jsx +++ b/src/learning-header/AnonymousUserMenu.jsx @@ -2,12 +2,13 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; import { getLoginRedirectUrl } from '@edx/frontend-platform/auth'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import LearningLoggedOutItemsSlot from '../plugin-slots/LearningLoggedOutItemsSlot'; import genericMessages from '../generic/messages'; -const AnonymousUserMenu = ({ intl }) => { +const AnonymousUserMenu = () => { + const intl = useIntl(); const buttonsInfo = [ { message: intl.formatMessage(genericMessages.registerSentenceCase), @@ -23,8 +24,4 @@ const AnonymousUserMenu = ({ intl }) => { return ; }; -AnonymousUserMenu.propTypes = { - intl: intlShape.isRequired, -}; - -export default injectIntl(AnonymousUserMenu); +export default AnonymousUserMenu; diff --git a/src/learning-header/AuthenticatedUserDropdown.jsx b/src/learning-header/AuthenticatedUserDropdown.jsx index e27066223..1fb17d396 100644 --- a/src/learning-header/AuthenticatedUserDropdown.jsx +++ b/src/learning-header/AuthenticatedUserDropdown.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { faUserCircle } from '@fortawesome/free-solid-svg-icons'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Dropdown } from '@openedx/paragon'; import LearningUserMenuToggleSlot from '../plugin-slots/LearningUserMenuToggleSlot'; @@ -11,7 +11,8 @@ import LearningUserMenuSlot from '../plugin-slots/LearningUserMenuSlot'; import messages from './messages'; -const AuthenticatedUserDropdown = ({ intl, username }) => { +const AuthenticatedUserDropdown = ({ username }) => { + const intl = useIntl(); const dropdownItems = [ { message: intl.formatMessage(messages.dashboard), @@ -48,8 +49,7 @@ const AuthenticatedUserDropdown = ({ intl, username }) => { }; AuthenticatedUserDropdown.propTypes = { - intl: intlShape.isRequired, username: PropTypes.string.isRequired, }; -export default injectIntl(AuthenticatedUserDropdown); +export default AuthenticatedUserDropdown; diff --git a/src/learning-header/LearningHeader.jsx b/src/learning-header/LearningHeader.jsx index 723b5927d..349690bb2 100644 --- a/src/learning-header/LearningHeader.jsx +++ b/src/learning-header/LearningHeader.jsx @@ -1,7 +1,7 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import { getConfig } from '@edx/frontend-platform'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { AppContext } from '@edx/frontend-platform/react'; import AnonymousUserMenu from './AnonymousUserMenu'; @@ -13,8 +13,12 @@ import messages from './messages'; import LearningHelpSlot from '../plugin-slots/LearningHelpSlot'; const LearningHeader = ({ - courseOrg, courseNumber, courseTitle, intl, showUserDropdown, + courseOrg, + courseNumber, + courseTitle, + showUserDropdown, }) => { + const intl = useIntl(); const { authenticatedUser } = useContext(AppContext); const headerLogo = ( @@ -53,7 +57,6 @@ LearningHeader.propTypes = { courseOrg: courseInfoDataShape.courseOrg, courseNumber: courseInfoDataShape.courseNumber, courseTitle: courseInfoDataShape.courseTitle, - intl: intlShape.isRequired, showUserDropdown: PropTypes.bool, }; @@ -64,4 +67,4 @@ LearningHeader.defaultProps = { showUserDropdown: true, }; -export default injectIntl(LearningHeader); +export default LearningHeader; diff --git a/src/mobile-header/MobileHeader.jsx b/src/mobile-header/MobileHeader.jsx index 788d17e13..6d48efd07 100644 --- a/src/mobile-header/MobileHeader.jsx +++ b/src/mobile-header/MobileHeader.jsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { getConfig } from '@edx/frontend-platform'; // Local Components @@ -20,99 +20,84 @@ import messages from '../Header.messages'; // Assets import { MenuIcon } from '../Icons'; -class MobileHeader extends React.Component { - constructor(props) { // eslint-disable-line @typescript-eslint/no-useless-constructor - super(props); - } - - renderMainMenu() { - const { mainMenu, secondaryMenu } = this.props; - return ; - } - - renderUserMenuItems() { - const { userMenu } = this.props; - return ; - } - - renderLoggedOutItems() { - const { loggedOutItems } = this.props; - return ; - } - - renderUserMenuToggle() { - const { avatar, username } = this.props; - return ; - } - - render() { - const { - logo, - logoAltText, - logoDestination, - loggedIn, - stickyOnMobile, - intl, - mainMenu, - userMenu, - loggedOutItems, - } = this.props; - const logoProps = { src: logo, alt: logoAltText, href: logoDestination }; - const stickyClassName = stickyOnMobile ? 'sticky-top' : ''; - const logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'justify-content-left pl-3' : 'justify-content-center'; - - return ( -
- {intl.formatMessage(messages['header.label.skip.nav'])} - {mainMenu.length > 0 ? ( -
- - - - - - - {this.renderMainMenu()} - - -
- ) : null} -
- +const MobileHeader = ({ + mainMenu, + secondaryMenu, + userMenu, + loggedOutItems, + logo, + logoAltText, + logoDestination, + avatar, + username, + loggedIn, + stickyOnMobile, +}) => { + const intl = useIntl(); + + const renderMainMenu = () => ; + + const renderUserMenuItems = () => ; + + const renderLoggedOutItems = () => ; + + const renderUserMenuToggle = () => ; + + const logoProps = { src: logo, alt: logoAltText, href: logoDestination }; + const stickyClassName = stickyOnMobile ? 'sticky-top' : ''; + const logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'justify-content-left pl-3' : 'justify-content-center'; + + return ( +
+ {intl.formatMessage(messages['header.label.skip.nav'])} + {mainMenu.length > 0 ? ( +
+ + + + + + + {renderMainMenu()} + +
- {userMenu.length > 0 || loggedOutItems.length > 0 ? ( -
- - - {this.renderUserMenuToggle()} - - - {loggedIn ? this.renderUserMenuItems() : this.renderLoggedOutItems()} - - -
- ) : null} -
- ); - } -} + ) : null} +
+ +
+ {userMenu.length > 0 || loggedOutItems.length > 0 ? ( +
+ + + {renderUserMenuToggle()} + + + {loggedIn ? renderUserMenuItems() : renderLoggedOutItems()} + + +
+ ) : null} +
+ ); +}; export const mobileHeaderDataShape = { mainMenu: mobileHeaderMainMenuDataShape, @@ -140,9 +125,6 @@ MobileHeader.propTypes = { username: mobileHeaderDataShape.username, loggedIn: mobileHeaderDataShape.loggedIn, stickyOnMobile: mobileHeaderDataShape.stickyOnMobile, - - // i18n - intl: intlShape.isRequired, }; MobileHeader.defaultProps = { @@ -160,4 +142,4 @@ MobileHeader.defaultProps = { }; -export default injectIntl(MobileHeader); +export default MobileHeader; diff --git a/src/studio-header/CourseLockUp.tsx b/src/studio-header/CourseLockUp.tsx index c6236147e..d0c687a60 100644 --- a/src/studio-header/CourseLockUp.tsx +++ b/src/studio-header/CourseLockUp.tsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { OverlayTrigger, Tooltip, @@ -9,41 +9,43 @@ import { Link } from 'react-router-dom'; import messages from './messages'; -const CourseLockUp = ({ - outlineLink, - org, - number, - title, - // injected - intl, -}) => ( - - {title} - - )} - > - { + const intl = useIntl(); + + return ( + + {title} + + )} > - {org} {number} - {title} - - -); + + {org} {number} + {title} + + + ); +}; CourseLockUp.propTypes = { number: PropTypes.string, org: PropTypes.string, title: PropTypes.string, outlineLink: PropTypes.string, - // injected - intl: intlShape.isRequired, }; CourseLockUp.defaultProps = { @@ -53,4 +55,4 @@ CourseLockUp.defaultProps = { outlineLink: null, }; -export default injectIntl(CourseLockUp); +export default CourseLockUp; diff --git a/src/studio-header/UserMenu.tsx b/src/studio-header/UserMenu.tsx index 03695c165..66add10cb 100644 --- a/src/studio-header/UserMenu.tsx +++ b/src/studio-header/UserMenu.tsx @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { Avatar, } from '@openedx/paragon'; @@ -14,9 +14,8 @@ const UserMenu = ({ authenticatedUserAvatar, isMobile, isAdmin, - // injected - intl, }) => { + const intl = useIntl(); const avatar = authenticatedUserAvatar ? (