Skip to content

Commit d35cbae

Browse files
committed
Remove dependency by building our own device size hook
1 parent 9c7d435 commit d35cbae

File tree

4 files changed

+39
-66
lines changed

4 files changed

+39
-66
lines changed

package-lock.json

Lines changed: 0 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@
9595
"react-dom": "16.8.4",
9696
"react-ga": "^2.5.7",
9797
"react-redux": "^7.1.0",
98-
"react-responsive": "^8.0.3",
9998
"react-router-dom": "5.0.0",
10099
"react-select": "^3.0.6",
101100
"react-sortable-hoc": "^1.9.1",
@@ -176,7 +175,6 @@
176175
"@types/katex": "^0.10.1",
177176
"@types/lodash": "^4.14.136",
178177
"@types/react-beautiful-dnd": "^11.0.2",
179-
"@types/react-responsive": "^8.0.2",
180178
"@types/redux-mock-store": "^1.0.0",
181179
"@typescript-eslint/parser": "^1.13.0",
182180
"axios-mock-adapter": "^1.16.0",

src/app/components/elements/FastTrackProgress.tsx

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ import {GameboardDTO, GameboardItem, IsaacFastTrackQuestionPageDTO} from "../../
22
import queryString from "query-string";
33
import {useDispatch, useSelector} from "react-redux";
44
import {AppState} from "../../state/reducers";
5-
import {useMediaQuery} from "react-responsive";
65
import React, {useEffect} from "react";
76
import {fetchFasttrackConcepts} from "../../state/actions";
87
import * as RS from "reactstrap";
98
import {board} from "../../state/selectors";
109
import {Link} from "react-router-dom";
10+
import {useDeviceSize} from "../../services/device";
1111

1212
type QuestionLevel = "topTen" | "upper" | "lower";
1313

@@ -103,15 +103,12 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
103103
const gameboardMaybeNull = useSelector(board.currentGameboard);
104104
const fasttrackConcepts = useSelector((appState: AppState) => appState && appState.fasttrackConcepts);
105105

106-
const smDevice = useMediaQuery({query: '(min-width: 768px)'});
107-
const mdDevice = useMediaQuery({query: '(min-width: 992px)'});
108-
const lgDevice = useMediaQuery({query: '(min-width: 1200px)'});
109-
const deviceSize = lgDevice ? "lg" : mdDevice ? "md" : smDevice ? "sm" : "xs";
110-
const hexagonUnitLength = {lg: 28, md: 26, sm: 22, xs: 12.5}[deviceSize];
111-
const hexagonPadding = {lg: 4, md: 4, sm: 3, xs: 2}[deviceSize];
106+
const deviceSize = useDeviceSize();
107+
const hexagonUnitLength = {xl: 28, lg: 26, md: 22, sm: 22, xs: 12.5}[deviceSize];
108+
const hexagonPadding = {xl: 4, lg: 4, md: 3, sm: 3, xs: 2}[deviceSize];
112109
const hexagonHalfWidth = hexagonUnitLength;
113110
const hexagonQuarterHeight = hexagonUnitLength / Math.sqrt(3);
114-
const progressBarPadding = deviceSize !== 'xs' ? 5 : 1;
111+
const progressBarPadding = ["xs"].includes(deviceSize) ? 1 : 5;
115112

116113
const conceptQuestions =
117114
gameboardMaybeNull && fasttrackConcepts && fasttrackConcepts.gameboardId === gameboardMaybeNull.id && fasttrackConcepts.concept === doc.title ?
@@ -164,7 +161,7 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
164161
},
165162
base: {
166163
stroke: {
167-
width: {lg: 3, md: 3, sm: 2, xs: 2}[deviceSize],
164+
width: {xl: 3, lg: 3, md: 2, sm: 2, xs: 2}[deviceSize],
168165
colour: '#ddd'
169166
},
170167
fill: {
@@ -176,7 +173,7 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
176173
},
177174
questionPartProgress: {
178175
stroke: {
179-
width: {lg: 3, md: 3, sm: 2, xs: 2}[deviceSize],
176+
width: {xl: 3, lg: 3, md: 2, sm: 2, xs: 2}[deviceSize],
180177
colour: '#009acd'
181178
},
182179
fill: {colour: 'none'},
@@ -187,7 +184,7 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
187184
fill: 'none',
188185
stroke: {
189186
colour: '#fea100',
190-
width: {lg: 3, md: 3, sm: 2, xs: 2}[deviceSize],
187+
width: {xl: 3, lg: 3, md: 2, sm: 2, xs: 2}[deviceSize],
191188
dashArray: 4
192189
},
193190
};
@@ -340,14 +337,14 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
340337

341338
function generateHexagonTitle(title: string, isCurrentQuestion: boolean) {
342339
let isTwoCharLength = ("" + title).length > 1;
343-
let xSingleCharPosition = hexagon.halfWidth - {lg: 8, md: 8, sm: 6, xs: 5}[deviceSize];
344-
let xTwoCharPosition = hexagon.halfWidth - {lg: 14, md: 14, sm: 11, xs: 10}[deviceSize];
345-
let yPosition = hexagon.quarterHeight * 2 + {lg: 9, md: 9, sm: 7, xs: 6}[deviceSize];
340+
let xSingleCharPosition = hexagon.halfWidth - {xl: 8, lg: 8, md: 6, sm: 6, xs: 5}[deviceSize];
341+
let xTwoCharPosition = hexagon.halfWidth - {xl: 14, lg: 14, md: 11, sm: 11, xs: 10}[deviceSize];
342+
let yPosition = hexagon.quarterHeight * 2 + {xl: 9, lg: 9, md: 7, sm: 7, xs: 6}[deviceSize];
346343
return <text
347344
fontFamily="Exo 2"
348-
fontSize={{lg: 26, md: 26, sm: 18, xs: 18}[deviceSize]}
345+
fontSize={{xl: 26, lg: 26, md: 18, sm: 18, xs: 18}[deviceSize]}
349346
fontStyle="italic"
350-
fontWeight={deviceSize === 'xs' ? 500 : 600}
347+
fontWeight={["xs"].includes(deviceSize) ? 500 : 600}
351348
fill={isCurrentQuestion ? '#333' : '#ccc'}
352349
stroke="none"
353350
strokeWidth={1}
@@ -361,10 +358,10 @@ export function FastTrackProgress({doc, search}: {doc: IsaacFastTrackQuestionPag
361358
function generateCompletionTick(isCurrentQuestion: boolean) {
362359
return <image
363360
href="/assets/tick-bg.png"
364-
height={{lg: 36, md: 34, sm: 29, xs: 18}[deviceSize]}
365-
width={{lg: 36, md: 34, sm: 29, xs: 18}[deviceSize]}
366-
x={hexagon.halfWidth - {lg: 18, md: 17, sm: 15, xs: 9}[deviceSize]}
367-
y={hexagon.quarterHeight - {lg: 2, md: 2, sm: 2, xs: 2}[deviceSize]}
361+
height={{xl: 36, lg: 34, md: 29, sm: 29, xs: 18}[deviceSize]}
362+
width={{xl: 36, lg: 34, md: 29, sm: 29, xs: 18}[deviceSize]}
363+
x={hexagon.halfWidth - {xl: 18, lg: 17, md: 15, sm: 15, xs: 9}[deviceSize]}
364+
y={hexagon.quarterHeight - {xl: 2, lg: 2, md: 2, sm: 2, xs: 2}[deviceSize]}
368365
opacity={isCurrentQuestion ? 1 : 0.3}
369366
/>;
370367
}

src/app/services/device.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,29 @@
1+
import {useEffect, useState} from "react";
2+
13
const MOBILE_WINDOW_WIDTH = 768;
24

35
export const isMobile = () => {
46
return window.innerWidth < MOBILE_WINDOW_WIDTH;
57
};
68
export const isNotMobile = !isMobile();
79

8-
// TODO look at screen size methods so we dont hardcode
10+
export const useDeviceSize = () => {
11+
const getSize = (): "xl" | "lg" | "md" | "sm" | "xs" => {
12+
const width = window.innerWidth;
13+
if (width >= 1200) return "xl";
14+
else if (width >= 992) return "lg";
15+
else if (width >= 768) return "md";
16+
else if (width >= 576) return "sm";
17+
else return "xs";
18+
};
19+
20+
const [windowSize, setWindowSize] = useState(getSize);
21+
22+
useEffect(() => {
23+
const handleResize = () => {setWindowSize(getSize())};
24+
window.addEventListener('resize', handleResize);
25+
return () => window.removeEventListener('resize', handleResize);
26+
}, []);
27+
28+
return windowSize;
29+
};

0 commit comments

Comments
 (0)