@nauedu/frontend-component-header 20.0.0 → 20.1.0

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.
Files changed (195) hide show
  1. package/dist/DesktopHeader.js +242 -0
  2. package/dist/DesktopHeader.js.map +1 -0
  3. package/dist/Header.js +9 -13
  4. package/dist/Header.js.map +1 -1
  5. package/dist/Header.test.jsx +0 -3
  6. package/dist/Icons.js +1 -1
  7. package/dist/LanguageSelector/data/api.js +5 -13
  8. package/dist/LanguageSelector/data/api.js.map +1 -1
  9. package/dist/LanguageSelector/index.js +4 -12
  10. package/dist/LanguageSelector/index.js.map +1 -1
  11. package/dist/Logo.js +23 -10
  12. package/dist/Logo.js.map +1 -1
  13. package/dist/Menu/Menu.js +11 -11
  14. package/dist/Menu/Menu.js.map +1 -1
  15. package/dist/Menu/menu.scss +6 -6
  16. package/dist/MobileHeader.js +244 -0
  17. package/dist/MobileHeader.js.map +1 -0
  18. package/dist/__snapshots__/Header.test.jsx.snap +0 -2
  19. package/dist/index.scss +15 -27
  20. package/dist/learning-header/AnonymousUserMenu.js +8 -11
  21. package/dist/learning-header/AnonymousUserMenu.js.map +1 -1
  22. package/dist/learning-header/AuthenticatedUserDropdown.js +24 -32
  23. package/dist/learning-header/AuthenticatedUserDropdown.js.map +1 -1
  24. package/dist/learning-header/LearningHeader.js +14 -15
  25. package/dist/learning-header/LearningHeader.js.map +1 -1
  26. package/dist/learning-header/data/api.js +4 -12
  27. package/dist/learning-header/data/api.js.map +1 -1
  28. package/dist/learning-header/data/api.test.js +95 -92
  29. package/dist/learning-header/data/api.test.js.map +1 -1
  30. package/dist/learning-header/messages.js +0 -5
  31. package/dist/learning-header/messages.js.map +1 -1
  32. package/dist/setupTest.js +2 -0
  33. package/dist/studio-header/BrandNav.js +21 -0
  34. package/dist/studio-header/BrandNav.js.map +1 -0
  35. package/dist/studio-header/CourseLockUp.js +45 -0
  36. package/dist/studio-header/CourseLockUp.js.map +1 -0
  37. package/dist/studio-header/HeaderBody.js +131 -0
  38. package/dist/studio-header/HeaderBody.js.map +1 -0
  39. package/dist/studio-header/MobileHeader.js +79 -0
  40. package/dist/studio-header/MobileHeader.js.map +1 -0
  41. package/dist/studio-header/MobileMenu.js +45 -0
  42. package/dist/studio-header/MobileMenu.js.map +1 -0
  43. package/dist/studio-header/NavDropdownMenu.js +30 -0
  44. package/dist/studio-header/NavDropdownMenu.js.map +1 -0
  45. package/dist/studio-header/StudioHeader.js +72 -0
  46. package/dist/studio-header/StudioHeader.js.map +1 -0
  47. package/dist/studio-header/StudioHeader.scss +10 -8
  48. package/dist/studio-header/UserMenu.js +55 -0
  49. package/dist/studio-header/UserMenu.js.map +1 -0
  50. package/dist/studio-header/{index.ts → index.js} +1 -1
  51. package/dist/studio-header/index.js.map +1 -0
  52. package/dist/studio-header/{messages.ts → messages.js} +14 -15
  53. package/dist/studio-header/messages.js.map +1 -0
  54. package/dist/studio-header/utils.js +29 -0
  55. package/dist/studio-header/utils.js.map +1 -0
  56. package/dist/test-utils.js +4 -12
  57. package/dist/test-utils.js.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/desktop-header/DesktopHeader.js +0 -172
  60. package/dist/desktop-header/DesktopHeader.js.map +0 -1
  61. package/dist/desktop-header/DesktopHeaderMainOrSecondaryMenu.js +0 -51
  62. package/dist/desktop-header/DesktopHeaderMainOrSecondaryMenu.js.map +0 -1
  63. package/dist/desktop-header/DesktopHeaderUserMenu.js +0 -49
  64. package/dist/desktop-header/DesktopHeaderUserMenu.js.map +0 -1
  65. package/dist/desktop-header/DesktopLoggedOutItems.js +0 -22
  66. package/dist/desktop-header/DesktopLoggedOutItems.js.map +0 -1
  67. package/dist/desktop-header/DesktopUserMenuToggle.js +0 -25
  68. package/dist/desktop-header/DesktopUserMenuToggle.js.map +0 -1
  69. package/dist/frontend-platform.d.ts +0 -41
  70. package/dist/learning-header/LearningHeaderCourseInfo.js +0 -24
  71. package/dist/learning-header/LearningHeaderCourseInfo.js.map +0 -1
  72. package/dist/learning-header/LearningHeaderHelpLink.js +0 -13
  73. package/dist/learning-header/LearningHeaderHelpLink.js.map +0 -1
  74. package/dist/learning-header/LearningHeaderUserMenuItems.js +0 -20
  75. package/dist/learning-header/LearningHeaderUserMenuItems.js.map +0 -1
  76. package/dist/learning-header/LearningLoggedOutButtons.js +0 -24
  77. package/dist/learning-header/LearningLoggedOutButtons.js.map +0 -1
  78. package/dist/learning-header/LearningUserMenuToggle.js +0 -26
  79. package/dist/learning-header/LearningUserMenuToggle.js.map +0 -1
  80. package/dist/mobile-header/MobileHeader.js +0 -197
  81. package/dist/mobile-header/MobileHeader.js.map +0 -1
  82. package/dist/mobile-header/MobileHeaderMainMenu.js +0 -46
  83. package/dist/mobile-header/MobileHeaderMainMenu.js.map +0 -1
  84. package/dist/mobile-header/MobileHeaderUserMenu.js +0 -38
  85. package/dist/mobile-header/MobileHeaderUserMenu.js.map +0 -1
  86. package/dist/mobile-header/MobileLoggedOutItems.js +0 -27
  87. package/dist/mobile-header/MobileLoggedOutItems.js.map +0 -1
  88. package/dist/mobile-header/MobileUserMenuToggle.js +0 -19
  89. package/dist/mobile-header/MobileUserMenuToggle.js.map +0 -1
  90. package/dist/plugin-slots/CourseInfoSlot/README.md +0 -128
  91. package/dist/plugin-slots/CourseInfoSlot/images/add_custom_components_before_and_after_course_info.png +0 -0
  92. package/dist/plugin-slots/CourseInfoSlot/images/replace_course_info_with_custom_component.png +0 -0
  93. package/dist/plugin-slots/CourseInfoSlot/images/replace_course_title.png +0 -0
  94. package/dist/plugin-slots/CourseInfoSlot/index.js +0 -32
  95. package/dist/plugin-slots/CourseInfoSlot/index.js.map +0 -1
  96. package/dist/plugin-slots/DesktopHeaderSlot/README.md +0 -44
  97. package/dist/plugin-slots/DesktopHeaderSlot/images/desktop_header_custom_component.png +0 -0
  98. package/dist/plugin-slots/DesktopHeaderSlot/index.js +0 -16
  99. package/dist/plugin-slots/DesktopHeaderSlot/index.js.map +0 -1
  100. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/README.md +0 -137
  101. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_custom_component.png +0 -0
  102. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_custom_components_before_after.png +0 -0
  103. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/images/desktop_logged_out_items_modify_items.png +0 -0
  104. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/index.js +0 -20
  105. package/dist/plugin-slots/DesktopLoggedOutItemsSlot/index.js.map +0 -1
  106. package/dist/plugin-slots/DesktopMainMenuSlot/README.md +0 -137
  107. package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_custom_component.png +0 -0
  108. package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_custom_components_before_after.png +0 -0
  109. package/dist/plugin-slots/DesktopMainMenuSlot/images/desktop_main_menu_modify_items.png +0 -0
  110. package/dist/plugin-slots/DesktopMainMenuSlot/index.js +0 -20
  111. package/dist/plugin-slots/DesktopMainMenuSlot/index.js.map +0 -1
  112. package/dist/plugin-slots/DesktopSecondaryMenuSlot/README.md +0 -132
  113. package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_custom_component.png +0 -0
  114. package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_custom_components_before_after.png +0 -0
  115. package/dist/plugin-slots/DesktopSecondaryMenuSlot/images/desktop_secondary_menu_modify_items.png +0 -0
  116. package/dist/plugin-slots/DesktopSecondaryMenuSlot/index.js +0 -20
  117. package/dist/plugin-slots/DesktopSecondaryMenuSlot/index.js.map +0 -1
  118. package/dist/plugin-slots/DesktopUserMenuSlot/README.md +0 -144
  119. package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_custom_component.png +0 -0
  120. package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_custom_components_before_after.png +0 -0
  121. package/dist/plugin-slots/DesktopUserMenuSlot/images/desktop_user_menu_modify_items.png +0 -0
  122. package/dist/plugin-slots/DesktopUserMenuSlot/index.js +0 -20
  123. package/dist/plugin-slots/DesktopUserMenuSlot/index.js.map +0 -1
  124. package/dist/plugin-slots/DesktopUserMenuToggleSlot/README.md +0 -74
  125. package/dist/plugin-slots/DesktopUserMenuToggleSlot/images/desktop_user_menu_custom_component.png +0 -0
  126. package/dist/plugin-slots/DesktopUserMenuToggleSlot/images/desktop_user_menu_modified_toggle.png +0 -0
  127. package/dist/plugin-slots/DesktopUserMenuToggleSlot/index.js +0 -19
  128. package/dist/plugin-slots/DesktopUserMenuToggleSlot/index.js.map +0 -1
  129. package/dist/plugin-slots/LearningHelpSlot/README.md +0 -44
  130. package/dist/plugin-slots/LearningHelpSlot/images/learning_help_custom_component.png +0 -0
  131. package/dist/plugin-slots/LearningHelpSlot/index.js +0 -11
  132. package/dist/plugin-slots/LearningHelpSlot/index.js.map +0 -1
  133. package/dist/plugin-slots/LearningLoggedOutItemsSlot/README.md +0 -135
  134. package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_custom_component.png +0 -0
  135. package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_custom_components_before_after.png +0 -0
  136. package/dist/plugin-slots/LearningLoggedOutItemsSlot/images/learning_logged_out_items_modified_items.png +0 -0
  137. package/dist/plugin-slots/LearningLoggedOutItemsSlot/index.js +0 -18
  138. package/dist/plugin-slots/LearningLoggedOutItemsSlot/index.js.map +0 -1
  139. package/dist/plugin-slots/LearningUserMenuSlot/README.md +0 -133
  140. package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_custom_component.png +0 -0
  141. package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_custom_components_before_after.png +0 -0
  142. package/dist/plugin-slots/LearningUserMenuSlot/images/learning_user_menu_modified_items.png +0 -0
  143. package/dist/plugin-slots/LearningUserMenuSlot/index.js +0 -18
  144. package/dist/plugin-slots/LearningUserMenuSlot/index.js.map +0 -1
  145. package/dist/plugin-slots/LearningUserMenuToggleSlot/README.md +0 -74
  146. package/dist/plugin-slots/LearningUserMenuToggleSlot/images/learning_user_menu_toggle_custom_component.png +0 -0
  147. package/dist/plugin-slots/LearningUserMenuToggleSlot/images/learning_user_menu_toggle_modified_items.png +0 -0
  148. package/dist/plugin-slots/LearningUserMenuToggleSlot/index.js +0 -19
  149. package/dist/plugin-slots/LearningUserMenuToggleSlot/index.js.map +0 -1
  150. package/dist/plugin-slots/LogoSlot/README.md +0 -72
  151. package/dist/plugin-slots/LogoSlot/index.js +0 -27
  152. package/dist/plugin-slots/LogoSlot/index.js.map +0 -1
  153. package/dist/plugin-slots/MobileHeaderSlot/README.md +0 -44
  154. package/dist/plugin-slots/MobileHeaderSlot/images/mobile_header_custom_component.png +0 -0
  155. package/dist/plugin-slots/MobileHeaderSlot/index.js +0 -16
  156. package/dist/plugin-slots/MobileHeaderSlot/index.js.map +0 -1
  157. package/dist/plugin-slots/MobileLoggedOutItemsSlot/README.md +0 -136
  158. package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_custom_component.png +0 -0
  159. package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_custom_components_before_after.png +0 -0
  160. package/dist/plugin-slots/MobileLoggedOutItemsSlot/images/mobile_logged_out_items_modify_items.png +0 -0
  161. package/dist/plugin-slots/MobileLoggedOutItemsSlot/index.js +0 -20
  162. package/dist/plugin-slots/MobileLoggedOutItemsSlot/index.js.map +0 -1
  163. package/dist/plugin-slots/MobileMainMenuSlot/README.md +0 -136
  164. package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_custom_component.png +0 -0
  165. package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_custom_components_before_after.png +0 -0
  166. package/dist/plugin-slots/MobileMainMenuSlot/images/mobile_main_menu_modify_items.png +0 -0
  167. package/dist/plugin-slots/MobileMainMenuSlot/index.js +0 -20
  168. package/dist/plugin-slots/MobileMainMenuSlot/index.js.map +0 -1
  169. package/dist/plugin-slots/MobileUserMenuSlot/README.md +0 -144
  170. package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_custom_component.png +0 -0
  171. package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_custom_components_before_after.png +0 -0
  172. package/dist/plugin-slots/MobileUserMenuSlot/images/mobile_user_menu_modify_items.png +0 -0
  173. package/dist/plugin-slots/MobileUserMenuSlot/index.js +0 -20
  174. package/dist/plugin-slots/MobileUserMenuSlot/index.js.map +0 -1
  175. package/dist/plugin-slots/MobileUserMenuToggleSlot/README.md +0 -74
  176. package/dist/plugin-slots/MobileUserMenuToggleSlot/images/mobile_user_menu_toggle_custom_component.png +0 -0
  177. package/dist/plugin-slots/MobileUserMenuToggleSlot/images/mobile_user_menu_toggle_modified_items.png +0 -0
  178. package/dist/plugin-slots/MobileUserMenuToggleSlot/index.js +0 -19
  179. package/dist/plugin-slots/MobileUserMenuToggleSlot/index.js.map +0 -1
  180. package/dist/plugin-slots/README.md +0 -26
  181. package/dist/studio-header/BrandNav.test.tsx +0 -40
  182. package/dist/studio-header/BrandNav.tsx +0 -25
  183. package/dist/studio-header/CourseLockUp.test.tsx +0 -59
  184. package/dist/studio-header/CourseLockUp.tsx +0 -56
  185. package/dist/studio-header/HeaderBody.test.tsx +0 -102
  186. package/dist/studio-header/HeaderBody.tsx +0 -196
  187. package/dist/studio-header/MobileHeader.tsx +0 -74
  188. package/dist/studio-header/MobileMenu.test.tsx +0 -81
  189. package/dist/studio-header/MobileMenu.tsx +0 -50
  190. package/dist/studio-header/NavDropdownMenu.test.tsx +0 -67
  191. package/dist/studio-header/NavDropdownMenu.tsx +0 -42
  192. package/dist/studio-header/StudioHeader.test.tsx +0 -220
  193. package/dist/studio-header/StudioHeader.tsx +0 -84
  194. package/dist/studio-header/UserMenu.tsx +0 -69
  195. package/dist/studio-header/utils.ts +0 -37
@@ -1,220 +0,0 @@
1
- /* eslint-disable react/prop-types */
2
- import React, { useMemo } from 'react';
3
- import {
4
- render,
5
- fireEvent,
6
- waitFor,
7
- } from '@testing-library/react';
8
-
9
- import { AppContext } from '@edx/frontend-platform/react';
10
- import { IntlProvider } from '@edx/frontend-platform/i18n';
11
- import { Context as ResponsiveContext } from 'react-responsive';
12
- import { MemoryRouter } from 'react-router-dom';
13
-
14
- import StudioHeader from './StudioHeader';
15
- import messages from './messages';
16
-
17
- const authenticatedUser = {
18
- userId: 3,
19
- username: 'abc123',
20
- administrator: true,
21
- roles: [],
22
- avatar: '/imges/test.png',
23
- };
24
- let currentUser;
25
- let screenWidth = 1280;
26
-
27
- const RootWrapper = ({
28
- ...props
29
- }: React.ComponentProps<typeof StudioHeader>) => {
30
- const appContextValue = useMemo(() => ({
31
- authenticatedUser: currentUser,
32
- config: {
33
- LOGOUT_URL: process.env.LOGOUT_URL,
34
- LOGO_URL: process.env.LOGO_URL,
35
- SITE_NAME: process.env.SITE_NAME,
36
- STUDIO_BASE_URL: process.env.STUDIO_BASE_URL,
37
- LOGIN_URL: process.env.LOGIN_URL,
38
- },
39
- }), []);
40
- const responsiveContextValue = useMemo(() => ({ width: screenWidth }), []);
41
-
42
- return (
43
- // eslint-disable-next-line react/jsx-no-constructed-context-values, react/prop-types
44
- <MemoryRouter>
45
- <IntlProvider locale="en">
46
- <AppContext.Provider value={appContextValue}>
47
- <ResponsiveContext.Provider value={responsiveContextValue}>
48
- <StudioHeader
49
- {...props}
50
- />
51
- </ResponsiveContext.Provider>
52
- </AppContext.Provider>
53
- </IntlProvider>
54
- </MemoryRouter>
55
- );
56
- };
57
-
58
- const props: React.ComponentProps<typeof StudioHeader> = {
59
- number: '123',
60
- org: 'Ed',
61
- title: 'test',
62
- mainMenuDropdowns: [
63
- {
64
- id: 'testId',
65
- buttonTitle: 'test',
66
- items: [
67
- {
68
- title: 'link',
69
- href: '#',
70
- },
71
- ],
72
- },
73
- ],
74
- outlineLink: 'tEsTLInK',
75
- searchButtonAction: null,
76
- isNewHomePage: true,
77
- // These default values shouldn't be needed but typescript is confused by propTypes; can remove after converting
78
- // from propTypes to TypeScript:
79
- containerProps: {},
80
- isHiddenMainMenu: false,
81
- };
82
-
83
- describe('Header', () => {
84
- beforeEach(() => {
85
- jest.clearAllMocks();
86
- currentUser = authenticatedUser;
87
- });
88
- describe('desktop', () => {
89
- it('course lock up should be visible', () => {
90
- const { getByTestId } = render(<RootWrapper {...props} />);
91
- const courseLockUpBlock = getByTestId('course-lock-up-block');
92
-
93
- expect(courseLockUpBlock).toBeVisible();
94
- });
95
-
96
- it('mobile menu should not be visible', () => {
97
- const { queryByTestId } = render(<RootWrapper {...props} />);
98
- const mobileMenuButton = queryByTestId('mobile-menu-button');
99
-
100
- expect(mobileMenuButton).toBeNull();
101
- });
102
-
103
- it('desktop menu should be visible', () => {
104
- const { getByTestId } = render(<RootWrapper {...props} />);
105
- const desktopMenu = getByTestId('desktop-menu');
106
-
107
- expect(desktopMenu).toBeVisible();
108
- });
109
-
110
- it('should render one dropdown', async () => {
111
- const { getAllByRole, getByText } = render(<RootWrapper {...props} />);
112
- const dropdownMenu = getAllByRole('button')[0];
113
-
114
- expect(dropdownMenu).toBeVisible();
115
-
116
- await waitFor(() => fireEvent.click(dropdownMenu));
117
- const dropdownOption = getByText('link');
118
-
119
- expect(dropdownOption).toBeVisible();
120
- });
121
-
122
- it('maintenance should not be in user menu', async () => {
123
- currentUser = { ...authenticatedUser, administrator: false };
124
- const { getAllByRole, queryByText } = render(<RootWrapper {...props} />);
125
- const userMenu = getAllByRole('button')[1];
126
- await waitFor(() => fireEvent.click(userMenu));
127
- const maintenanceButton = queryByText(messages['header.user.menu.maintenance'].defaultMessage);
128
-
129
- expect(maintenanceButton).toBeNull();
130
- });
131
-
132
- it('user menu should use avatar icon', async () => {
133
- currentUser = { ...authenticatedUser, avatar: null };
134
- const { getByTestId } = render(<RootWrapper {...props} />);
135
- const avatarIcon = getByTestId('avatar-icon');
136
-
137
- expect(avatarIcon).toBeVisible();
138
- });
139
-
140
- it('should hide nav items if prop isHiddenMainMenu true', async () => {
141
- const initialProps = { ...props, isHiddenMainMenu: true };
142
- const { queryByTestId } = render(<RootWrapper {...initialProps} />);
143
- const desktopMenu = queryByTestId('desktop-menu');
144
- const mobileMenuButton = queryByTestId('mobile-menu-button');
145
-
146
- expect(mobileMenuButton).toBeNull();
147
-
148
- expect(desktopMenu).toBeNull();
149
- });
150
-
151
- it('should show search button', async () => {
152
- const testProps = { ...props, searchButtonAction: () => undefined };
153
- const { getByRole } = render(<RootWrapper {...testProps} />);
154
- const searchButton = getByRole('button', { name: 'Search content' });
155
-
156
- expect(searchButton).toBeVisible();
157
- });
158
-
159
- it('should not show search button', async () => {
160
- const testProps = { ...props, searchButtonAction: null };
161
- const { queryByRole } = render(<RootWrapper {...testProps} />);
162
- expect(queryByRole('button', { name: 'Search content' })).not.toBeInTheDocument();
163
- });
164
- });
165
-
166
- describe('mobile', () => {
167
- beforeEach(() => { screenWidth = 500; });
168
- it('course lock up should not be visible', async () => {
169
- const { queryByTestId } = render(<RootWrapper {...props} />);
170
- const courseLockUpBlock = queryByTestId('course-lock-up-block');
171
-
172
- expect(courseLockUpBlock).toBeNull();
173
- });
174
-
175
- it('mobile menu should be visible', async () => {
176
- const { getByTestId } = render(<RootWrapper {...props} />);
177
- const mobileMenuButton = getByTestId('mobile-menu-button');
178
-
179
- expect(mobileMenuButton).toBeVisible();
180
- await waitFor(() => fireEvent.click(mobileMenuButton));
181
- const mobileMenu = getByTestId('mobile-menu');
182
-
183
- expect(mobileMenu).toBeVisible();
184
- });
185
-
186
- it('desktop menu should not be visible', () => {
187
- const { queryByTestId } = render(<RootWrapper {...props} />);
188
- const desktopMenu = queryByTestId('desktop-menu');
189
-
190
- expect(desktopMenu).toBeNull();
191
- });
192
-
193
- it('maintenance should be in user menu', async () => {
194
- const { getAllByRole, getByText } = render(<RootWrapper {...props} />);
195
- const userMenu = getAllByRole('button')[1];
196
- await waitFor(() => fireEvent.click(userMenu));
197
- const maintenanceButton = getByText(messages['header.user.menu.maintenance'].defaultMessage);
198
-
199
- expect(maintenanceButton).toBeVisible();
200
- });
201
-
202
- it('user menu should use avatar image', async () => {
203
- const { getByTestId } = render(<RootWrapper {...props} />);
204
- const avatarImage = getByTestId('avatar-image');
205
-
206
- expect(avatarImage).toBeVisible();
207
- });
208
-
209
- it('should hide nav items if prop isHiddenMainMenu true', async () => {
210
- const initialProps = { ...props, isHiddenMainMenu: true };
211
- const { queryByTestId } = render(<RootWrapper {...initialProps} />);
212
- const desktopMenu = queryByTestId('desktop-menu');
213
- const mobileMenuButton = queryByTestId('mobile-menu-button');
214
-
215
- expect(mobileMenuButton).toBeNull();
216
-
217
- expect(desktopMenu).toBeNull();
218
- });
219
- });
220
- });
@@ -1,84 +0,0 @@
1
- import React, { useContext } from 'react';
2
- import PropTypes from 'prop-types';
3
- import Responsive from 'react-responsive';
4
- import { AppContext } from '@edx/frontend-platform/react';
5
- import { ensureConfig } from '@edx/frontend-platform';
6
-
7
- import MobileHeader from './MobileHeader';
8
- import HeaderBody from './HeaderBody';
9
-
10
- ensureConfig([
11
- 'STUDIO_BASE_URL',
12
- 'SITE_NAME',
13
- 'LOGOUT_URL',
14
- 'LOGIN_URL',
15
- 'LOGO_URL',
16
- ], 'Studio Header component');
17
-
18
- const StudioHeader = ({
19
- number, org, title, containerProps, isHiddenMainMenu, mainMenuDropdowns,
20
- outlineLink, searchButtonAction, isNewHomePage,
21
- }) => {
22
- // @ts-expect-error - frontend-platform doesn't yet have type information :/
23
- const { authenticatedUser, config } = useContext(AppContext);
24
- const props = {
25
- logo: config.LOGO_URL,
26
- logoAltText: `Studio ${config.SITE_NAME}`,
27
- number,
28
- org,
29
- title,
30
- containerProps,
31
- username: authenticatedUser?.username,
32
- isAdmin: authenticatedUser?.administrator,
33
- authenticatedUserAvatar: authenticatedUser?.avatar,
34
- studioBaseUrl: isNewHomePage ? '/home' : config.STUDIO_BASE_URL,
35
- logoutUrl: config.LOGOUT_URL,
36
- isHiddenMainMenu,
37
- mainMenuDropdowns,
38
- outlineLink,
39
- searchButtonAction,
40
- };
41
-
42
- return (
43
- <div className="studio-header">
44
- <a className="nav-skip sr-only sr-only-focusable" href="#main">Skip to content</a>
45
- <Responsive maxWidth={841}>
46
- <MobileHeader {...props} />
47
- </Responsive>
48
- <Responsive minWidth={842}>
49
- <HeaderBody {...props} />
50
- </Responsive>
51
- </div>
52
- );
53
- };
54
-
55
- StudioHeader.propTypes = {
56
- number: PropTypes.string,
57
- org: PropTypes.string,
58
- title: PropTypes.string.isRequired,
59
- containerProps: HeaderBody.propTypes.containerProps,
60
- isHiddenMainMenu: PropTypes.bool,
61
- mainMenuDropdowns: PropTypes.arrayOf(PropTypes.shape({
62
- id: PropTypes.string,
63
- buttonTitle: PropTypes.node,
64
- items: PropTypes.arrayOf(PropTypes.shape({
65
- href: PropTypes.string,
66
- title: PropTypes.node,
67
- })),
68
- })),
69
- outlineLink: PropTypes.string,
70
- searchButtonAction: PropTypes.func,
71
- isNewHomePage: PropTypes.bool.isRequired,
72
- };
73
-
74
- StudioHeader.defaultProps = {
75
- number: '',
76
- org: '',
77
- containerProps: {},
78
- isHiddenMainMenu: false,
79
- mainMenuDropdowns: [],
80
- outlineLink: null,
81
- searchButtonAction: null,
82
- };
83
-
84
- export default StudioHeader;
@@ -1,69 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
4
- import {
5
- Avatar,
6
- } from '@openedx/paragon';
7
- import NavDropdownMenu from './NavDropdownMenu';
8
- import getUserMenuItems from './utils';
9
-
10
- const UserMenu = ({
11
- username,
12
- studioBaseUrl,
13
- logoutUrl,
14
- authenticatedUserAvatar,
15
- isMobile,
16
- isAdmin,
17
- // injected
18
- intl,
19
- }) => {
20
- const avatar = authenticatedUserAvatar ? (
21
- <img
22
- className="d-block w-100 h-100"
23
- src={authenticatedUserAvatar}
24
- alt={username}
25
- data-testid="avatar-image"
26
- />
27
- ) : (
28
- <Avatar
29
- size="sm"
30
- className="mr-2"
31
- alt={username}
32
- data-testid="avatar-icon"
33
- />
34
- );
35
- const title = isMobile ? avatar : <>{avatar}{username}</>;
36
-
37
- return (
38
- <NavDropdownMenu
39
- buttonTitle={title}
40
- id="user-dropdown-menu"
41
- items={getUserMenuItems({
42
- studioBaseUrl,
43
- logoutUrl,
44
- intl,
45
- isAdmin,
46
- })}
47
- />
48
- );
49
- };
50
-
51
- UserMenu.propTypes = {
52
- username: PropTypes.string,
53
- studioBaseUrl: PropTypes.string.isRequired,
54
- logoutUrl: PropTypes.string.isRequired,
55
- authenticatedUserAvatar: PropTypes.string,
56
- isMobile: PropTypes.bool,
57
- isAdmin: PropTypes.bool,
58
- // injected
59
- intl: intlShape.isRequired,
60
- };
61
-
62
- UserMenu.defaultProps = {
63
- isMobile: false,
64
- isAdmin: false,
65
- authenticatedUserAvatar: null,
66
- username: null,
67
- };
68
-
69
- export default injectIntl(UserMenu);
@@ -1,37 +0,0 @@
1
- import { getConfig } from '@edx/frontend-platform';
2
- import messages from './messages';
3
-
4
- const getUserMenuItems = ({
5
- studioBaseUrl,
6
- logoutUrl,
7
- intl,
8
- isAdmin,
9
- }) => {
10
- let items = [
11
- {
12
- href: `${studioBaseUrl}`,
13
- title: intl.formatMessage(messages['header.user.menu.studio']),
14
- }, {
15
- href: `${logoutUrl}`,
16
- title: intl.formatMessage(messages['header.user.menu.logout']),
17
- },
18
- ];
19
- if (isAdmin) {
20
- items = [
21
- {
22
- href: `${studioBaseUrl}`,
23
- title: intl.formatMessage(messages['header.user.menu.studio']),
24
- }, {
25
- href: `${getConfig().STUDIO_BASE_URL}/maintenance`,
26
- title: intl.formatMessage(messages['header.user.menu.maintenance']),
27
- }, {
28
- href: `${logoutUrl}`,
29
- title: intl.formatMessage(messages['header.user.menu.logout']),
30
- },
31
- ];
32
- }
33
-
34
- return items;
35
- };
36
-
37
- export default getUserMenuItems;