Skip to content

Commit d000d85

Browse files
feat: added screenInfo hook
1 parent 5dd8d32 commit d000d85

File tree

4 files changed

+69
-0
lines changed

4 files changed

+69
-0
lines changed

client/packages/lowcoder/src/comps/hooks/hookComp.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { ThemeComp } from "./themeComp";
3333
import UrlParamsHookComp from "./UrlParamsHookComp";
3434
import { UtilsComp } from "./utilsComp";
3535
import { VideoMeetingControllerComp } from "../comps/meetingComp/videoMeetingControllerComp";
36+
import { ScreenInfoHookComp } from "./screenInfoComp";
3637

3738
window._ = _;
3839
window.dayjs = dayjs;
@@ -97,6 +98,7 @@ const HookMap: HookCompMapRawType = {
9798
modal: ModalComp,
9899
meeting: VideoMeetingControllerComp,
99100
currentUser: CurrentUserHookComp,
101+
screenInfo: ScreenInfoHookComp,
100102
urlParams: UrlParamsHookComp,
101103
drawer: DrawerComp,
102104
theme: ThemeComp,

client/packages/lowcoder/src/comps/hooks/hookCompTypes.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const AllHookComp = [
1414
"message",
1515
"localStorage",
1616
"currentUser",
17+
"screenInfo",
1718
"urlParams",
1819
"theme",
1920
] as const;

client/packages/lowcoder/src/comps/hooks/hookListComp.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const defaultHookListValue = [
2121
{ compType: "message", name: "message" },
2222
{ compType: "localStorage", name: "localStorage" },
2323
{ compType: "currentUser", name: "currentUser" },
24+
{ compType: "screenInfo", name: "screenInfo" },
2425
{ compType: "theme", name: "theme" },
2526
] as const;
2627

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { useCallback, useEffect, useState } from "react";
2+
import { hookToStateComp } from "../generators/hookToComp";
3+
4+
enum ScreenTypes {
5+
Mobile = 'mobile',
6+
Tablet = 'tablet',
7+
Desktop = 'desktop',
8+
}
9+
10+
type ScreenType = typeof ScreenTypes[keyof typeof ScreenTypes]
11+
12+
type ScreenInfo = {
13+
width?: number;
14+
height?: number;
15+
deviceType?: ScreenType;
16+
isDesktop?: boolean;
17+
isTablet?: boolean;
18+
isMobile?: boolean;
19+
}
20+
21+
function useScreenInfo() {
22+
const getDeviceType = () => {
23+
if (window.screen.width < 768) return ScreenTypes.Mobile;
24+
if (window.screen.width < 889) return ScreenTypes.Tablet;
25+
return ScreenTypes.Desktop;
26+
}
27+
const getFlagsByDeviceType = (deviceType: ScreenType) => {
28+
const flags = {
29+
isMobile: false,
30+
isTablet: false,
31+
isDesktop: false,
32+
};
33+
if(deviceType === ScreenTypes.Mobile) {
34+
return { ...flags, isMobile: true };
35+
}
36+
if(deviceType === ScreenTypes.Tablet) {
37+
return { ...flags, Tablet: true };
38+
}
39+
return { ...flags, isDesktop: true };
40+
}
41+
42+
const getScreenInfo = useCallback(() => {
43+
const { width, height } = window.screen;
44+
const deviceType = getDeviceType();
45+
const flags = getFlagsByDeviceType(deviceType);
46+
47+
return { width, height, deviceType, ...flags };
48+
}, [])
49+
50+
const [screenInfo, setScreenInfo] = useState<ScreenInfo>({});
51+
52+
const updateScreenInfo = useCallback(() => {
53+
setScreenInfo(getScreenInfo());
54+
}, [getScreenInfo])
55+
56+
useEffect(() => {
57+
window.addEventListener('resize', updateScreenInfo);
58+
updateScreenInfo();
59+
return () => window.removeEventListener('resize', updateScreenInfo);
60+
}, [ updateScreenInfo ])
61+
62+
return screenInfo;
63+
}
64+
65+
export const ScreenInfoHookComp = hookToStateComp(useScreenInfo);

0 commit comments

Comments
 (0)