|
1 | | -import { useEffect } from "react"; |
2 | 1 | import { ThemeSwitcherProps } from "../theme-switcher"; |
3 | 2 | import { DARK, DEFAULT_ID, LIGHT } from "../../constants"; |
4 | | -import { useForcedStore, useThemeStore } from "../../store"; |
| 3 | +import { UNDEFINED, useThemeStore } from "../../store"; |
5 | 4 | import type { ResolveFunc, UpdateDOMFunc, UpdateForcedPropsFunc } from "../theme-switcher/no-fouc"; |
6 | 5 |
|
7 | 6 | let media: MediaQueryList; |
8 | 7 | let updateDOM: UpdateDOMFunc; |
9 | 8 | let resolveTheme: ResolveFunc; |
10 | 9 | let updateForcedProps: UpdateForcedPropsFunc; |
11 | | -let updateForcedState: UpdateForcedPropsFunc; |
12 | 10 |
|
13 | 11 | /** disable transition while switching theme */ |
14 | 12 | const modifyTransition = (themeTransition = "none") => { |
@@ -44,35 +42,24 @@ export const Switcher = ({ |
44 | 42 | const k = targetSelector || "#" + DEFAULT_ID; |
45 | 43 |
|
46 | 44 | const [state, setState] = useThemeStore(targetSelector); |
47 | | - const [forced] = useForcedStore(targetSelector); |
48 | 45 |
|
49 | | - useEffect(() => { |
50 | | - if (typeof m !== "undefined") |
51 | | - [media, updateDOM, resolveTheme, updateForcedProps, updateForcedState] = [m, u, r, f, g]; |
| 46 | + if (typeof m != UNDEFINED && !updateForcedProps) { |
| 47 | + [media, updateDOM, resolveTheme, updateForcedProps] = [m, u, r, f]; |
52 | 48 |
|
53 | 49 | media.addEventListener("change", () => |
54 | 50 | setState(state => ({ ...state, s: media.matches ? DARK : LIGHT })), |
55 | 51 | ); |
56 | 52 | addEventListener("storage", e => { |
57 | 53 | if (e.key === k) setState(state => ({ ...state, ...JSON.parse(e.newValue || "{}") })); |
58 | 54 | }); |
59 | | - }, []); |
60 | | - |
61 | | - useEffect(() => { |
| 55 | + } |
| 56 | + if (updateForcedProps) { |
| 57 | + updateForcedProps(forcedTheme, forcedColorScheme); |
62 | 58 | const restoreThansitions = modifyTransition(themeTransition); |
63 | 59 | updateDOM(resolveTheme(state), k); |
64 | 60 | restoreThansitions(); |
65 | | - localStorage.setItem(k, JSON.stringify(state)); |
66 | | - }, [state]); |
67 | | - |
68 | | - useEffect(() => { |
69 | | - updateForcedProps(forcedTheme, forcedColorScheme); |
70 | | - updateDOM(resolveTheme(state), k); |
71 | | - }, [forcedColorScheme, forcedTheme]); |
72 | | - |
73 | | - useEffect(() => { |
74 | | - updateForcedState(forced.f, forced.fc); |
75 | | - updateDOM(resolveTheme(state), k); |
76 | | - }, [forced]); |
| 61 | + const { f, fc, ...others } = state; |
| 62 | + localStorage.setItem(k, JSON.stringify(others)); |
| 63 | + } |
77 | 64 | return null; |
78 | 65 | }; |
0 commit comments