Skip to content

Commit 0df9082

Browse files
authored
Merge pull request #3042 from Keshav-0907/centralising-breakpoints
Centralised Breakpoints using useIsMobile hook
2 parents 795ae09 + 5486751 commit 0df9082

File tree

7 files changed

+174
-187
lines changed

7 files changed

+174
-187
lines changed

client/components/Dropdown/TableDropdown.jsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
import React from 'react';
2-
import { useMediaQuery } from 'react-responsive';
32
import styled from 'styled-components';
43
import { prop, remSize } from '../../theme';
54
import DropdownMenu from './DropdownMenu';
65

76
import DownFilledTriangleIcon from '../../images/down-filled-triangle.svg';
87
import MoreIconSvg from '../../images/more.svg';
8+
import useIsMobile from '../../modules/IDE/hooks/useIsMobile';
99

1010
const DotsHorizontal = styled(MoreIconSvg)`
1111
transform: rotate(90deg);
1212
`;
1313

1414
const TableDropdownIcon = () => {
15-
// TODO: centralize breakpoints
16-
const isMobile = useMediaQuery({ maxWidth: 770 });
17-
15+
const isMobile = useIsMobile();
1816
return isMobile ? (
1917
<DotsHorizontal focusable="false" aria-hidden="true" />
2018
) : (

client/modules/IDE/components/Header/Nav.jsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { sortBy } from 'lodash';
44
import { Link } from 'react-router-dom';
55
import PropTypes from 'prop-types';
66
import { useTranslation } from 'react-i18next';
7-
import MediaQuery from 'react-responsive';
87
import NavDropdownMenu from '../../../../components/Nav/NavDropdownMenu';
98
import NavMenuItem from '../../../../components/Nav/NavMenuItem';
109
import { availableLanguages, languageKeyToLabel } from '../../../../i18n';
@@ -30,21 +29,20 @@ import {
3029
import { logoutUser } from '../../../User/actions';
3130
import { CmControllerContext } from '../../pages/IDEView';
3231
import MobileNav from './MobileNav';
32+
import useIsMobile from '../../hooks/useIsMobile';
3333

34-
const Nav = ({ layout }) => (
35-
<MediaQuery minWidth={770}>
36-
{(matches) =>
37-
matches ? (
38-
<NavBar>
39-
<LeftLayout layout={layout} />
40-
<UserMenu />
41-
</NavBar>
42-
) : (
43-
<MobileNav />
44-
)
45-
}
46-
</MediaQuery>
47-
);
34+
const Nav = ({ layout }) => {
35+
const isMobile = useIsMobile();
36+
37+
return isMobile ? (
38+
<MobileNav />
39+
) : (
40+
<NavBar>
41+
<LeftLayout layout={layout} />
42+
<UserMenu />
43+
</NavBar>
44+
);
45+
};
4846

4947
Nav.propTypes = {
5048
layout: PropTypes.oneOf(['dashboard', 'project'])

client/modules/IDE/components/Header/index.jsx

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,22 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33
import { useSelector } from 'react-redux';
4-
import MediaQuery from 'react-responsive';
4+
import useIsMobile from '../../hooks/useIsMobile';
5+
56
import Nav from './Nav';
67
import Toolbar from './Toolbar';
78

89
const Header = (props) => {
910
const project = useSelector((state) => state.project);
1011

12+
const isMobile = useIsMobile();
13+
1114
return (
1215
<header>
1316
<Nav />
14-
<MediaQuery minWidth={770}>
15-
{(matches) => {
16-
if (matches)
17-
return (
18-
<Toolbar
19-
syncFileContent={props.syncFileContent}
20-
key={project.id}
21-
/>
22-
);
23-
return null;
24-
}}
25-
</MediaQuery>
17+
{!isMobile && (
18+
<Toolbar syncFileContent={props.syncFileContent} key={project.id} />
19+
)}
2620
</header>
2721
);
2822
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useMediaQuery } from 'react-responsive';
2+
3+
const useIsMobile = (customBreakpoint) => {
4+
const breakPoint = customBreakpoint || 770;
5+
const isMobile = useMediaQuery({ maxWidth: breakPoint });
6+
return isMobile;
7+
};
8+
9+
export default useIsMobile;

client/modules/IDE/pages/IDEView.jsx

Lines changed: 97 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useDispatch, useSelector } from 'react-redux';
44
import { useTranslation } from 'react-i18next';
55
import { Helmet } from 'react-helmet';
66
import SplitPane from 'react-split-pane';
7-
import MediaQuery from 'react-responsive';
87
import IDEKeyHandlers from '../components/IDEKeyHandlers';
98
import Sidebar from '../components/Sidebar';
109
import PreviewFrame from '../components/PreviewFrame';
@@ -27,6 +26,7 @@ import {
2726
PreviewWrapper
2827
} from '../components/Editor/MobileEditor';
2928
import IDEOverlays from '../components/IDEOverlays';
29+
import useIsMobile from '../hooks/useIsMobile';
3030

3131
function getTitle(project) {
3232
const { id } = project;
@@ -90,6 +90,7 @@ function WarnIfUnsavedChanges() {
9090
export const CmControllerContext = React.createContext({});
9191

9292
const IDEView = () => {
93+
const isMobile = useIsMobile();
9394
const ide = useSelector((state) => state.ide);
9495
const preferences = useSelector((state) => state.preferences);
9596
const project = useSelector((state) => state.project);
@@ -175,115 +176,111 @@ const IDEView = () => {
175176
<CmControllerContext.Provider value={cmRef}>
176177
<Header syncFileContent={syncFileContent} />
177178
</CmControllerContext.Provider>
178-
<MediaQuery minWidth={770}>
179-
{(matches) =>
180-
matches ? (
181-
<main className="editor-preview-container">
179+
{isMobile ? (
180+
<>
181+
<FloatingActionButton
182+
syncFileContent={syncFileContent}
183+
offsetBottom={ide.isPlaying ? currentConsoleSize : 0}
184+
/>
185+
<PreviewWrapper show={ide.isPlaying}>
186+
<SplitPane
187+
style={{ position: 'static' }}
188+
split="horizontal"
189+
primary="second"
190+
size={currentConsoleSize}
191+
minSize={consoleCollapsedSize}
192+
onChange={(size) => {
193+
setConsoleSize(size);
194+
setIsOverlayVisible(true);
195+
}}
196+
onDragFinished={() => {
197+
setIsOverlayVisible(false);
198+
}}
199+
allowResize={ide.consoleIsExpanded}
200+
className="editor-preview-subpanel"
201+
>
202+
<PreviewFrame
203+
fullView
204+
hide={!ide.isPlaying}
205+
cmController={cmRef.current}
206+
isOverlayVisible={isOverlayVisible}
207+
/>
208+
<Console />
209+
</SplitPane>
210+
</PreviewWrapper>
211+
<EditorSidebarWrapper show={!ide.isPlaying}>
212+
<Sidebar />
213+
<Editor
214+
provideController={(ctl) => {
215+
cmRef.current = ctl;
216+
}}
217+
/>
218+
</EditorSidebarWrapper>
219+
</>
220+
) : (
221+
<main className="editor-preview-container">
222+
<SplitPane
223+
split="vertical"
224+
size={ide.sidebarIsExpanded ? sidebarSize : 20}
225+
onChange={(size) => {
226+
setSidebarSize(size);
227+
}}
228+
allowResize={ide.sidebarIsExpanded}
229+
minSize={150}
230+
>
231+
<Sidebar />
232+
<SplitPane
233+
split="vertical"
234+
maxSize={MaxSize * 0.965}
235+
defaultSize="50%"
236+
onChange={() => {
237+
setIsOverlayVisible(true);
238+
}}
239+
onDragFinished={() => {
240+
setIsOverlayVisible(false);
241+
}}
242+
resizerStyle={{
243+
borderLeftWidth: '2px',
244+
borderRightWidth: '2px',
245+
width: '2px',
246+
margin: '0px 0px'
247+
}}
248+
>
182249
<SplitPane
183-
split="vertical"
184-
size={ide.sidebarIsExpanded ? sidebarSize : 20}
250+
split="horizontal"
251+
primary="second"
252+
size={currentConsoleSize}
253+
minSize={consoleCollapsedSize}
185254
onChange={(size) => {
186-
setSidebarSize(size);
255+
setConsoleSize(size);
187256
}}
188-
allowResize={ide.sidebarIsExpanded}
189-
minSize={150}
257+
allowResize={ide.consoleIsExpanded}
258+
className="editor-preview-subpanel"
190259
>
191-
<Sidebar />
192-
<SplitPane
193-
split="vertical"
194-
maxSize={MaxSize * 0.965}
195-
defaultSize="50%"
196-
onChange={() => {
197-
setIsOverlayVisible(true);
198-
}}
199-
onDragFinished={() => {
200-
setIsOverlayVisible(false);
201-
}}
202-
resizerStyle={{
203-
borderLeftWidth: '2px',
204-
borderRightWidth: '2px',
205-
width: '2px',
206-
margin: '0px 0px'
260+
<Editor
261+
provideController={(ctl) => {
262+
cmRef.current = ctl;
207263
}}
208-
>
209-
<SplitPane
210-
split="horizontal"
211-
primary="second"
212-
size={currentConsoleSize}
213-
minSize={consoleCollapsedSize}
214-
onChange={(size) => {
215-
setConsoleSize(size);
216-
}}
217-
allowResize={ide.consoleIsExpanded}
218-
className="editor-preview-subpanel"
219-
>
220-
<Editor
221-
provideController={(ctl) => {
222-
cmRef.current = ctl;
223-
}}
224-
/>
225-
<Console />
226-
</SplitPane>
227-
<section className="preview-frame-holder">
228-
<header className="preview-frame__header">
229-
<h2 className="preview-frame__title">
230-
{t('Toolbar.Preview')}
231-
</h2>
232-
</header>
233-
<div className="preview-frame__content">
234-
<PreviewFrame
235-
cmController={cmRef.current}
236-
isOverlayVisible={isOverlayVisible}
237-
/>
238-
</div>
239-
</section>
240-
</SplitPane>
264+
/>
265+
<Console />
241266
</SplitPane>
242-
</main>
243-
) : (
244-
<>
245-
<FloatingActionButton
246-
syncFileContent={syncFileContent}
247-
offsetBottom={ide.isPlaying ? currentConsoleSize : 0}
248-
/>
249-
<PreviewWrapper show={ide.isPlaying}>
250-
<SplitPane
251-
style={{ position: 'static' }}
252-
split="horizontal"
253-
primary="second"
254-
size={currentConsoleSize}
255-
minSize={consoleCollapsedSize}
256-
onChange={(size) => {
257-
setConsoleSize(size);
258-
setIsOverlayVisible(true);
259-
}}
260-
onDragFinished={() => {
261-
setIsOverlayVisible(false);
262-
}}
263-
allowResize={ide.consoleIsExpanded}
264-
className="editor-preview-subpanel"
265-
>
267+
<section className="preview-frame-holder">
268+
<header className="preview-frame__header">
269+
<h2 className="preview-frame__title">
270+
{t('Toolbar.Preview')}
271+
</h2>
272+
</header>
273+
<div className="preview-frame__content">
266274
<PreviewFrame
267-
fullView
268-
hide={!ide.isPlaying}
269275
cmController={cmRef.current}
270276
isOverlayVisible={isOverlayVisible}
271277
/>
272-
<Console />
273-
</SplitPane>
274-
</PreviewWrapper>
275-
<EditorSidebarWrapper show={!ide.isPlaying}>
276-
<Sidebar />
277-
<Editor
278-
provideController={(ctl) => {
279-
cmRef.current = ctl;
280-
}}
281-
/>
282-
</EditorSidebarWrapper>
283-
</>
284-
)
285-
}
286-
</MediaQuery>
278+
</div>
279+
</section>
280+
</SplitPane>
281+
</SplitPane>
282+
</main>
283+
)}
287284
<IDEOverlays />
288285
</RootPage>
289286
);

0 commit comments

Comments
 (0)