Skip to content

Commit 710c756

Browse files
committed
refactor(suite): update breakpoint handling
1 parent 2ddcc83 commit 710c756

File tree

4 files changed

+67
-66
lines changed

4 files changed

+67
-66
lines changed

packages/components/src/config/variables.ts

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { icons } from '@suite-common/icons/src/icons';
2-
import { above, below, breakpoints } from '@trezor/theme';
2+
import { aboveBreakpoint, belowBreakpoint, breakpoints } from '@trezor/theme';
33

44
/**
55
* @deprecated This key is deprecated. Please use `useLayoutSize` hook or breakpoints from `@trezor/theme`.
66
*/
77
export const SCREEN_SIZE = {
8-
UNAVAILABLE: `${breakpoints.unavailable}px`,
98
SM: `${breakpoints.mobile}px`,
109
MD: `${breakpoints.tablet}px`,
1110
LG: `${breakpoints.laptop}px`,
@@ -16,14 +15,14 @@ export const SCREEN_SIZE = {
1615
* @deprecated This key is deprecated. Please use `useLayoutSize` hook or breakpoints from `@trezor/theme`.
1716
*/
1817
export const SCREEN_QUERY = {
19-
MOBILE: `@media ${below(breakpoints.mobile)}`,
20-
ABOVE_MOBILE: `@media ${above(breakpoints.mobile)}`,
21-
BELOW_TABLET: `@media ${below(breakpoints.tablet)}`,
22-
ABOVE_TABLET: `@media ${above(breakpoints.tablet)}`,
23-
BELOW_LAPTOP: `@media ${below(breakpoints.laptop)}`,
24-
ABOVE_LAPTOP: `@media ${above(breakpoints.laptop)}`,
25-
BELOW_DESKTOP: `@media ${below(breakpoints.desktop)}`,
26-
ABOVE_DESKTOP: `@media ${above(breakpoints.desktop)}`,
18+
MOBILE: `@media ${belowBreakpoint(breakpoints.mobile)}`,
19+
ABOVE_MOBILE: `@media ${aboveBreakpoint(breakpoints.mobile)}`,
20+
BELOW_TABLET: `@media ${belowBreakpoint(breakpoints.tablet)}`,
21+
ABOVE_TABLET: `@media ${aboveBreakpoint(breakpoints.tablet)}`,
22+
BELOW_LAPTOP: `@media ${belowBreakpoint(breakpoints.laptop)}`,
23+
ABOVE_LAPTOP: `@media ${aboveBreakpoint(breakpoints.laptop)}`,
24+
BELOW_DESKTOP: `@media ${belowBreakpoint(breakpoints.desktop)}`,
25+
ABOVE_DESKTOP: `@media ${aboveBreakpoint(breakpoints.desktop)}`,
2726
} as const;
2827

2928
export const LAYOUT_SIZE = {

packages/suite/src/reducers/suite/windowReducer.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,8 @@ export default windowReducer;
3535

3636
export const selectIsWindowVisible = (state: WindowRootState) => state.window.isVisible;
3737

38-
// Selector for the breakpoint flags
39-
export const selectBreakpointFlags = (state: WindowRootState): BreakpointFlags => ({
40-
isBelowMobile: state.window.isBelowMobile,
41-
isBelowTablet: state.window.isBelowTablet,
42-
isBelowLaptop: state.window.isBelowLaptop,
43-
isBelowDesktop: state.window.isBelowDesktop,
44-
isAboveMobile: state.window.isAboveMobile,
45-
isAboveTablet: state.window.isAboveTablet,
46-
isAboveLaptop: state.window.isAboveLaptop,
47-
isAboveDesktop: state.window.isAboveDesktop,
48-
});
38+
export const selectBreakpointFlags = (state: WindowRootState): BreakpointFlags => {
39+
const { isVisible, ...breakpointFlags } = state.window;
40+
41+
return breakpointFlags;
42+
};

packages/suite/src/support/suite/Resize.tsx

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,45 @@
11
import { useEffect } from 'react';
22

3-
import { BreakpointFlags, above, below, breakpoints } from '@trezor/theme';
3+
import {
4+
Breakpoint,
5+
BreakpointFlagName,
6+
BreakpointFlags,
7+
BreakpointValue,
8+
aboveBreakpoint,
9+
belowBreakpoint,
10+
breakpoints,
11+
getBreakpointFlagNames,
12+
} from '@trezor/theme';
413

514
import { updateBreakpoints } from 'src/actions/suite/windowActions';
615
import { useDispatch } from 'src/hooks/suite';
716

8-
type FlagName = keyof BreakpointFlags;
9-
1017
const Resize = () => {
1118
const dispatch = useDispatch();
1219

1320
useEffect(() => {
14-
const queryList: Array<{ mq: MediaQueryList; flag: FlagName }> = Object.entries(breakpoints)
15-
.filter(([key]) => key !== 'unavailable')
16-
.flatMap(([key, value]) => {
17-
// Capitalize first letter for flag names
18-
const breakpointName = key.charAt(0).toUpperCase() + key.slice(1);
19-
20-
const belowFlag = `isBelow${breakpointName}` as FlagName;
21-
const aboveFlag = `isAbove${breakpointName}` as FlagName;
22-
23-
return [
24-
{
25-
mq: window.matchMedia(below(value)),
26-
flag: belowFlag,
27-
},
28-
{
29-
mq: window.matchMedia(above(value)),
30-
flag: aboveFlag,
31-
},
32-
];
33-
});
21+
const queryList: Array<{ mq: MediaQueryList; flag: BreakpointFlagName }> = (
22+
Object.entries(breakpoints) as [Breakpoint, BreakpointValue][]
23+
).flatMap(([breakpoint, breakpointValue]) => {
24+
const [belowFlag, aboveFlag] = getBreakpointFlagNames(breakpoint);
25+
26+
return [
27+
{
28+
mq: window.matchMedia(belowBreakpoint(breakpointValue)),
29+
flag: belowFlag,
30+
},
31+
{
32+
mq: window.matchMedia(aboveBreakpoint(breakpointValue)),
33+
flag: aboveFlag,
34+
},
35+
];
36+
});
3437

3538
const initialFlags = queryList.reduce<Partial<BreakpointFlags>>((acc, { mq, flag }) => {
3639
acc[flag] = mq.matches;
3740

3841
return acc;
3942
}, {});
40-
dispatch(updateBreakpoints(initialFlags));
4143

4244
const handlers = queryList.map(({ mq, flag }) => {
4345
const handler = (e: MediaQueryListEvent) => {
@@ -49,6 +51,8 @@ const Resize = () => {
4951
return { mq, handler };
5052
});
5153

54+
dispatch(updateBreakpoints(initialFlags));
55+
5256
return () => {
5357
handlers.forEach(({ mq, handler }) => {
5458
mq.removeEventListener('change', handler);

packages/theme/src/breakpoints.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export const breakpoints = {
2-
unavailable: 260,
32
mobile: 576, // Previously SM
43
tablet: 768, // Previously MD
54
laptop: 992, // Previously LG
@@ -8,28 +7,33 @@ export const breakpoints = {
87

98
export type Breakpoint = keyof typeof breakpoints;
109
export type BreakpointValue = (typeof breakpoints)[Breakpoint];
11-
12-
export const below = (breakpoint: BreakpointValue) => `(max-width: ${breakpoint - 1}px)`;
13-
export const above = (breakpoint: BreakpointValue) => `(min-width: ${breakpoint}px)`;
10+
export type BreakpointFlagName =
11+
| `isBelow${Capitalize<Breakpoint>}`
12+
| `isAbove${Capitalize<Breakpoint>}`;
1413

1514
export type BreakpointFlags = {
16-
isBelowMobile: boolean;
17-
isBelowTablet: boolean;
18-
isBelowLaptop: boolean;
19-
isBelowDesktop: boolean;
20-
isAboveMobile: boolean;
21-
isAboveTablet: boolean;
22-
isAboveLaptop: boolean;
23-
isAboveDesktop: boolean;
15+
[K in BreakpointFlagName]: boolean;
2416
};
2517

26-
export const initialBreakpointFlags: BreakpointFlags = {
27-
isBelowMobile: false,
28-
isBelowTablet: false,
29-
isBelowLaptop: false,
30-
isBelowDesktop: false,
31-
isAboveMobile: false,
32-
isAboveTablet: false,
33-
isAboveLaptop: false,
34-
isAboveDesktop: false,
18+
export const belowBreakpoint = (breakpoint: BreakpointValue) => `(max-width: ${breakpoint - 1}px)`;
19+
export const aboveBreakpoint = (breakpoint: BreakpointValue) => `(min-width: ${breakpoint}px)`;
20+
21+
export const getBreakpointFlagNames = (
22+
breakpoint: Breakpoint,
23+
): [BreakpointFlagName, BreakpointFlagName] => {
24+
const capitalizedBreakpoint = (breakpoint.charAt(0).toUpperCase() +
25+
breakpoint.slice(1)) as Capitalize<Breakpoint>;
26+
27+
return [`isBelow${capitalizedBreakpoint}`, `isAbove${capitalizedBreakpoint}`];
3528
};
29+
30+
export const initialBreakpointFlags: BreakpointFlags = Object.keys(breakpoints).reduce(
31+
(acc, breakpoint) => {
32+
const [belowFlag, aboveFlag] = getBreakpointFlagNames(breakpoint as Breakpoint);
33+
acc[belowFlag] = false;
34+
acc[aboveFlag] = false;
35+
36+
return acc;
37+
},
38+
{} as BreakpointFlags,
39+
);

0 commit comments

Comments
 (0)