|
1 | | -import { useEffect } from 'react' |
| 1 | +import { useEffect, useState } from 'react' |
2 | 2 | import { type SharedValue, useSharedValue } from 'react-native-reanimated' |
3 | 3 |
|
4 | 4 | import type { UnistylesTheme } from '../types' |
5 | 5 |
|
6 | | -import { StyleSheet, UnistyleDependency, UnistylesRuntime } from '../specs' |
| 6 | +import { StyleSheet, UnistyleDependency, UnistylesRuntime, UnistylesShadowRegistry } from '../specs' |
7 | 7 |
|
8 | 8 | export const useAnimatedTheme = () => { |
9 | | - const theme = useSharedValue(UnistylesRuntime.getTheme()) |
| 9 | + const [scopedTheme, setScopedTheme] = useState( |
| 10 | + () => UnistylesShadowRegistry.getScopedTheme() as UnistylesTheme | undefined, |
| 11 | + ) |
| 12 | + const theme = useSharedValue(UnistylesRuntime.getTheme(scopedTheme)) |
| 13 | + const maybeNewScopedTheme = UnistylesShadowRegistry.getScopedTheme() as UnistylesTheme | undefined |
| 14 | + |
| 15 | + if (scopedTheme !== maybeNewScopedTheme) { |
| 16 | + setScopedTheme(maybeNewScopedTheme) |
| 17 | + theme.set(UnistylesRuntime.getTheme(maybeNewScopedTheme)) |
| 18 | + } |
10 | 19 |
|
11 | 20 | useEffect(() => { |
12 | | - const dispose = StyleSheet.addChangeListener((changedDependencies) => { |
13 | | - if (changedDependencies.includes(UnistyleDependency.Theme)) { |
14 | | - theme.set(UnistylesRuntime.getTheme()) |
| 21 | + const dispose = StyleSheet.addChangeListener(changedDependencies => { |
| 22 | + if (!changedDependencies.includes(UnistyleDependency.Theme)) { |
| 23 | + return |
| 24 | + } |
| 25 | + |
| 26 | + if (scopedTheme) { |
| 27 | + return |
15 | 28 | } |
| 29 | + |
| 30 | + theme.set(UnistylesRuntime.getTheme()) |
16 | 31 | }) |
17 | 32 |
|
18 | 33 | return () => dispose() |
19 | | - }, []) |
| 34 | + }, [scopedTheme]) |
20 | 35 |
|
21 | 36 | return theme as SharedValue<UnistylesTheme> |
22 | 37 | } |
0 commit comments