Skip to content

Commit dc38cdb

Browse files
authored
Merge pull request #1178 from jpudysz/feature/use-animated-theme
fix: use animated theme with scoped themes
2 parents 993430a + 081d10a commit dc38cdb

2 files changed

Lines changed: 42 additions & 14 deletions

File tree

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,37 @@
1-
import { useEffect } from 'react'
1+
import { useEffect, useState } from 'react'
22
import { type SharedValue, useSharedValue } from 'react-native-reanimated'
33

44
import type { UnistylesTheme } from '../types'
55

6-
import { StyleSheet, UnistyleDependency, UnistylesRuntime } from '../specs'
6+
import { StyleSheet, UnistyleDependency, UnistylesRuntime, UnistylesShadowRegistry } from '../specs'
77

88
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+
}
1019

1120
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
1528
}
29+
30+
theme.set(UnistylesRuntime.getTheme())
1631
})
1732

1833
return () => dispose()
19-
}, [])
34+
}, [scopedTheme])
2035

2136
return theme as SharedValue<UnistylesTheme>
2237
}
Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
1-
import { useEffect } from 'react'
1+
import { useEffect, useState } from 'react'
22
import { type SharedValue, useSharedValue } from 'react-native-reanimated'
33

44
import type { UnistylesTheme } from '../types'
55

6-
import { UnistyleDependency, UnistylesRuntime } from '../specs'
6+
import { UnistyleDependency, UnistylesRuntime, UnistylesShadowRegistry } from '../specs'
77
import { services } from '../web/services'
88

99
export const useAnimatedTheme = () => {
10-
const theme = useSharedValue(UnistylesRuntime.getTheme())
10+
const [scopedTheme, setScopedTheme] = useState(
11+
() => UnistylesShadowRegistry.getScopedTheme() as UnistylesTheme | undefined,
12+
)
13+
const theme = useSharedValue(UnistylesRuntime.getTheme(scopedTheme))
14+
const maybeNewScopedTheme = UnistylesShadowRegistry.getScopedTheme() as UnistylesTheme | undefined
15+
16+
if (scopedTheme !== maybeNewScopedTheme) {
17+
setScopedTheme(maybeNewScopedTheme)
18+
theme.set(UnistylesRuntime.getTheme(maybeNewScopedTheme))
19+
}
1120

1221
useEffect(() => {
13-
const dispose = services.listener.addListeners([UnistyleDependency.Theme], () =>
14-
theme.set(UnistylesRuntime.getTheme()),
15-
)
22+
const dispose = services.listener.addListeners([UnistyleDependency.Theme], () => {
23+
if (scopedTheme) {
24+
return
25+
}
26+
27+
theme.set(UnistylesRuntime.getTheme())
28+
})
1629

1730
return () => {
1831
dispose()
1932
}
20-
}, [])
33+
}, [scopedTheme])
2134

2235
return theme as SharedValue<UnistylesTheme>
2336
}

0 commit comments

Comments
 (0)