11import React from 'react' ;
22import PropTypes from 'prop-types' ;
3- import { injectIntl , intlShape } from '@edx/frontend-platform/i18n' ;
3+ import { useIntl } from '@edx/frontend-platform/i18n' ;
44import { getConfig } from '@edx/frontend-platform' ;
55
66// Local Components
@@ -21,91 +21,73 @@ import messages from '../Header.messages';
2121
2222// Assets
2323
24- class DesktopHeader extends React . Component {
25- constructor ( props ) { // eslint-disable-line @typescript-eslint/no-useless-constructor
26- super ( props ) ;
27- }
28-
29- renderMainMenu ( ) {
30- const { mainMenu } = this . props ;
31- return < DesktopMainMenuSlot menu = { mainMenu } /> ;
32- }
33-
34- renderSecondaryMenu ( ) {
35- const { secondaryMenu } = this . props ;
36- return < DesktopSecondaryMenuSlot menu = { secondaryMenu } /> ;
37- }
38-
39- renderUserMenu ( ) {
40- const {
41- userMenu,
42- avatar,
43- username,
44- intl,
45- } = this . props ;
46-
47- return (
48- < Menu transitionClassName = "menu-dropdown" transitionTimeout = { 250 } >
49- < MenuTrigger
50- tag = "button"
51- aria-label = { intl . formatMessage ( messages [ 'header.label.account.menu.for' ] , { username } ) }
52- className = "btn btn-outline-primary d-inline-flex align-items-center pl-2 pr-3"
53- >
54- < DesktopUserMenuToggleSlot avatar = { avatar } label = { username } />
55- </ MenuTrigger >
56- < MenuContent className = "mb-0 dropdown-menu show dropdown-menu-right pin-right shadow py-2" >
57- < DesktopUserMenuSlot menu = { userMenu } />
58- </ MenuContent >
59- </ Menu >
60- ) ;
61- }
62-
63- renderLoggedOutItems ( ) {
64- const { loggedOutItems } = this . props ;
65- return < DesktopLoggedOutItemsSlot items = { loggedOutItems } /> ;
66- }
67-
68- render ( ) {
69- const {
70- logo,
71- logoAltText,
72- logoDestination,
73- loggedIn,
74- intl,
75- } = this . props ;
76- const logoProps = { src : logo , alt : logoAltText , href : logoDestination } ;
77- const logoClasses = getConfig ( ) . AUTHN_MINIMAL_HEADER ? 'mw-100' : null ;
78-
79- return (
80- < header className = "site-header-desktop" >
81- < a className = "nav-skip sr-only sr-only-focusable" href = "#main" > { intl . formatMessage ( messages [ 'header.label.skip.nav' ] ) } </ a >
82- < div className = { `container-fluid ${ logoClasses } ` } >
83- < div className = "nav-container position-relative d-flex align-items-center" >
84- < LogoSlot { ...logoProps } />
85- < nav
86- aria-label = { intl . formatMessage ( messages [ 'header.label.main.nav' ] ) }
87- className = "nav main-nav"
88- >
89- { this . renderMainMenu ( ) }
90- </ nav >
91- < nav
92- aria-label = { intl . formatMessage ( messages [ 'header.label.secondary.nav' ] ) }
93- className = "nav secondary-menu-container align-items-center ml-auto"
94- >
95- { loggedIn
96- ? (
97- < >
98- { this . renderSecondaryMenu ( ) }
99- { this . renderUserMenu ( ) }
100- </ >
101- ) : this . renderLoggedOutItems ( ) }
102- </ nav >
103- </ div >
24+ const DesktopHeader = ( {
25+ mainMenu,
26+ secondaryMenu,
27+ userMenu,
28+ loggedOutItems,
29+ logo,
30+ logoAltText,
31+ logoDestination,
32+ avatar,
33+ username,
34+ loggedIn,
35+ } ) => {
36+ const intl = useIntl ( ) ;
37+
38+ const renderMainMenu = ( ) => < DesktopMainMenuSlot menu = { mainMenu } /> ;
39+
40+ const renderSecondaryMenu = ( ) => < DesktopSecondaryMenuSlot menu = { secondaryMenu } /> ;
41+
42+ const renderUserMenu = ( ) => (
43+ < Menu transitionClassName = "menu-dropdown" transitionTimeout = { 250 } >
44+ < MenuTrigger
45+ tag = "button"
46+ aria-label = { intl . formatMessage ( messages [ 'header.label.account.menu.for' ] , { username } ) }
47+ className = "btn btn-outline-primary d-inline-flex align-items-center pl-2 pr-3"
48+ >
49+ < DesktopUserMenuToggleSlot avatar = { avatar } label = { username } />
50+ </ MenuTrigger >
51+ < MenuContent className = "mb-0 dropdown-menu show dropdown-menu-right pin-right shadow py-2" >
52+ < DesktopUserMenuSlot menu = { userMenu } />
53+ </ MenuContent >
54+ </ Menu >
55+ ) ;
56+
57+ const renderLoggedOutItems = ( ) => < DesktopLoggedOutItemsSlot items = { loggedOutItems } /> ;
58+
59+ const logoProps = { src : logo , alt : logoAltText , href : logoDestination } ;
60+ const logoClasses = getConfig ( ) . AUTHN_MINIMAL_HEADER ? 'mw-100' : null ;
61+
62+ return (
63+ < header className = "site-header-desktop" >
64+ < a className = "nav-skip sr-only sr-only-focusable" href = "#main" > { intl . formatMessage ( messages [ 'header.label.skip.nav' ] ) } </ a >
65+ < div className = { `container-fluid ${ logoClasses } ` } >
66+ < div className = "nav-container position-relative d-flex align-items-center" >
67+ < LogoSlot { ...logoProps } />
68+ < nav
69+ aria-label = { intl . formatMessage ( messages [ 'header.label.main.nav' ] ) }
70+ className = "nav main-nav"
71+ >
72+ { renderMainMenu ( ) }
73+ </ nav >
74+ < nav
75+ aria-label = { intl . formatMessage ( messages [ 'header.label.secondary.nav' ] ) }
76+ className = "nav secondary-menu-container align-items-center ml-auto"
77+ >
78+ { loggedIn
79+ ? (
80+ < >
81+ { renderSecondaryMenu ( ) }
82+ { renderUserMenu ( ) }
83+ </ >
84+ ) : renderLoggedOutItems ( ) }
85+ </ nav >
10486 </ div >
105- </ header >
106- ) ;
107- }
108- }
87+ </ div >
88+ </ header >
89+ ) ;
90+ } ;
10991
11092export const desktopHeaderDataShape = {
11193 mainMenu : desktopHeaderMainOrSecondaryMenuDataShape ,
@@ -131,9 +113,6 @@ DesktopHeader.propTypes = {
131113 avatar : desktopHeaderDataShape . avatar ,
132114 username : desktopHeaderDataShape . username ,
133115 loggedIn : desktopHeaderDataShape . loggedIn ,
134-
135- // i18n
136- intl : intlShape . isRequired ,
137116} ;
138117
139118DesktopHeader . defaultProps = {
@@ -149,4 +128,4 @@ DesktopHeader.defaultProps = {
149128 loggedIn : false ,
150129} ;
151130
152- export default injectIntl ( DesktopHeader ) ;
131+ export default DesktopHeader ;
0 commit comments