1
1
import React from 'react' ;
2
2
import PropTypes from 'prop-types' ;
3
- import { injectIntl , intlShape } from '@edx/frontend-platform/i18n' ;
3
+ import { useIntl } from '@edx/frontend-platform/i18n' ;
4
4
import { getConfig } from '@edx/frontend-platform' ;
5
5
6
6
// Local Components
@@ -21,91 +21,73 @@ import messages from '../Header.messages';
21
21
22
22
// Assets
23
23
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 >
104
86
</ div >
105
- </ header >
106
- ) ;
107
- }
108
- }
87
+ </ div >
88
+ </ header >
89
+ ) ;
90
+ } ;
109
91
110
92
export const desktopHeaderDataShape = {
111
93
mainMenu : desktopHeaderMainOrSecondaryMenuDataShape ,
@@ -131,9 +113,6 @@ DesktopHeader.propTypes = {
131
113
avatar : desktopHeaderDataShape . avatar ,
132
114
username : desktopHeaderDataShape . username ,
133
115
loggedIn : desktopHeaderDataShape . loggedIn ,
134
-
135
- // i18n
136
- intl : intlShape . isRequired ,
137
116
} ;
138
117
139
118
DesktopHeader . defaultProps = {
@@ -149,4 +128,4 @@ DesktopHeader.defaultProps = {
149
128
loggedIn : false ,
150
129
} ;
151
130
152
- export default injectIntl ( DesktopHeader ) ;
131
+ export default DesktopHeader ;
0 commit comments