import { Dimensions, PixelRatio, useWindowDimensions } from 'react-native'; import { useContext } from 'react'; import { ScaleSizeContext } from '../Context'; const deviceWidth = Dimensions.get('window').width; const DEFAULT_SCREEN_SIZE = 375; const MAX_FONT_SCALE = 1.5; const MAX_DEVICE_SCALE = 5; const useScaleSize = (size: number, scaleRate?: number) => { const scaleSizeContext = useContext(ScaleSizeContext); const fontScale = PixelRatio.getFontScale(); const windowSize = useWindowDimensions(); const deviceScale = windowSize.width / DEFAULT_SCREEN_SIZE; const maxScaleRate = scaleRate || scaleSizeContext?.scaleSizeMaxRate || MAX_FONT_SCALE; let fontSizeDeviceScale = size; let fontSizeOSScale = size; if (deviceScale > 1) { fontSizeDeviceScale = Math.min( fontSizeDeviceScale * deviceScale, fontSizeDeviceScale + MAX_DEVICE_SCALE, ); } if (fontScale > 1) { fontSizeOSScale = Math.min( fontSizeOSScale * fontScale, fontSizeOSScale * maxScaleRate, ); } return Math.max(fontSizeDeviceScale, fontSizeOSScale); }; const scaleSize = (size: number) => { const fontScale = PixelRatio.getFontScale(); const deviceScale = deviceWidth / DEFAULT_SCREEN_SIZE; let fontSizeDeviceScale = size; let fontSizeOSScale = size; if (deviceScale > 1) { fontSizeDeviceScale = Math.min( fontSizeDeviceScale * deviceScale, fontSizeDeviceScale + MAX_DEVICE_SCALE, ); } if (fontScale > 1) { fontSizeOSScale = Math.min( fontSizeOSScale * fontScale, fontSizeOSScale * MAX_FONT_SCALE, ); } return Math.max(fontSizeDeviceScale, fontSizeOSScale); }; export { scaleSize, useScaleSize };