Less break more perf

This commit is contained in:
Eric Bailey
2023-12-19 10:19:22 -06:00
parent eee9c25ccb
commit c57962571c
+38 -36
View File
@@ -44,39 +44,21 @@ export function createSystem<
themes: { themes: {
[key in ThemeName]: SystemTheme [key in ThemeName]: SystemTheme
} }
breakpoints: ReturnType<SystemTheme['getActiveBreakpoints']>
}>({ }>({
themeName: Object.keys(themes)[0], themeName: Object.keys(themes)[0],
theme: defaultTheme, theme: defaultTheme,
themes, themes,
breakpoints: defaultTheme.getActiveBreakpoints({
width: Dimensions.get('window').width,
}),
}) })
const ThemeProvider = ({ const ThemeProvider = ({
children, children,
theme, theme: themeName,
}: React.PropsWithChildren<{theme: ThemeName}>) => ( }: React.PropsWithChildren<{theme: ThemeName}>) => {
<Context.Provider const theme = themes[themeName]
value={React.useMemo(
() => ({
themeName: theme,
theme: themes[theme],
themes,
}),
[theme],
)}>
{children}
</Context.Provider>
)
function useTheme() {
return React.useContext(Context)
}
function useTokens() {
return React.useContext(Context).theme.config.tokens
}
function useBreakpoints() {
const {theme} = useTheme()
const [breakpoints, setBreakpoints] = React.useState(() => const [breakpoints, setBreakpoints] = React.useState(() =>
theme.getActiveBreakpoints({width: Dimensions.get('window').width}), theme.getActiveBreakpoints({width: Dimensions.get('window').width}),
) )
@@ -87,17 +69,39 @@ export function createSystem<
if (bp.current !== breakpoints.current) setBreakpoints(bp) if (bp.current !== breakpoints.current) setBreakpoints(bp)
}) })
return () => { return listener.remove
listener.remove() }, [breakpoints, theme, setBreakpoints])
}
}, [breakpoints, theme])
return breakpoints return (
<Context.Provider
value={React.useMemo(
() => ({
themeName: themeName,
theme,
themes,
breakpoints,
}),
[theme, themeName, breakpoints],
)}>
{children}
</Context.Provider>
)
}
function useTheme() {
return React.useContext(Context)
}
function useTokens() {
return useTheme().theme.config.tokens
}
function useBreakpoints() {
return useTheme().breakpoints
} }
function useStyle(props: ResponsiveStyleProps) { function useStyle(props: ResponsiveStyleProps) {
const {theme} = useTheme() const {theme, breakpoints} = useTheme()
const breakpoints = useBreakpoints()
return React.useMemo( return React.useMemo(
() => theme.style(props as StylesAndProps, breakpoints.active).styles, () => theme.style(props as StylesAndProps, breakpoints.active).styles,
[breakpoints.active, props, theme], [breakpoints.active, props, theme],
@@ -110,8 +114,7 @@ export function createSystem<
): { ): {
[Name in keyof O]: ReturnType<SystemTheme['style']>['styles'] [Name in keyof O]: ReturnType<SystemTheme['style']>['styles']
} { } {
const {theme} = useTheme() const {theme, breakpoints} = useTheme()
const breakpoints = useBreakpoints()
return React.useMemo(() => { return React.useMemo(() => {
const acc = {} as { const acc = {} as {
[Name in keyof O]: ReturnType<SystemTheme['style']>['styles'] [Name in keyof O]: ReturnType<SystemTheme['style']>['styles']
@@ -136,8 +139,7 @@ export function createSystem<
ResponsiveStyleProps & ResponsiveStyleProps &
DebugProps & {children?: React.ReactNode | React.ReactNodeArray} DebugProps & {children?: React.ReactNode | React.ReactNodeArray}
>((props, ref) => { >((props, ref) => {
const {theme} = useTheme() const {theme, breakpoints} = useTheme()
const breakpoints = useBreakpoints()
const {styles, props: rest} = React.useMemo( const {styles, props: rest} = React.useMemo(
() => () =>
theme.style<Props>( theme.style<Props>(