Less break more perf
This commit is contained in:
+38
-36
@@ -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>(
|
||||||
|
|||||||
Reference in New Issue
Block a user