Skip to content

Commit d1dede5

Browse files
feat: hide sidebar on screen resize (#1720)
Adds an event handler on the window resize to check if the sidebar isOpen and the size of the viewport is smaller than the sidebar display to hide the sidebar and prevent it from blocking the course view.
1 parent 31b02d7 commit d1dede5

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

src/courseware/course/sidebar/sidebars/course-outline/CourseOutlineTray.test.jsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,21 @@ describe('<CourseOutlineTray />', () => {
102102
expect(mockToggleSidebar).toHaveBeenCalledWith(null);
103103
});
104104

105+
it('collapses sidebar correctly when screen is resized', async () => {
106+
const mockToggleSidebar = jest.fn();
107+
await initTestStore();
108+
renderWithProvider({ toggleSidebar: mockToggleSidebar });
109+
110+
const collapseBtn = screen.getByRole('button', { name: messages.toggleCourseOutlineTrigger.defaultMessage });
111+
expect(collapseBtn).toBeInTheDocument();
112+
113+
// Simulate screen resize
114+
window.innerWidth = 500;
115+
window.dispatchEvent(new Event('resize'));
116+
117+
expect(mockToggleSidebar).toHaveBeenCalledWith(null);
118+
});
119+
105120
it('navigates to section or sequence level correctly on click by back/section button', async () => {
106121
const user = userEvent.setup();
107122
await initTestStore();

src/courseware/course/sidebar/sidebars/course-outline/hooks.jsx renamed to src/courseware/course/sidebar/sidebars/course-outline/hooks.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { useContext, useEffect, useState } from 'react';
1+
import {
2+
useContext, useEffect, useLayoutEffect, useState,
3+
} from 'react';
24
import { useDispatch, useSelector } from 'react-redux';
35
import { useParams } from 'react-router-dom';
46
import { sendTrackEvent, sendTrackingLogEvent } from '@edx/frontend-platform/analytics';
7+
import { breakpoints } from '@openedx/paragon';
58

69
import { useModel } from '@src/generic/model-store';
710
import { LOADED } from '@src/constants';
@@ -54,10 +57,14 @@ export const useCourseOutlineSidebar = () => {
5457
} = course.entranceExamData || {};
5558
const isActiveEntranceExam = entranceExamEnabled && !entranceExamPassed;
5659

60+
const collapseSidebar = () => {
61+
toggleSidebar(null);
62+
window.sessionStorage.setItem('hideCourseOutlineSidebar', 'true');
63+
};
64+
5765
const handleToggleCollapse = () => {
5866
if (currentSidebar === ID) {
59-
toggleSidebar(null);
60-
window.sessionStorage.setItem('hideCourseOutlineSidebar', 'true');
67+
collapseSidebar();
6168
} else {
6269
toggleSidebar(ID);
6370
window.sessionStorage.removeItem('hideCourseOutlineSidebar');
@@ -107,6 +114,21 @@ export const useCourseOutlineSidebar = () => {
107114
}
108115
}, [courseId, isEnabledSidebar, courseOutlineShouldUpdate]);
109116

117+
// Collapse sidebar if screen resized to a width that displays the sidebar automatically
118+
useLayoutEffect(() => {
119+
const handleResize = () => {
120+
// breakpoints.large.maxWidth is 1200px and currently the breakpoint for showing the sidebar
121+
if (currentSidebar === ID && global.innerWidth < breakpoints.large.maxWidth) {
122+
collapseSidebar();
123+
}
124+
};
125+
126+
global.addEventListener('resize', handleResize);
127+
return () => {
128+
global.removeEventListener('resize', handleResize);
129+
};
130+
}, [isOpen]);
131+
110132
return {
111133
courseId,
112134
unitId,

0 commit comments

Comments
 (0)