Skip to content

Commit 2399582

Browse files
feat: add edx specific user menu
1 parent 762410d commit 2399582

7 files changed

Lines changed: 144 additions & 1 deletion

File tree

src/DesktopHeader.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { getConfig } from '@edx/frontend-platform';
55
import { AvatarButton, Dropdown } from '@openedx/paragon';
66

77
// Local Components
8+
import UserDashboardMenuGroup from './common/UserDashboardMenuGroup';
9+
import UserCareerMenuItem from './common/UserCareerMenuItem';
810
import UserMenuItem from './common/UserMenuItem';
911
import { Menu, MenuTrigger, MenuContent } from './Menu';
1012
import { LinkedLogo, Logo } from './Logo';
@@ -104,10 +106,12 @@ class DesktopHeader extends React.Component {
104106
/>
105107
</Dropdown.Item>
106108
)}
109+
{getConfig().ENABLE_EDX_PERSONAL_DASHBOARD && <UserDashboardMenuGroup />}
107110
{userMenu.map((group, index) => (
108111
// eslint-disable-next-line react/jsx-no-comment-textnodes,react/no-array-index-key
109112
<React.Fragment key={index}>
110113
{group.heading && <Dropdown.Header>{group.heading}</Dropdown.Header>}
114+
{getConfig().CAREER_LINK_URL && index === 0 && (<UserCareerMenuItem />)}
111115
{group.items.map(({
112116
type, content, href, disabled, isActive, onClick,
113117
}) => (

src/MobileHeader.jsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { getConfig } from '@edx/frontend-platform';
55

66
// Local Components
77
import { AvatarButton } from '@openedx/paragon';
8+
import UserDashboardMenuGroup from './common/UserDashboardMenuGroup';
9+
import UserCareerMenuItem from './common/UserCareerMenuItem';
810
import { Menu, MenuTrigger, MenuContent } from './Menu';
911
import { LinkedLogo, Logo } from './Logo';
1012
import UserMenuItem from './common/UserMenuItem';
@@ -97,7 +99,16 @@ class MobileHeader extends React.Component {
9799
))
98100
));
99101

100-
return userInfoItem ? [userInfoItem, ...userMenuItems] : userMenuItems;
102+
const userDashboardMenuGroup = (
103+
getConfig().ENABLE_EDX_PERSONAL_DASHBOARD ? <UserDashboardMenuGroup /> : null
104+
);
105+
const userCareerMenuItem = (
106+
getConfig().CAREER_LINK_URL ? <UserCareerMenuItem /> : null
107+
);
108+
109+
return userInfoItem
110+
? [userInfoItem, userDashboardMenuGroup, userCareerMenuItem, ...userMenuItems]
111+
: [userDashboardMenuGroup, userCareerMenuItem, ...userMenuItems];
101112
}
102113

103114
renderLoggedOutItems() {

src/common/UserCareerMenuItem.jsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import React from 'react';
2+
import { reduxHooks } from 'hooks'; // eslint-disable-line import/no-unresolved
3+
import {
4+
Badge, breakpoints, Dropdown, useWindowSize,
5+
} from '@openedx/paragon';
6+
import { useIntl } from '@edx/frontend-platform/i18n';
7+
import _ from 'lodash';
8+
import { getConfig } from '@edx/frontend-platform';
9+
import messages from './messages';
10+
11+
const UserCareerMenuItem = () => {
12+
const { formatMessage } = useIntl();
13+
const { width } = useWindowSize();
14+
const isMobile = width <= breakpoints.small.maxWidth;
15+
16+
const dashboard = reduxHooks.useEnterpriseDashboardData();
17+
18+
if (!_.isEmpty(dashboard)) {
19+
return null;
20+
}
21+
if (isMobile) {
22+
return (
23+
<li className="nav-item" key="item-career">
24+
<a href={`${getConfig().CAREER_LINK_URL}`} className="nav-link">
25+
{formatMessage(messages.career)}
26+
<Badge className="px-2 mx-2" variant="warning">
27+
{formatMessage(messages.newAlert)}
28+
</Badge>
29+
</a>
30+
</li>
31+
);
32+
}
33+
return (
34+
<Dropdown.Item href={`${getConfig().CAREER_LINK_URL}`} key="item-career">
35+
{formatMessage(messages.career)}
36+
<Badge className="px-2 mx-2" variant="warning">
37+
{formatMessage(messages.newAlert)}
38+
</Badge>
39+
</Dropdown.Item>
40+
);
41+
};
42+
43+
export default UserCareerMenuItem;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import React, { useEffect, useState } from 'react';
2+
import { reduxHooks } from 'hooks'; // eslint-disable-line import/no-unresolved
3+
import { breakpoints, Dropdown, useWindowSize } from '@openedx/paragon';
4+
import { useIntl } from '@edx/frontend-platform/i18n';
5+
import _ from 'lodash';
6+
import messages from './messages';
7+
8+
const UserDashboardMenuGroup = () => {
9+
const { formatMessage } = useIntl();
10+
const { width } = useWindowSize();
11+
const isMobile = width <= breakpoints.small.maxWidth;
12+
13+
const dashboard = reduxHooks.useEnterpriseDashboardData();
14+
15+
if (isMobile) {
16+
return (
17+
<>
18+
<li className="nav-item" key="item-dashboard">
19+
<a href="/edx-dashboard" className="nav-link active">
20+
{formatMessage(messages.dashboardPersonal)}
21+
</a>
22+
</li>
23+
{!_.isEmpty(dashboard) && (
24+
<li className="nav-item" key={dashboard.label}>
25+
<a href={dashboard.url} className="nav-link active">
26+
{dashboard.label} {formatMessage(messages.dashboard)}
27+
</a>
28+
</li>
29+
)}
30+
</>
31+
);
32+
}
33+
return (
34+
<>
35+
<Dropdown.Header>{formatMessage(messages.dashboardSwitch)}</Dropdown.Header>
36+
<Dropdown.Item as="a" href="/edx-dashboard" className="active" key="item-dashboard">
37+
{formatMessage(messages.dashboardPersonal)}
38+
</Dropdown.Item>
39+
{!_.isEmpty(dashboard) && (
40+
<Dropdown.Item as="a" href={dashboard.url} key={dashboard.label}>
41+
{dashboard.label} {formatMessage(messages.dashboard)}
42+
</Dropdown.Item>
43+
)}
44+
<Dropdown.Divider />
45+
</>
46+
);
47+
};
48+
49+
export default UserDashboardMenuGroup;

src/common/hooks.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// eslint-disable-next-line import/prefer-default-export
2+
export const reduxHooks = {
3+
useEnterpriseDashboardData: () => {},
4+
};

src/common/messages.jsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { defineMessages } from '@edx/frontend-platform/i18n';
2+
3+
const messages = defineMessages({
4+
dashboard: {
5+
id: 'learnerVariantDashboard.menu.dashboard.label',
6+
defaultMessage: 'Dashboard',
7+
description: 'The text for the user menu Dashboard navigation link.',
8+
},
9+
dashboardPersonal: {
10+
id: 'learnerVariantDashboard.menu.dashboardPersonal.label',
11+
defaultMessage: 'Personal',
12+
description: 'Link to personal dashboard in user menu',
13+
},
14+
dashboardSwitch: {
15+
id: 'learnerVariantDashboard.menu.dashboardSwitch.label',
16+
defaultMessage: 'SWITCH DASHBOARD',
17+
description: 'Switch Dashboard header in the user menu',
18+
},
19+
career: {
20+
id: 'leanerDashboard.menu.career.label',
21+
defaultMessage: 'Career',
22+
description: 'The text for the user menu Career navigation link.',
23+
},
24+
newAlert: {
25+
id: 'header.menu.new.label',
26+
defaultMessage: 'New',
27+
description: 'The text announcing that an item in the user menu is New',
28+
},
29+
});
30+
31+
export default messages;

webpack.dev.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module.exports = createConfig('webpack-dev', {
1010
resolve: {
1111
alias: {
1212
'@edx/frontend-component-header': path.resolve(__dirname, 'src'),
13+
hooks: path.resolve(__dirname, 'src/common/hooks'), // Adjust to the actual hooks path
1314
},
1415
},
1516
});

0 commit comments

Comments
 (0)