Skip to content

Commit b5014b2

Browse files
committed
fix: display programs only if the url is configured
1 parent 0408a54 commit b5014b2

File tree

8 files changed

+49
-11
lines changed

8 files changed

+49
-11
lines changed

src/containers/LearnerDashboardHeader/LearnerDashboardMenu.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const getLearnerHeaderMenu = (
99
courseSearchUrl,
1010
authenticatedUser,
1111
exploreCoursesClick,
12+
programsEnabled = false,
1213
) => ({
1314
mainMenu: [
1415
{
@@ -17,11 +18,11 @@ const getLearnerHeaderMenu = (
1718
content: formatMessage(messages.course),
1819
isActive: true,
1920
},
20-
{
21+
...(programsEnabled ? [{
2122
type: 'item',
2223
href: `${urls.programsUrl()}`,
2324
content: formatMessage(messages.program),
24-
},
25+
}] : []),
2526
{
2627
type: 'item',
2728
href: `${urls.baseAppUrl(courseSearchUrl)}`,
@@ -70,6 +71,7 @@ const getLearnerHeaderMenu = (
7071
],
7172
},
7273
],
73-
});
74+
}
75+
);
7476

7577
export default getLearnerHeaderMenu;

src/containers/LearnerDashboardHeader/__snapshots__/index.test.jsx.snap

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@ exports[`LearnerDashboardHeader render 1`] = `
1212
"isActive": true,
1313
"type": "item",
1414
},
15-
{
16-
"content": "Programs",
17-
"href": "http://localhost:18000/dashboard/programs",
18-
"type": "item",
19-
},
2015
{
2116
"content": "Discover New",
2217
"href": "http://localhost:18000/course-search-url",

src/containers/LearnerDashboardHeader/hooks.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import track from 'tracking';
55
import { StrictDict } from 'utils';
66
import { linkNames } from 'tracking/constants';
77

8+
import { apiHooks } from 'hooks';
89
import getLearnerHeaderMenu from './LearnerDashboardMenu';
910

1011
import * as module from './hooks';
@@ -30,8 +31,9 @@ export const findCoursesNavDropdownClicked = (href) => track.findCourses.findCou
3031
export const useLearnerDashboardHeaderMenu = ({
3132
courseSearchUrl, authenticatedUser, exploreCoursesClick,
3233
}) => {
34+
const { enabled: programsEnabled } = apiHooks.useProgramsConfig();
3335
const { formatMessage } = useIntl();
34-
return getLearnerHeaderMenu(formatMessage, courseSearchUrl, authenticatedUser, exploreCoursesClick);
36+
return getLearnerHeaderMenu(formatMessage, courseSearchUrl, authenticatedUser, exploreCoursesClick, programsEnabled);
3537
};
3638

3739
export const useLearnerDashboardHeaderData = () => {

src/containers/LearnerDashboardHeader/hooks.test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ jest.mock('tracking', () => ({
2121
findCoursesClicked: jest.fn(),
2222
},
2323
}));
24+
jest.mock('hooks', () => ({
25+
apiHooks: {
26+
useProgramsConfig: jest.fn(() => ({})),
27+
},
28+
}));
2429

2530
const url = 'http://example.com';
2631

@@ -56,7 +61,7 @@ describe('LearnerDashboardHeader hooks', () => {
5661
username: 'test',
5762
};
5863
const learnerHomeHeaderMenu = useLearnerDashboardHeaderMenu({ courseSearchUrl, authenticatedUser });
59-
expect(learnerHomeHeaderMenu.mainMenu.length).toBe(3);
64+
expect(learnerHomeHeaderMenu.mainMenu.length).toBe(2);
6065
});
6166
});
6267

src/containers/LearnerDashboardHeader/index.test.jsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { shallow } from '@edx/react-unit-test-utils';
33
import Header from '@edx/frontend-component-header';
44

55
import urls from 'data/services/lms/urls';
6+
import { apiHooks } from 'hooks';
67
import LearnerDashboardHeader from '.';
78
import { findCoursesNavClicked } from './hooks';
89

@@ -12,6 +13,9 @@ jest.mock('hooks', () => ({
1213
courseSearchUrl: '/course-search-url',
1314
})),
1415
},
16+
apiHooks: {
17+
useProgramsConfig: jest.fn(() => ({})),
18+
},
1519
}));
1620
jest.mock('./hooks', () => ({
1721
...jest.requireActual('./hooks'),
@@ -29,7 +33,13 @@ describe('LearnerDashboardHeader', () => {
2933
expect(wrapper.instance.findByType('ConfirmEmailBanner')).toHaveLength(1);
3034
expect(wrapper.instance.findByType('MasqueradeBar')).toHaveLength(1);
3135
expect(wrapper.instance.findByType(Header)).toHaveLength(1);
32-
wrapper.instance.findByType(Header)[0].props.mainMenuItems[2].onClick();
36+
wrapper.instance.findByType(Header)[0].props.mainMenuItems[1].onClick();
3337
expect(findCoursesNavClicked).toHaveBeenCalledWith(urls.baseAppUrl('/course-search-url'));
38+
expect(wrapper.instance.findByType(Header)[0].props.mainMenuItems.length).toBe(2);
39+
});
40+
test('should display Programs link if the service is configured in the backend', () => {
41+
apiHooks.useProgramsConfig.mockReturnValue({ enabled: true });
42+
const wrapper = shallow(<LearnerDashboardHeader />);
43+
expect(wrapper.instance.findByType(Header)[0].props.mainMenuItems.length).toBe(3);
3444
});
3545
});

src/data/services/lms/api.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export const initializeList = ({ user } = {}) => get(
2020
stringifyUrl(urls.getInitApiUrl(), { [apiKeys.user]: user }),
2121
);
2222

23+
export const getProgramsConfig = () => get(urls.programsConfigUrl());
24+
2325
export const updateEntitlementEnrollment = ({ uuid, courseId }) => post(
2426
urls.entitlementEnrollment(uuid),
2527
{ [apiKeys.courseRunId]: courseId },
@@ -73,6 +75,7 @@ export const createCreditRequest = ({ providerId, courseId, username }) => post(
7375

7476
export default {
7577
initializeList,
78+
getProgramsConfig,
7679
unenrollFromCourse,
7780
updateEmailSettings,
7881
updateEntitlementEnrollment,

src/data/services/lms/urls.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const baseAppUrl = (url) => updateUrl(getBaseUrl(), url);
2222
export const learningMfeUrl = (url) => updateUrl(getConfig().LEARNING_BASE_URL, url);
2323

2424
// static view url
25+
const programsConfigUrl = () => baseAppUrl('/config/programs');
2526
const programsUrl = () => baseAppUrl('/dashboard/programs');
2627

2728
export const creditPurchaseUrl = (courseId) => `${getEcommerceUrl()}/credit/checkout/${courseId}/`;
@@ -37,6 +38,7 @@ export default StrictDict({
3738
event,
3839
getInitApiUrl,
3940
learningMfeUrl,
41+
programsConfigUrl,
4042
programsUrl,
4143
updateEmailSettings,
4244
});

src/hooks/api.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,25 @@ export const useInitializeApp = () => {
3131
});
3232
};
3333

34+
export const useProgramsConfig = () => {
35+
const [config, setConfig] = React.useState({});
36+
37+
React.useEffect(() => {
38+
const fetchProgramsConfig = async () => {
39+
try {
40+
const { data } = await api.getProgramsConfig();
41+
setConfig(data);
42+
} catch (error) {
43+
console.error('Error accessing programs configuration', error);
44+
}
45+
};
46+
47+
fetchProgramsConfig();
48+
}, []);
49+
50+
return config;
51+
};
52+
3453
export const useNewEntitlementEnrollment = (cardId) => {
3554
const { uuid } = reduxHooks.useCardEntitlementData(cardId);
3655
const onSuccess = module.useInitializeApp();

0 commit comments

Comments
 (0)