@nauedu/frontend-component-header 14.0.0-semantically-released

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 (59) hide show
  1. package/LICENSE +661 -0
  2. package/README.rst +113 -0
  3. package/dist/Avatar.js +45 -0
  4. package/dist/Avatar.js.map +1 -0
  5. package/dist/DesktopHeader.js +218 -0
  6. package/dist/DesktopHeader.js.map +1 -0
  7. package/dist/Header.js +86 -0
  8. package/dist/Header.js.map +1 -0
  9. package/dist/Header.messages.js +100 -0
  10. package/dist/Header.messages.js.map +1 -0
  11. package/dist/Header.test.jsx +127 -0
  12. package/dist/Icons.js +53 -0
  13. package/dist/Icons.js.map +1 -0
  14. package/dist/Logo.js +51 -0
  15. package/dist/Logo.js.map +1 -0
  16. package/dist/Menu/Menu.js +367 -0
  17. package/dist/Menu/Menu.js.map +1 -0
  18. package/dist/Menu/index.js +3 -0
  19. package/dist/Menu/index.js.map +1 -0
  20. package/dist/Menu/menu.scss +45 -0
  21. package/dist/MobileHeader.js +240 -0
  22. package/dist/MobileHeader.js.map +1 -0
  23. package/dist/__snapshots__/Header.test.jsx.snap +443 -0
  24. package/dist/generic/messages.js +15 -0
  25. package/dist/generic/messages.js.map +1 -0
  26. package/dist/i18n/index.js +31 -0
  27. package/dist/i18n/index.js.map +1 -0
  28. package/dist/i18n/messages/ar.json +30 -0
  29. package/dist/i18n/messages/ca.json +1 -0
  30. package/dist/i18n/messages/es_419.json +30 -0
  31. package/dist/i18n/messages/fr.json +30 -0
  32. package/dist/i18n/messages/fr_CA.json +30 -0
  33. package/dist/i18n/messages/he.json +1 -0
  34. package/dist/i18n/messages/id.json +1 -0
  35. package/dist/i18n/messages/ko_KR.json +2 -0
  36. package/dist/i18n/messages/pl.json +1 -0
  37. package/dist/i18n/messages/pt_BR.json +2 -0
  38. package/dist/i18n/messages/ru.json +1 -0
  39. package/dist/i18n/messages/th.json +1 -0
  40. package/dist/i18n/messages/uk.json +1 -0
  41. package/dist/i18n/messages/zh_CN.json +30 -0
  42. package/dist/index.js +6 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/index.scss +120 -0
  45. package/dist/learning-header/AnonymousUserMenu.js +24 -0
  46. package/dist/learning-header/AnonymousUserMenu.js.map +1 -0
  47. package/dist/learning-header/AuthenticatedUserDropdown.js +48 -0
  48. package/dist/learning-header/AuthenticatedUserDropdown.js.map +1 -0
  49. package/dist/learning-header/LearningHeader.js +121 -0
  50. package/dist/learning-header/LearningHeader.js.map +1 -0
  51. package/dist/learning-header/_header.scss +7 -0
  52. package/dist/learning-header/data/api.js +57 -0
  53. package/dist/learning-header/data/api.js.map +1 -0
  54. package/dist/learning-header/data/api.test.js +216 -0
  55. package/dist/learning-header/data/api.test.js.map +1 -0
  56. package/dist/learning-header/messages.js +40 -0
  57. package/dist/learning-header/messages.js.map +1 -0
  58. package/dist/setupTest.js +129 -0
  59. package/package.json +76 -0
package/README.rst ADDED
@@ -0,0 +1,113 @@
1
+ #########################
2
+ frontend-component-header
3
+ #########################
4
+
5
+ |Build Status| |Codecov| |npm_version| |npm_downloads| |license| |semantic-release|
6
+
7
+ ********
8
+ Overview
9
+ ********
10
+
11
+ A generic header for Open edX micro-frontend applications.
12
+
13
+ ************
14
+ Requirements
15
+ ************
16
+
17
+ This component uses ``@edx/frontend-platform`` services such as i18n, analytics, configuration, and the ``AppContext`` React component, and expects that it has been loaded into a micro-frontend that has been properly initialized via ``@edx/frontend-platform``'s ``initialize`` function. `Please visit the frontend template application to see an example. <https://github.com/edx/frontend-template-application/blob/master/src/index.jsx>`_
18
+
19
+ Environment Variables
20
+ =====================
21
+
22
+ * ``LMS_BASE_URL`` - The URL of the LMS of your Open edX instance.
23
+ * ``LOGOUT_URL`` - The URL of the API endpoint which performs a user logout.
24
+ * ``LOGIN_URL`` - The URL of the login page where a user can sign into their account.
25
+ * ``SITE_NAME`` - The user-facing name of the site, used as `alt` text on the logo in the header.
26
+ Defaults to "localhost" in development.
27
+ * ``LOGO_URL`` - The URL of the site's logo. This logo is displayed in the header.
28
+ * ``ORDER_HISTORY_URL`` - The URL of the order history page.
29
+ * ``AUTHN_MINIMAL_HEADER`` - A boolean flag which hides the main menu, user menu, and logged-out
30
+ menu items when truthy. This is intended to be used in micro-frontends like
31
+ frontend-app-authentication in which these menus are considered distractions from the user's task.
32
+ * ``ENABLE_ORG_LOGO`` - A boolean flag to enable the display of the org logo on the center of the
33
+ header nav bar. Defaults to **false**
34
+
35
+ ************
36
+ Installation
37
+ ************
38
+
39
+ To install this header into your Open edX micro-frontend, run the following command in your MFE:
40
+
41
+ ``npm i --save @nauedu/frontend-component-header``
42
+
43
+ This will make the component available to be imported into your application.
44
+
45
+ *****
46
+ Usage
47
+ *****
48
+
49
+ This library has the following exports:
50
+
51
+ * ``(default)``: The header as a React component.
52
+ * ``messages``: Internationalization messages suitable for use with `@edx/frontend-platform/i18n <https://edx.github.io/frontend-platform/module-Internationalization.html>`_
53
+ * ``dist/index.scss``: A SASS file which contains style information for the component. It should be imported into the micro-frontend's own SCSS file.
54
+
55
+ Examples
56
+ ========
57
+
58
+ * `An example of component and messages usage. <https://github.com/edx/frontend-template-application/blob/3355bb3a96232390e9056f35b06ffa8f105ed7ca/src/index.jsx#L21>`_
59
+ * `An example of SCSS file usage. <https://github.com/edx/frontend-template-application/blob/3cd5485bf387b8c479baf6b02bf59e3061dc3465/src/index.scss#L8>`_
60
+
61
+
62
+ ***********
63
+ Development
64
+ ***********
65
+
66
+ Install dependencies::
67
+
68
+ npm i
69
+
70
+ Start the development server::
71
+
72
+ npm start
73
+
74
+ Build a production distribution::
75
+
76
+ npm run build
77
+
78
+ ***********
79
+ Publishing to npmjs.com
80
+ ***********
81
+
82
+ Any changes to this library have to be pushed to npmjs.com to be reflected on the build.
83
+
84
+ Publish to npm::
85
+
86
+ npm publish
87
+
88
+
89
+ ***********
90
+ Deploy in production
91
+ ***********
92
+ To replace the default edx header with the new one, use one of the following instructions:
93
+
94
+ Add the necessary settings to the mfe_brand plugin::
95
+
96
+ RUN npm install '@edx/frontend-component-header@npm:@nauedu/frontend-component-header'
97
+
98
+ Alternatively, you can specify the version::
99
+
100
+ RUN npm install '@edx/frontend-component-header@npm:@nauedu/frontend-component-header@1.0.0'
101
+
102
+ .. |Build Status| image:: https://api.travis-ci.com/edx/frontend-component-header.svg?branch=master
103
+ :target: https://travis-ci.com/edx/frontend-component-header
104
+ .. |Codecov| image:: https://img.shields.io/codecov/c/github/edx/frontend-component-header
105
+ :target: @edx/frontend-component-header
106
+ .. |npm_version| image:: https://img.shields.io/npm/v/@edx/frontend-component-header.svg
107
+ :target: @edx/frontend-component-header
108
+ .. |npm_downloads| image:: https://img.shields.io/npm/dt/@edx/frontend-component-header.svg
109
+ :target: @edx/frontend-component-header
110
+ .. |license| image:: https://img.shields.io/npm/l/@edx/frontend-component-header.svg
111
+ :target: @edx/frontend-component-header
112
+ .. |semantic-release| image:: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
113
+ :target: https://github.com/semantic-release/semantic-release
package/dist/Avatar.js ADDED
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { AvatarIcon } from './Icons';
4
+
5
+ function Avatar(_ref) {
6
+ var size = _ref.size,
7
+ src = _ref.src,
8
+ alt = _ref.alt,
9
+ className = _ref.className;
10
+ var avatar = src ? /*#__PURE__*/React.createElement("img", {
11
+ className: "d-block w-100 h-100",
12
+ src: src,
13
+ alt: alt
14
+ }) : /*#__PURE__*/React.createElement(AvatarIcon, {
15
+ style: {
16
+ width: size,
17
+ height: size
18
+ },
19
+ role: "img",
20
+ "aria-hidden": true,
21
+ focusable: "false"
22
+ });
23
+ return /*#__PURE__*/React.createElement("span", {
24
+ style: {
25
+ height: size,
26
+ width: size
27
+ },
28
+ className: "avatar overflow-hidden d-inline-flex rounded-circle ".concat(className)
29
+ }, avatar);
30
+ }
31
+
32
+ Avatar.propTypes = {
33
+ src: PropTypes.string,
34
+ size: PropTypes.string,
35
+ alt: PropTypes.string,
36
+ className: PropTypes.string
37
+ };
38
+ Avatar.defaultProps = {
39
+ src: null,
40
+ size: '2rem',
41
+ alt: null,
42
+ className: null
43
+ };
44
+ export default Avatar;
45
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Avatar.jsx"],"names":["React","PropTypes","AvatarIcon","Avatar","size","src","alt","className","avatar","width","height","propTypes","string","defaultProps"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AAEA,SAASC,UAAT,QAA2B,SAA3B;;AAEA,SAASC,MAAT,OAKG;AAAA,MAJDC,IAIC,QAJDA,IAIC;AAAA,MAHDC,GAGC,QAHDA,GAGC;AAAA,MAFDC,GAEC,QAFDA,GAEC;AAAA,MADDC,SACC,QADDA,SACC;AACD,MAAMC,MAAM,GAAGH,GAAG,gBAChB;AAAK,IAAA,SAAS,EAAC,qBAAf;AAAqC,IAAA,GAAG,EAAEA,GAA1C;AAA+C,IAAA,GAAG,EAAEC;AAApD,IADgB,gBAGhB,oBAAC,UAAD;AAAY,IAAA,KAAK,EAAE;AAAEG,MAAAA,KAAK,EAAEL,IAAT;AAAeM,MAAAA,MAAM,EAAEN;AAAvB,KAAnB;AAAkD,IAAA,IAAI,EAAC,KAAvD;AAA6D,uBAA7D;AAAyE,IAAA,SAAS,EAAC;AAAnF,IAHF;AAMA,sBACE;AACE,IAAA,KAAK,EAAE;AAAEM,MAAAA,MAAM,EAAEN,IAAV;AAAgBK,MAAAA,KAAK,EAAEL;AAAvB,KADT;AAEE,IAAA,SAAS,gEAAyDG,SAAzD;AAFX,KAIGC,MAJH,CADF;AAQD;;AAEDL,MAAM,CAACQ,SAAP,GAAmB;AACjBN,EAAAA,GAAG,EAAEJ,SAAS,CAACW,MADE;AAEjBR,EAAAA,IAAI,EAAEH,SAAS,CAACW,MAFC;AAGjBN,EAAAA,GAAG,EAAEL,SAAS,CAACW,MAHE;AAIjBL,EAAAA,SAAS,EAAEN,SAAS,CAACW;AAJJ,CAAnB;AAOAT,MAAM,CAACU,YAAP,GAAsB;AACpBR,EAAAA,GAAG,EAAE,IADe;AAEpBD,EAAAA,IAAI,EAAE,MAFc;AAGpBE,EAAAA,GAAG,EAAE,IAHe;AAIpBC,EAAAA,SAAS,EAAE;AAJS,CAAtB;AAOA,eAAeJ,MAAf","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { AvatarIcon } from './Icons';\n\nfunction Avatar({\n size,\n src,\n alt,\n className,\n}) {\n const avatar = src ? (\n <img className=\"d-block w-100 h-100\" src={src} alt={alt} />\n ) : (\n <AvatarIcon style={{ width: size, height: size }} role=\"img\" aria-hidden focusable=\"false\" />\n );\n\n return (\n <span\n style={{ height: size, width: size }}\n className={`avatar overflow-hidden d-inline-flex rounded-circle ${className}`}\n >\n {avatar}\n </span>\n );\n}\n\nAvatar.propTypes = {\n src: PropTypes.string,\n size: PropTypes.string,\n alt: PropTypes.string,\n className: PropTypes.string,\n};\n\nAvatar.defaultProps = {\n src: null,\n size: '2rem',\n alt: null,\n className: null,\n};\n\nexport default Avatar;\n"],"file":"Avatar.js"}
@@ -0,0 +1,218 @@
1
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
+
3
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
4
+
5
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
+
7
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8
+
9
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
10
+
11
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
12
+
13
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
14
+
15
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
16
+
17
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
18
+
19
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
20
+
21
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
22
+
23
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
24
+
25
+ import React from 'react';
26
+ import PropTypes from 'prop-types';
27
+ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
28
+ import { getConfig } from '@edx/frontend-platform'; // Local Components
29
+
30
+ import { Menu, MenuTrigger, MenuContent } from './Menu';
31
+ import Avatar from './Avatar';
32
+ import { LinkedLogo, Logo } from './Logo'; // i18n
33
+
34
+ import messages from './Header.messages'; // Assets
35
+
36
+ import { CaretIcon } from './Icons';
37
+
38
+ var DesktopHeader = /*#__PURE__*/function (_React$Component) {
39
+ _inherits(DesktopHeader, _React$Component);
40
+
41
+ var _super = _createSuper(DesktopHeader);
42
+
43
+ function DesktopHeader(props) {
44
+ _classCallCheck(this, DesktopHeader);
45
+
46
+ // eslint-disable-line no-useless-constructor
47
+ return _super.call(this, props);
48
+ }
49
+
50
+ _createClass(DesktopHeader, [{
51
+ key: "renderMainMenu",
52
+ value: function renderMainMenu() {
53
+ var mainMenu = this.props.mainMenu; // Nodes are accepted as a prop
54
+
55
+ if (!Array.isArray(mainMenu)) {
56
+ return mainMenu;
57
+ }
58
+
59
+ return mainMenu.map(function (menuItem) {
60
+ var type = menuItem.type,
61
+ href = menuItem.href,
62
+ content = menuItem.content,
63
+ submenuContent = menuItem.submenuContent;
64
+
65
+ if (type === 'item') {
66
+ return /*#__PURE__*/React.createElement("a", {
67
+ key: "".concat(type, "-").concat(content),
68
+ className: "nav-link",
69
+ href: href
70
+ }, content);
71
+ }
72
+
73
+ return /*#__PURE__*/React.createElement(Menu, {
74
+ key: "".concat(type, "-").concat(content),
75
+ tag: "div",
76
+ className: "nav-item",
77
+ respondToPointerEvents: true
78
+ }, /*#__PURE__*/React.createElement(MenuTrigger, {
79
+ tag: "a",
80
+ className: "nav-link d-inline-flex align-items-center",
81
+ href: href
82
+ }, content, " ", /*#__PURE__*/React.createElement(CaretIcon, {
83
+ role: "img",
84
+ "aria-hidden": true,
85
+ focusable: "false"
86
+ })), /*#__PURE__*/React.createElement(MenuContent, {
87
+ className: "pin-left pin-right shadow py-2"
88
+ }, submenuContent));
89
+ });
90
+ }
91
+ }, {
92
+ key: "renderUserMenu",
93
+ value: function renderUserMenu() {
94
+ var _this$props = this.props,
95
+ userMenu = _this$props.userMenu,
96
+ avatar = _this$props.avatar,
97
+ username = _this$props.username,
98
+ intl = _this$props.intl;
99
+ return /*#__PURE__*/React.createElement(Menu, {
100
+ transitionClassName: "menu-dropdown",
101
+ transitionTimeout: 250
102
+ }, /*#__PURE__*/React.createElement(MenuTrigger, {
103
+ tag: "button",
104
+ "aria-label": intl.formatMessage(messages['header.label.account.menu.for'], {
105
+ username: username
106
+ }),
107
+ className: "btn btn-outline-primary d-inline-flex align-items-center pl-2 pr-3"
108
+ }, /*#__PURE__*/React.createElement(Avatar, {
109
+ size: "1.5em",
110
+ src: avatar,
111
+ alt: "",
112
+ className: "mr-2"
113
+ }), username, " ", /*#__PURE__*/React.createElement(CaretIcon, {
114
+ role: "img",
115
+ "aria-hidden": true,
116
+ focusable: "false"
117
+ })), /*#__PURE__*/React.createElement(MenuContent, {
118
+ className: "mb-0 dropdown-menu show dropdown-menu-right pin-right shadow py-2"
119
+ }, userMenu.map(function (_ref) {
120
+ var type = _ref.type,
121
+ href = _ref.href,
122
+ content = _ref.content;
123
+ return /*#__PURE__*/React.createElement("a", {
124
+ className: "dropdown-".concat(type),
125
+ key: "".concat(type, "-").concat(content),
126
+ href: href
127
+ }, content);
128
+ })));
129
+ }
130
+ }, {
131
+ key: "renderLoggedOutItems",
132
+ value: function renderLoggedOutItems() {
133
+ var loggedOutItems = this.props.loggedOutItems;
134
+ return loggedOutItems.map(function (item, i, arr) {
135
+ return /*#__PURE__*/React.createElement("a", {
136
+ key: "".concat(item.type, "-").concat(item.content),
137
+ className: i < arr.length - 1 ? 'btn mr-2 btn-link' : 'btn mr-2 btn-outline-primary',
138
+ href: item.href
139
+ }, item.content);
140
+ });
141
+ }
142
+ }, {
143
+ key: "render",
144
+ value: function render() {
145
+ var _this$props2 = this.props,
146
+ logo = _this$props2.logo,
147
+ logoAltText = _this$props2.logoAltText,
148
+ logoDestination = _this$props2.logoDestination,
149
+ loggedIn = _this$props2.loggedIn,
150
+ intl = _this$props2.intl;
151
+ var logoProps = {
152
+ src: logo,
153
+ alt: logoAltText,
154
+ href: logoDestination
155
+ };
156
+ var logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'mw-100' : null;
157
+ return /*#__PURE__*/React.createElement("header", {
158
+ className: "site-header-desktop"
159
+ }, /*#__PURE__*/React.createElement("a", {
160
+ className: "nav-skip sr-only sr-only-focusable",
161
+ href: "#main"
162
+ }, intl.formatMessage(messages['header.label.skip.nav'])), /*#__PURE__*/React.createElement("div", {
163
+ className: "container-fluid ".concat(logoClasses)
164
+ }, /*#__PURE__*/React.createElement("div", {
165
+ className: "nav-container position-relative d-flex align-items-center"
166
+ }, logoDestination === null ? /*#__PURE__*/React.createElement(Logo, {
167
+ className: "logo",
168
+ src: logo,
169
+ alt: logoAltText
170
+ }) : /*#__PURE__*/React.createElement(LinkedLogo, _extends({
171
+ className: "logo"
172
+ }, logoProps)), /*#__PURE__*/React.createElement("nav", {
173
+ "aria-label": intl.formatMessage(messages['header.label.main.nav']),
174
+ className: "nav main-nav"
175
+ }, this.renderMainMenu()), /*#__PURE__*/React.createElement("nav", {
176
+ "aria-label": intl.formatMessage(messages['header.label.secondary.nav']),
177
+ className: "nav secondary-menu-container align-items-center ml-auto"
178
+ }, loggedIn ? this.renderUserMenu() : this.renderLoggedOutItems()))));
179
+ }
180
+ }]);
181
+
182
+ return DesktopHeader;
183
+ }(React.Component);
184
+
185
+ DesktopHeader.propTypes = {
186
+ mainMenu: PropTypes.oneOfType([PropTypes.node, PropTypes.array]),
187
+ userMenu: PropTypes.arrayOf(PropTypes.shape({
188
+ type: PropTypes.oneOf(['item', 'menu']),
189
+ href: PropTypes.string,
190
+ content: PropTypes.string
191
+ })),
192
+ loggedOutItems: PropTypes.arrayOf(PropTypes.shape({
193
+ type: PropTypes.oneOf(['item', 'menu']),
194
+ href: PropTypes.string,
195
+ content: PropTypes.string
196
+ })),
197
+ logo: PropTypes.string,
198
+ logoAltText: PropTypes.string,
199
+ logoDestination: PropTypes.string,
200
+ avatar: PropTypes.string,
201
+ username: PropTypes.string,
202
+ loggedIn: PropTypes.bool,
203
+ // i18n
204
+ intl: intlShape.isRequired
205
+ };
206
+ DesktopHeader.defaultProps = {
207
+ mainMenu: [],
208
+ userMenu: [],
209
+ loggedOutItems: [],
210
+ logo: null,
211
+ logoAltText: null,
212
+ logoDestination: null,
213
+ avatar: null,
214
+ username: null,
215
+ loggedIn: false
216
+ };
217
+ export default injectIntl(DesktopHeader);
218
+ //# sourceMappingURL=DesktopHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/DesktopHeader.jsx"],"names":["React","PropTypes","injectIntl","intlShape","getConfig","Menu","MenuTrigger","MenuContent","Avatar","LinkedLogo","Logo","messages","CaretIcon","DesktopHeader","props","mainMenu","Array","isArray","map","menuItem","type","href","content","submenuContent","userMenu","avatar","username","intl","formatMessage","loggedOutItems","item","i","arr","length","logo","logoAltText","logoDestination","loggedIn","logoProps","src","alt","logoClasses","AUTHN_MINIMAL_HEADER","renderMainMenu","renderUserMenu","renderLoggedOutItems","Component","propTypes","oneOfType","node","array","arrayOf","shape","oneOf","string","bool","isRequired","defaultProps"],"mappings":"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","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { getConfig } from '@edx/frontend-platform';\n\n// Local Components\nimport { Menu, MenuTrigger, MenuContent } from './Menu';\nimport Avatar from './Avatar';\nimport { LinkedLogo, Logo } from './Logo';\n\n// i18n\nimport messages from './Header.messages';\n\n// Assets\nimport { CaretIcon } from './Icons';\n\nclass DesktopHeader extends React.Component {\n constructor(props) { // eslint-disable-line no-useless-constructor\n super(props);\n }\n\n renderMainMenu() {\n const { mainMenu } = this.props;\n\n // Nodes are accepted as a prop\n if (!Array.isArray(mainMenu)) {\n return mainMenu;\n }\n\n return mainMenu.map((menuItem) => {\n const {\n type,\n href,\n content,\n submenuContent,\n } = menuItem;\n\n if (type === 'item') {\n return (\n <a key={`${type}-${content}`} className=\"nav-link\" href={href}>{content}</a>\n );\n }\n\n return (\n <Menu key={`${type}-${content}`} tag=\"div\" className=\"nav-item\" respondToPointerEvents>\n <MenuTrigger tag=\"a\" className=\"nav-link d-inline-flex align-items-center\" href={href}>\n {content} <CaretIcon role=\"img\" aria-hidden focusable=\"false\" />\n </MenuTrigger>\n <MenuContent className=\"pin-left pin-right shadow py-2\">\n {submenuContent}\n </MenuContent>\n </Menu>\n );\n });\n }\n\n renderUserMenu() {\n const {\n userMenu,\n avatar,\n username,\n intl,\n } = this.props;\n\n return (\n <Menu transitionClassName=\"menu-dropdown\" transitionTimeout={250}>\n <MenuTrigger\n tag=\"button\"\n aria-label={intl.formatMessage(messages['header.label.account.menu.for'], { username })}\n className=\"btn btn-outline-primary d-inline-flex align-items-center pl-2 pr-3\"\n >\n <Avatar size=\"1.5em\" src={avatar} alt=\"\" className=\"mr-2\" />\n {username} <CaretIcon role=\"img\" aria-hidden focusable=\"false\" />\n </MenuTrigger>\n <MenuContent className=\"mb-0 dropdown-menu show dropdown-menu-right pin-right shadow py-2\">\n {userMenu.map(({ type, href, content }) => (\n <a className={`dropdown-${type}`} key={`${type}-${content}`} href={href}>{content}</a>\n ))}\n </MenuContent>\n </Menu>\n );\n }\n\n renderLoggedOutItems() {\n const { loggedOutItems } = this.props;\n\n return loggedOutItems.map((item, i, arr) => (\n <a\n key={`${item.type}-${item.content}`}\n className={i < arr.length - 1 ? 'btn mr-2 btn-link' : 'btn mr-2 btn-outline-primary'}\n href={item.href}\n >\n {item.content}\n </a>\n ));\n }\n\n render() {\n const {\n logo,\n logoAltText,\n logoDestination,\n loggedIn,\n intl,\n } = this.props;\n const logoProps = { src: logo, alt: logoAltText, href: logoDestination };\n const logoClasses = getConfig().AUTHN_MINIMAL_HEADER ? 'mw-100' : null;\n\n return (\n <header className=\"site-header-desktop\">\n <a className=\"nav-skip sr-only sr-only-focusable\" href=\"#main\">{intl.formatMessage(messages['header.label.skip.nav'])}</a>\n <div className={`container-fluid ${logoClasses}`}>\n <div className=\"nav-container position-relative d-flex align-items-center\">\n {logoDestination === null ? <Logo className=\"logo\" src={logo} alt={logoAltText} /> : <LinkedLogo className=\"logo\" {...logoProps} />}\n <nav\n aria-label={intl.formatMessage(messages['header.label.main.nav'])}\n className=\"nav main-nav\"\n >\n {this.renderMainMenu()}\n </nav>\n <nav\n aria-label={intl.formatMessage(messages['header.label.secondary.nav'])}\n className=\"nav secondary-menu-container align-items-center ml-auto\"\n >\n {loggedIn ? this.renderUserMenu() : this.renderLoggedOutItems()}\n </nav>\n </div>\n </div>\n </header>\n );\n }\n}\n\nDesktopHeader.propTypes = {\n mainMenu: PropTypes.oneOfType([\n PropTypes.node,\n PropTypes.array,\n ]),\n userMenu: PropTypes.arrayOf(PropTypes.shape({\n type: PropTypes.oneOf(['item', 'menu']),\n href: PropTypes.string,\n content: PropTypes.string,\n })),\n loggedOutItems: PropTypes.arrayOf(PropTypes.shape({\n type: PropTypes.oneOf(['item', 'menu']),\n href: PropTypes.string,\n content: PropTypes.string,\n })),\n logo: PropTypes.string,\n logoAltText: PropTypes.string,\n logoDestination: PropTypes.string,\n avatar: PropTypes.string,\n username: PropTypes.string,\n loggedIn: PropTypes.bool,\n\n // i18n\n intl: intlShape.isRequired,\n};\n\nDesktopHeader.defaultProps = {\n mainMenu: [],\n userMenu: [],\n loggedOutItems: [],\n logo: null,\n logoAltText: null,\n logoDestination: null,\n avatar: null,\n username: null,\n loggedIn: false,\n};\n\nexport default injectIntl(DesktopHeader);\n"],"file":"DesktopHeader.js"}
package/dist/Header.js ADDED
@@ -0,0 +1,86 @@
1
+ import React, { useContext } from 'react';
2
+ import Responsive from 'react-responsive';
3
+ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
4
+ import { AppContext } from '@edx/frontend-platform/react';
5
+ import { APP_CONFIG_INITIALIZED, ensureConfig, mergeConfig, getConfig, subscribe } from '@edx/frontend-platform';
6
+ import DesktopHeader from './DesktopHeader';
7
+ import MobileHeader from './MobileHeader';
8
+ import messages from './Header.messages';
9
+ ensureConfig(['LMS_BASE_URL', 'LOGOUT_URL', 'LOGIN_URL', 'SITE_NAME', 'LOGO_URL', 'ORDER_HISTORY_URL'], 'Header component');
10
+ subscribe(APP_CONFIG_INITIALIZED, function () {
11
+ mergeConfig({
12
+ AUTHN_MINIMAL_HEADER: !!process.env.AUTHN_MINIMAL_HEADER
13
+ }, 'Header additional config');
14
+ });
15
+
16
+ function Header(_ref) {
17
+ var intl = _ref.intl;
18
+
19
+ var _useContext = useContext(AppContext),
20
+ authenticatedUser = _useContext.authenticatedUser,
21
+ config = _useContext.config;
22
+
23
+ var mainMenu = [{
24
+ type: 'item',
25
+ href: "".concat(config.LMS_BASE_URL, "/dashboard"),
26
+ content: intl.formatMessage(messages['header.links.courses'])
27
+ }];
28
+ var orderHistoryItem = {
29
+ type: 'item',
30
+ href: config.ORDER_HISTORY_URL,
31
+ content: intl.formatMessage(messages['header.user.menu.order.history'])
32
+ };
33
+ var userMenu = authenticatedUser === null ? [] : [{
34
+ type: 'item',
35
+ href: "".concat(config.LMS_BASE_URL, "/dashboard"),
36
+ content: intl.formatMessage(messages['header.user.menu.dashboard'])
37
+ }, {
38
+ type: 'item',
39
+ href: "".concat(config.LMS_BASE_URL, "/u/").concat(authenticatedUser.username),
40
+ content: intl.formatMessage(messages['header.user.menu.profile'])
41
+ }, {
42
+ type: 'item',
43
+ href: "".concat(config.LMS_BASE_URL, "/account/settings"),
44
+ content: intl.formatMessage(messages['header.user.menu.account.settings'])
45
+ }, {
46
+ type: 'item',
47
+ href: config.LOGOUT_URL,
48
+ content: intl.formatMessage(messages['header.user.menu.logout'])
49
+ }]; // Users should only see Order History if have a ORDER_HISTORY_URL define in the environment.
50
+
51
+ if (config.ORDER_HISTORY_URL) {
52
+ userMenu.splice(-1, 0, orderHistoryItem);
53
+ }
54
+
55
+ var loggedOutItems = [{
56
+ type: 'item',
57
+ href: config.LOGIN_URL,
58
+ content: intl.formatMessage(messages['header.user.menu.login'])
59
+ }, {
60
+ type: 'item',
61
+ href: "".concat(config.LMS_BASE_URL, "/register"),
62
+ content: intl.formatMessage(messages['header.user.menu.register'])
63
+ }];
64
+ var props = {
65
+ logo: config.LOGO_URL,
66
+ logoAltText: config.SITE_NAME,
67
+ logoDestination: "".concat(config.LMS_BASE_URL, "/dashboard"),
68
+ loggedIn: authenticatedUser !== null,
69
+ username: authenticatedUser !== null ? authenticatedUser.username : null,
70
+ avatar: authenticatedUser !== null ? authenticatedUser.avatar : null,
71
+ mainMenu: getConfig().AUTHN_MINIMAL_HEADER ? [] : mainMenu,
72
+ userMenu: getConfig().AUTHN_MINIMAL_HEADER ? [] : userMenu,
73
+ loggedOutItems: getConfig().AUTHN_MINIMAL_HEADER ? [] : loggedOutItems
74
+ };
75
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Responsive, {
76
+ maxWidth: 768
77
+ }, /*#__PURE__*/React.createElement(MobileHeader, props)), /*#__PURE__*/React.createElement(Responsive, {
78
+ minWidth: 769
79
+ }, /*#__PURE__*/React.createElement(DesktopHeader, props)));
80
+ }
81
+
82
+ Header.propTypes = {
83
+ intl: intlShape.isRequired
84
+ };
85
+ export default injectIntl(Header);
86
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Header.jsx"],"names":["React","useContext","Responsive","injectIntl","intlShape","AppContext","APP_CONFIG_INITIALIZED","ensureConfig","mergeConfig","getConfig","subscribe","DesktopHeader","MobileHeader","messages","AUTHN_MINIMAL_HEADER","process","env","Header","intl","authenticatedUser","config","mainMenu","type","href","LMS_BASE_URL","content","formatMessage","orderHistoryItem","ORDER_HISTORY_URL","userMenu","username","LOGOUT_URL","splice","loggedOutItems","LOGIN_URL","props","logo","LOGO_URL","logoAltText","SITE_NAME","logoDestination","loggedIn","avatar","propTypes","isRequired"],"mappings":"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","sourcesContent":["import React, { useContext } from 'react';\nimport Responsive from 'react-responsive';\nimport { injectIntl, intlShape } from '@edx/frontend-platform/i18n';\nimport { AppContext } from '@edx/frontend-platform/react';\nimport {\n APP_CONFIG_INITIALIZED,\n ensureConfig,\n mergeConfig,\n getConfig,\n subscribe,\n} from '@edx/frontend-platform';\n\nimport DesktopHeader from './DesktopHeader';\nimport MobileHeader from './MobileHeader';\n\nimport messages from './Header.messages';\n\nensureConfig([\n 'LMS_BASE_URL',\n 'LOGOUT_URL',\n 'LOGIN_URL',\n 'SITE_NAME',\n 'LOGO_URL',\n 'ORDER_HISTORY_URL',\n], 'Header component');\n\nsubscribe(APP_CONFIG_INITIALIZED, () => {\n mergeConfig({\n AUTHN_MINIMAL_HEADER: !!process.env.AUTHN_MINIMAL_HEADER,\n }, 'Header additional config');\n});\n\nfunction Header({ intl }) {\n const { authenticatedUser, config } = useContext(AppContext);\n\n const mainMenu = [\n {\n type: 'item',\n href: `${config.LMS_BASE_URL}/dashboard`,\n content: intl.formatMessage(messages['header.links.courses']),\n },\n ];\n\n const orderHistoryItem = {\n type: 'item',\n href: config.ORDER_HISTORY_URL,\n content: intl.formatMessage(messages['header.user.menu.order.history']),\n };\n\n const userMenu = authenticatedUser === null ? [] : [\n {\n type: 'item',\n href: `${config.LMS_BASE_URL}/dashboard`,\n content: intl.formatMessage(messages['header.user.menu.dashboard']),\n },\n {\n type: 'item',\n href: `${config.LMS_BASE_URL}/u/${authenticatedUser.username}`,\n content: intl.formatMessage(messages['header.user.menu.profile']),\n },\n {\n type: 'item',\n href: `${config.LMS_BASE_URL}/account/settings`,\n content: intl.formatMessage(messages['header.user.menu.account.settings']),\n },\n {\n type: 'item',\n href: config.LOGOUT_URL,\n content: intl.formatMessage(messages['header.user.menu.logout']),\n },\n ];\n\n // Users should only see Order History if have a ORDER_HISTORY_URL define in the environment.\n if (config.ORDER_HISTORY_URL) {\n userMenu.splice(-1, 0, orderHistoryItem);\n }\n\n const loggedOutItems = [\n {\n type: 'item',\n href: config.LOGIN_URL,\n content: intl.formatMessage(messages['header.user.menu.login']),\n },\n {\n type: 'item',\n href: `${config.LMS_BASE_URL}/register`,\n content: intl.formatMessage(messages['header.user.menu.register']),\n },\n ];\n\n const props = {\n logo: config.LOGO_URL,\n logoAltText: config.SITE_NAME,\n logoDestination: `${config.LMS_BASE_URL}/dashboard`,\n loggedIn: authenticatedUser !== null,\n username: authenticatedUser !== null ? authenticatedUser.username : null,\n avatar: authenticatedUser !== null ? authenticatedUser.avatar : null,\n mainMenu: getConfig().AUTHN_MINIMAL_HEADER ? [] : mainMenu,\n userMenu: getConfig().AUTHN_MINIMAL_HEADER ? [] : userMenu,\n loggedOutItems: getConfig().AUTHN_MINIMAL_HEADER ? [] : loggedOutItems,\n };\n\n return (\n <>\n <Responsive maxWidth={768}>\n <MobileHeader {...props} />\n </Responsive>\n <Responsive minWidth={769}>\n <DesktopHeader {...props} />\n </Responsive>\n </>\n );\n}\n\nHeader.propTypes = {\n intl: intlShape.isRequired,\n};\n\nexport default injectIntl(Header);\n"],"file":"Header.js"}
@@ -0,0 +1,100 @@
1
+ import { defineMessages } from '@edx/frontend-platform/i18n';
2
+ var messages = defineMessages({
3
+ 'header.links.courses': {
4
+ id: 'header.links.courses',
5
+ defaultMessage: 'Courses',
6
+ description: 'Link to the learner course dashboard'
7
+ },
8
+ 'header.links.programs': {
9
+ id: 'header.links.programs',
10
+ defaultMessage: 'Programs',
11
+ description: 'Link to the learner program dashboard'
12
+ },
13
+ 'header.links.content.search': {
14
+ id: 'header.links.content.search',
15
+ defaultMessage: 'Discover New',
16
+ description: 'Link to the content search page'
17
+ },
18
+ 'header.links.schools': {
19
+ id: 'header.links.schools',
20
+ defaultMessage: 'Schools & Partners',
21
+ description: 'Link to the schools and partners landing page'
22
+ },
23
+ 'header.user.menu.dashboard': {
24
+ id: 'header.user.menu.dashboard',
25
+ defaultMessage: 'Dashboard',
26
+ description: 'Link to the user dashboard'
27
+ },
28
+ 'header.user.menu.profile': {
29
+ id: 'header.user.menu.profile',
30
+ defaultMessage: 'Profile',
31
+ description: 'Link to the user profile'
32
+ },
33
+ 'header.user.menu.account.settings': {
34
+ id: 'header.user.menu.account.settings',
35
+ defaultMessage: 'Account',
36
+ description: 'Link to account settings'
37
+ },
38
+ 'header.user.menu.order.history': {
39
+ id: 'header.user.menu.order.history',
40
+ defaultMessage: 'Order History',
41
+ description: 'Link to order history'
42
+ },
43
+ 'header.user.menu.logout': {
44
+ id: 'header.user.menu.logout',
45
+ defaultMessage: 'Logout',
46
+ description: 'Logout link'
47
+ },
48
+ 'header.user.menu.login': {
49
+ id: 'header.user.menu.login',
50
+ defaultMessage: 'Login',
51
+ description: 'Login link'
52
+ },
53
+ 'header.user.menu.register': {
54
+ id: 'header.user.menu.register',
55
+ defaultMessage: 'Sign Up',
56
+ description: 'Link to registration'
57
+ },
58
+ 'header.label.account.nav': {
59
+ id: 'header.label.account.nav',
60
+ defaultMessage: 'Account',
61
+ description: 'The aria label for the account menu nav'
62
+ },
63
+ 'header.label.account.menu': {
64
+ id: 'header.label.account.menu',
65
+ defaultMessage: 'Account Menu',
66
+ description: 'The aria label for the account menu trigger'
67
+ },
68
+ 'header.label.account.menu.for': {
69
+ id: 'header.label.account.menu.for',
70
+ defaultMessage: 'Account menu for {username}',
71
+ description: 'The aria label for the account menu trigger when the username is displayed in it'
72
+ },
73
+ 'header.label.main.nav': {
74
+ id: 'header.label.main.nav',
75
+ defaultMessage: 'Main',
76
+ description: 'The aria label for the main menu nav'
77
+ },
78
+ 'header.label.main.menu': {
79
+ id: 'header.label.main.menu',
80
+ defaultMessage: 'Main Menu',
81
+ description: 'The aria label for the main menu trigger'
82
+ },
83
+ 'header.label.main.header': {
84
+ id: 'header.label.main.header',
85
+ defaultMessage: 'Main',
86
+ description: 'The aria label for the main header'
87
+ },
88
+ 'header.label.secondary.nav': {
89
+ id: 'header.label.secondary.nav',
90
+ defaultMessage: 'Secondary',
91
+ description: 'The aria label for the seconary nav'
92
+ },
93
+ 'header.label.skip.nav': {
94
+ id: 'header.label.skip.nav',
95
+ defaultMessage: 'Skip to main content',
96
+ description: 'A link used by screen readers to allow users to skip to the main content of the page.'
97
+ }
98
+ });
99
+ export default messages;
100
+ //# sourceMappingURL=Header.messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Header.messages.jsx"],"names":["defineMessages","messages","id","defaultMessage","description"],"mappings":"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","sourcesContent":["import { defineMessages } from '@edx/frontend-platform/i18n';\n\nconst messages = defineMessages({\n 'header.links.courses': {\n id: 'header.links.courses',\n defaultMessage: 'Courses',\n description: 'Link to the learner course dashboard',\n },\n 'header.links.programs': {\n id: 'header.links.programs',\n defaultMessage: 'Programs',\n description: 'Link to the learner program dashboard',\n },\n 'header.links.content.search': {\n id: 'header.links.content.search',\n defaultMessage: 'Discover New',\n description: 'Link to the content search page',\n },\n 'header.links.schools': {\n id: 'header.links.schools',\n defaultMessage: 'Schools & Partners',\n description: 'Link to the schools and partners landing page',\n },\n 'header.user.menu.dashboard': {\n id: 'header.user.menu.dashboard',\n defaultMessage: 'Dashboard',\n description: 'Link to the user dashboard',\n },\n 'header.user.menu.profile': {\n id: 'header.user.menu.profile',\n defaultMessage: 'Profile',\n description: 'Link to the user profile',\n },\n 'header.user.menu.account.settings': {\n id: 'header.user.menu.account.settings',\n defaultMessage: 'Account',\n description: 'Link to account settings',\n },\n 'header.user.menu.order.history': {\n id: 'header.user.menu.order.history',\n defaultMessage: 'Order History',\n description: 'Link to order history',\n },\n 'header.user.menu.logout': {\n id: 'header.user.menu.logout',\n defaultMessage: 'Logout',\n description: 'Logout link',\n },\n 'header.user.menu.login': {\n id: 'header.user.menu.login',\n defaultMessage: 'Login',\n description: 'Login link',\n },\n 'header.user.menu.register': {\n id: 'header.user.menu.register',\n defaultMessage: 'Sign Up',\n description: 'Link to registration',\n },\n 'header.label.account.nav': {\n id: 'header.label.account.nav',\n defaultMessage: 'Account',\n description: 'The aria label for the account menu nav',\n },\n 'header.label.account.menu': {\n id: 'header.label.account.menu',\n defaultMessage: 'Account Menu',\n description: 'The aria label for the account menu trigger',\n },\n 'header.label.account.menu.for': {\n id: 'header.label.account.menu.for',\n defaultMessage: 'Account menu for {username}',\n description: 'The aria label for the account menu trigger when the username is displayed in it',\n },\n 'header.label.main.nav': {\n id: 'header.label.main.nav',\n defaultMessage: 'Main',\n description: 'The aria label for the main menu nav',\n },\n 'header.label.main.menu': {\n id: 'header.label.main.menu',\n defaultMessage: 'Main Menu',\n description: 'The aria label for the main menu trigger',\n },\n 'header.label.main.header': {\n id: 'header.label.main.header',\n defaultMessage: 'Main',\n description: 'The aria label for the main header',\n },\n 'header.label.secondary.nav': {\n id: 'header.label.secondary.nav',\n defaultMessage: 'Secondary',\n description: 'The aria label for the seconary nav',\n },\n 'header.label.skip.nav': {\n id: 'header.label.skip.nav',\n defaultMessage: 'Skip to main content',\n description: 'A link used by screen readers to allow users to skip to the main content of the page.',\n },\n});\n\nexport default messages;\n"],"file":"Header.messages.js"}