2024-05-31 19:49:46 +05:30
|
|
|
import { createContext, useCallback, useContext, useState } from 'react';
|
|
|
|
|
import { useElementSizeObserver } from './useElementSizeObserver';
|
2023-06-22 09:14:50 +10:00
|
|
|
|
|
|
|
|
export const TABLET_BREAKPOINT = 1124;
|
|
|
|
|
export const MOBILE_BREAKPOINT = 750;
|
|
|
|
|
|
|
|
|
|
export enum ScreenSize {
|
|
|
|
|
Desktop = 'Desktop',
|
|
|
|
|
Tablet = 'Tablet',
|
|
|
|
|
Mobile = 'Mobile',
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const getScreenSize = (width: number): ScreenSize => {
|
|
|
|
|
if (width > TABLET_BREAKPOINT) return ScreenSize.Desktop;
|
|
|
|
|
if (width > MOBILE_BREAKPOINT) return ScreenSize.Tablet;
|
|
|
|
|
return ScreenSize.Mobile;
|
|
|
|
|
};
|
|
|
|
|
|
2024-05-31 19:49:46 +05:30
|
|
|
export const useScreenSize = (): ScreenSize => {
|
|
|
|
|
const [size, setSize] = useState<ScreenSize>(getScreenSize(document.body.clientWidth));
|
|
|
|
|
|
|
|
|
|
useElementSizeObserver(
|
|
|
|
|
useCallback(() => document.body, []),
|
|
|
|
|
useCallback((width) => setSize(getScreenSize(width)), [])
|
2023-06-22 09:14:50 +10:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return size;
|
|
|
|
|
};
|
2024-05-31 19:49:46 +05:30
|
|
|
|
|
|
|
|
const ScreenSizeContext = createContext<ScreenSize | null>(null);
|
|
|
|
|
export const ScreenSizeProvider = ScreenSizeContext.Provider;
|
|
|
|
|
|
|
|
|
|
export const useScreenSizeContext = (): ScreenSize => {
|
|
|
|
|
const screenSize = useContext(ScreenSizeContext);
|
|
|
|
|
if (screenSize === null) {
|
|
|
|
|
throw new Error('Screen size not provided!');
|
|
|
|
|
}
|
|
|
|
|
return screenSize;
|
|
|
|
|
};
|