Files
frontend/src/presentation/hooks/responsive/useScreenSize.ts

64 lines
1.6 KiB
TypeScript
Raw Normal View History

/**
* useScreenSize Hook
* -
*/
import { useState, useEffect, useMemo } from 'react';
import { Dimensions, ScaledSize } from 'react-native';
import { getBreakpoint, getFineBreakpoint } from './useBreakpoint';
import type { BreakpointKey, FineBreakpointKey, ScreenSize } from './types';
/**
*
* Dimensions.get('window')
*/
export function useWindowDimensions(): ScaledSize {
const [dimensions, setDimensions] = useState(() => Dimensions.get('window'));
useEffect(() => {
const subscription = Dimensions.addEventListener('change', ({ window }) => {
setDimensions(window);
});
return () => {
subscription.remove();
};
}, []);
return dimensions;
}
/**
* Hook
*
*
* @returns
*
* @example
* const { width, height, isMobile, isTablet, isDesktop, isWide } = useScreenSize();
*/
export function useScreenSize(): ScreenSize & {
breakpoint: BreakpointKey;
fineBreakpoint: FineBreakpointKey;
} {
const { width, height } = useWindowDimensions();
return useMemo(() => {
const breakpoint = getBreakpoint(width);
const fineBreakpoint = getFineBreakpoint(width);
return {
width,
height,
breakpoint,
fineBreakpoint,
isMobile: breakpoint === 'mobile',
isTablet: breakpoint === 'tablet',
isDesktop: breakpoint === 'desktop',
isWide: breakpoint === 'wide',
};
}, [width, height]);
}
export default useScreenSize;