/** * 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;