Skip to content

Commit cf3a91d

Browse files
authored
feat: added course level isNewDiscussionSidebarViewEnabled flag to control sidebar view switching (openedx#1373)
* feat: added course level isNewDiscussionSidebarViewEnabled flag * test: fixed notification widget test cases
1 parent 72381a7 commit cf3a91d

File tree

11 files changed

+29
-25
lines changed

11 files changed

+29
-25
lines changed

.env

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ DISCOVERY_API_BASE_URL=''
1313
DISCUSSIONS_MFE_BASE_URL=''
1414
ECOMMERCE_BASE_URL=''
1515
ENABLE_JUMPNAV='true'
16-
ENABLE_NEW_SIDEBAR=''
1716
ENABLE_NOTICES=''
1817
ENTERPRISE_LEARNER_PORTAL_HOSTNAME=''
1918
EXAMS_BASE_URL=''

.env.development

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ DISCOVERY_API_BASE_URL='http://localhost:18381'
1313
DISCUSSIONS_MFE_BASE_URL='http://localhost:2002'
1414
ECOMMERCE_BASE_URL='http://localhost:18130'
1515
ENABLE_JUMPNAV='true'
16-
ENABLE_NEW_SIDEBAR=''
1716
ENABLE_NOTICES=''
1817
ENTERPRISE_LEARNER_PORTAL_HOSTNAME='localhost:8734'
1918
EXAMS_BASE_URL=''

.env.test

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ DISCOVERY_API_BASE_URL='http://localhost:18381'
1313
DISCUSSIONS_MFE_BASE_URL='http://localhost:2002'
1414
ECOMMERCE_BASE_URL='http://localhost:18130'
1515
ENABLE_JUMPNAV='true'
16-
ENABLE_NEW_SIDEBAR=''
1716
ENABLE_NOTICES=''
1817
ENTERPRISE_LEARNER_PORTAL_HOSTNAME='localhost:8734'
1918
EXAMS_BASE_URL='http://localhost:18740'

src/course-home/data/__factories__/courseHomeMetadata.factory.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Factory.define('courseHomeMetadata')
66
.option('host', 'http://localhost:18000')
77
.attrs({
88
title: 'Demonstration Course',
9+
is_new_discussion_sidebar_view_enabled: false,
910
is_self_paced: false,
1011
is_enrolled: false,
1112
is_staff: false,

src/course-home/data/__snapshots__/redux.test.js.snap

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Object {
3838
"id": "course-v1:edX+DemoX+Demo_Course",
3939
"isEnrolled": false,
4040
"isMasquerading": false,
41+
"isNewDiscussionSidebarViewEnabled": false,
4142
"isSelfPaced": false,
4243
"isStaff": false,
4344
"number": "DemoX",
@@ -425,6 +426,7 @@ Object {
425426
"id": "course-v1:edX+DemoX+Demo_Course",
426427
"isEnrolled": false,
427428
"isMasquerading": false,
429+
"isNewDiscussionSidebarViewEnabled": false,
428430
"isSelfPaced": false,
429431
"isStaff": false,
430432
"number": "DemoX",
@@ -693,6 +695,7 @@ Object {
693695
"id": "course-v1:edX+DemoX+Demo_Course",
694696
"isEnrolled": false,
695697
"isMasquerading": false,
698+
"isNewDiscussionSidebarViewEnabled": false,
696699
"isSelfPaced": false,
697700
"isStaff": false,
698701
"number": "DemoX",

src/courseware/course/Course.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ const Course = ({
3333
const {
3434
celebrations,
3535
isStaff,
36+
isNewDiscussionSidebarViewEnabled,
3637
} = useModel('courseHomeMeta', courseId);
3738
const sequence = useModel('sequences', sequenceId);
3839
const section = useModel('sections', sequence ? sequence.sectionId : null);
39-
const enableNewSidebar = getConfig().ENABLE_NEW_SIDEBAR;
4040
const navigationDisabled = sequence?.navigationDisabled ?? false;
4141

4242
const pageTitleBreadCrumbs = [
@@ -69,7 +69,7 @@ const Course = ({
6969
));
7070
}, [sequenceId]);
7171

72-
const SidebarProviderComponent = enableNewSidebar === 'true' ? NewSidebarProvider : SidebarProvider;
72+
const SidebarProviderComponent = isNewDiscussionSidebarViewEnabled ? NewSidebarProvider : SidebarProvider;
7373

7474
return (
7575
<SidebarProviderComponent courseId={courseId} unitId={unitId}>
@@ -102,7 +102,7 @@ const Course = ({
102102
)}
103103
{shouldDisplayTriggers && (
104104
<>
105-
{enableNewSidebar === 'true' ? <NewSidebarTriggers /> : <SidebarTriggers /> }
105+
{isNewDiscussionSidebarViewEnabled ? <NewSidebarTriggers /> : <SidebarTriggers /> }
106106
</>
107107
)}
108108
</div>

src/courseware/course/new-sidebar/sidebars/discussions-notifications/notifications/NotificationsWidget.test.jsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import React from 'react';
44
import MockAdapter from 'axios-mock-adapter';
55
import { Factory } from 'rosie';
66

7-
import { mergeConfig, getConfig } from '@edx/frontend-platform';
7+
import { getConfig } from '@edx/frontend-platform';
88
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
99
import { breakpoints } from '@openedx/paragon';
1010

@@ -49,13 +49,11 @@ describe('NotificationsWidget', () => {
4949
axiosMock = new MockAdapter(getAuthenticatedHttpClient());
5050
axiosMock.onGet(courseMetadataUrl).reply(200, defaultMetadata);
5151
axiosMock.onGet(courseHomeMetadataUrl).reply(200, courseHomeMetadata);
52-
mergeConfig({ ENABLE_NEW_SIDEBAR: 'true' }, 'Custom app config');
5352
});
5453

55-
it('successfully Open/Hide sidebar tray.', async () => {
54+
it('successfully Open/Hide sidebar tray', async () => {
5655
const userVerifiedMode = Factory.build('verifiedMode');
57-
58-
await setupDiscussionSidebar(userVerifiedMode);
56+
await setupDiscussionSidebar({ verifiedMode: userVerifiedMode, isNewDiscussionSidebarViewEnabled: true });
5957

6058
const sidebarButton = await screen.getByRole('button', { name: /Show sidebar tray/i });
6159

@@ -129,7 +127,11 @@ describe('NotificationsWidget', () => {
129127
])('successfully %s', async ({ enabledInContext, testId }) => {
130128
const userVerifiedMode = Factory.build('verifiedMode');
131129

132-
await setupDiscussionSidebar(userVerifiedMode, enabledInContext);
130+
await setupDiscussionSidebar({
131+
verifiedMode: userVerifiedMode,
132+
enabledInContext,
133+
isNewDiscussionSidebarViewEnabled: true,
134+
});
133135

134136
const sidebarButton = screen.getByRole('button', { name: /Show sidebar tray/i });
135137

src/courseware/course/sequence/Sequence.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import React, {
33
useEffect, useState,
44
} from 'react';
5-
import { getConfig } from '@edx/frontend-platform';
65
import PropTypes from 'prop-types';
76
import classNames from 'classnames';
87

@@ -46,13 +45,13 @@ const Sequence = ({
4645
const {
4746
isStaff,
4847
originalUserIsStaff,
48+
isNewDiscussionSidebarViewEnabled,
4949
} = useModel('courseHomeMeta', courseId);
5050
const sequence = useModel('sequences', sequenceId);
5151
const unit = useModel('units', unitId);
5252
const sequenceStatus = useSelector(state => state.courseware.sequenceStatus);
5353
const sequenceMightBeUnit = useSelector(state => state.courseware.sequenceMightBeUnit);
5454
const shouldDisplayNotificationTriggerInSequence = useWindowSize().width < breakpoints.small.minWidth;
55-
const enableNewSidebar = getConfig().ENABLE_NEW_SIDEBAR;
5655

5756
const handleNext = () => {
5857
const nextIndex = sequence.unitIds.indexOf(unitId) + 1;
@@ -171,7 +170,7 @@ const Sequence = ({
171170
}}
172171
/>
173172
{shouldDisplayNotificationTriggerInSequence && (
174-
enableNewSidebar === 'true' ? <NewSidebarTriggers /> : <SidebarTriggers />
173+
isNewDiscussionSidebarViewEnabled ? <NewSidebarTriggers /> : <SidebarTriggers />
175174
)}
176175
</div>
177176

@@ -199,7 +198,7 @@ const Sequence = ({
199198
)}
200199
</div>
201200
</div>
202-
{enableNewSidebar === 'true' ? <NewSidebar /> : <Sidebar />}
201+
{isNewDiscussionSidebarViewEnabled ? <NewSidebar /> : <Sidebar />}
203202
</div>
204203
<PluginSlot
205204
id="sequence_container_plugin"

src/courseware/course/sequence/sequence-navigation/hooks.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useContext } from 'react';
22
import { useSelector } from 'react-redux';
33
import { breakpoints, useWindowSize } from '@openedx/paragon';
4-
import { getConfig } from '@edx/frontend-platform';
54

65
import { useModel } from '../../../../generic/model-store';
76
import { sequenceIdsSelector } from '../../../data';
@@ -80,8 +79,11 @@ export function useIsOnXLDesktop() {
8079
}
8180

8281
export function useIsSidebarOpen(unitId) {
83-
const { currentSidebar } = useContext(getConfig().ENABLE_NEW_SIDEBAR === 'true' ? NewSidebarContext : SidebarContext);
82+
const courseId = useSelector(state => state.courseware.courseId);
83+
const { isNewDiscussionSidebarViewEnabled } = useModel('courseHomeMeta', courseId);
84+
const { currentSidebar } = useContext(isNewDiscussionSidebarViewEnabled ? NewSidebarContext : SidebarContext);
8485
const topic = useModel('discussionTopics', unitId);
85-
return currentSidebar === WIDGETS.NOTIFICATIONS
86-
|| (currentSidebar === WIDGETS.DISCUSSIONS && !!(topic?.id || topic?.enabledInContext));
86+
87+
return (currentSidebar === WIDGETS.NOTIFICATIONS) || (
88+
currentSidebar === WIDGETS.DISCUSSIONS && !!(topic?.id || topic?.enabledInContext));
8789
}

src/courseware/course/test-utils.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import { Factory } from 'rosie';
3-
import { getConfig } from '@edx/frontend-platform';
3+
import { getConfig, snakeCaseObject } from '@edx/frontend-platform';
44
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
55
import MockAdapter from 'axios-mock-adapter';
66
import { breakpoints } from '@openedx/paragon';
@@ -16,7 +16,8 @@ const mockData = {
1616
unitNavigationHandler: () => {},
1717
};
1818

19-
const setupDiscussionSidebar = async (verifiedMode = null, enabledInContext = true) => {
19+
const setupDiscussionSidebar = async (HomeMetaParams) => {
20+
const params = { verifiedMode: null, enabledInContext: true, ...HomeMetaParams };
2021
const store = await initializeTestStore();
2122
const { courseware, models } = store.getState();
2223
const { courseId, sequenceId } = courseware;
@@ -27,12 +28,12 @@ const setupDiscussionSidebar = async (verifiedMode = null, enabledInContext = tr
2728
});
2829
global.innerWidth = breakpoints.extraLarge.minWidth;
2930

30-
const courseHomeMetadata = Factory.build('courseHomeMetadata', { verified_mode: verifiedMode });
31+
const courseHomeMetadata = Factory.build('courseHomeMetadata', { ...snakeCaseObject(params) });
3132
const testStore = await initializeTestStore({ provider: 'openedx', courseHomeMetadata });
3233
const state = testStore.getState();
3334
const axiosMock = new MockAdapter(getAuthenticatedHttpClient());
3435
axiosMock.onGet(`${getConfig().LMS_BASE_URL}/api/discussion/v1/courses/${courseId}`).reply(200, { provider: 'openedx' });
35-
const topicsResponse = buildTopicsFromUnits(state.models.units, enabledInContext);
36+
const topicsResponse = buildTopicsFromUnits(state.models.units, params.enabledInContext);
3637
axiosMock.onGet(`${getConfig().LMS_BASE_URL}/api/discussion/v2/course_topics/${courseId}`)
3738
.reply(200, topicsResponse);
3839

0 commit comments

Comments
 (0)