UNPKG

rn-custom-style-sheet

Version:

React Native component to select a specific value from a range of values.

79 lines (73 loc) 2.4 kB
import { useMemo } from 'react'; import { type GuideLineLayoutType, type ScreenResolutionType, type StateGuideLineBreakpointType, ThemeModeEnum, OrientationEnum, useCurrentOrientation, useDeepCompareMemo, useGuideLineBreakpoint, useGuideLineLayout, useScreenResolution, useCurrentBreakpointIndex, useGeneralScreenResolution, type GeneralScreenResolutionType, } from '../../../Core'; import { type MediaQueryAllQueryable, useDevice } from '../../../MediaQuery'; import { useCurrentThemeMode } from '../UseCurrentThemeMode'; import { useCurrentThemeName } from '../UseCurrentThemeName'; import type { StyleSheetPropsType, UseThemeReturnType } from './UseThemeTypes'; export default function useTheme<T>( styleSheetFn?: (styleOption: StyleSheetPropsType) => T, device?: Partial<MediaQueryAllQueryable> ): UseThemeReturnType<T> { const themeName: string = useCurrentThemeName(); const themeMode: ThemeModeEnum = useCurrentThemeMode(); const screenResolution: ScreenResolutionType = useScreenResolution(); const guideLineLayout: GuideLineLayoutType = useGuideLineLayout(); const guideLineBreakpoint: StateGuideLineBreakpointType = useGuideLineBreakpoint(); const generalScreenResolution: GeneralScreenResolutionType = useGeneralScreenResolution(); const localDevice: Partial<MediaQueryAllQueryable> = useDevice(); const orientation: OrientationEnum = useCurrentOrientation(); const currentBreakpointIndex: number = useCurrentBreakpointIndex(); const isDark: boolean = useMemo<boolean>( () => themeMode === ThemeModeEnum.Dark, [themeMode] ); const isPortrait: boolean = useMemo<boolean>( () => orientation === OrientationEnum.Portrait, [orientation] ); const styles: T = useDeepCompareMemo<T>( () => (styleSheetFn?.({ isDark, isPortrait, themeName, themeMode, screenResolution, guideLineLayout, guideLineBreakpoint, generalScreenResolution, device: device ?? localDevice, currentBreakpointIndex, }) ?? {}) as T, [ isDark, isPortrait, themeName, themeMode, screenResolution, guideLineLayout, guideLineBreakpoint, generalScreenResolution, device, localDevice, currentBreakpointIndex, ] ); return { styles, themeName, themeMode, isDark, isPortrait }; }