Skip to content

Commit cc94b6a

Browse files
committed
fix conflict while loading the state
1 parent 4b73b55 commit cc94b6a

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

lib/nthul/src/client/theme-switcher/theme-switcher.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,21 @@ export interface LoadSyncedStateProps extends ThemeSwitcherProps {
3232
setThemeState: SetStateAction<ThemeState>;
3333
}
3434

35-
function parseState(str?: string | null): ThemeState {
36-
const parts = (str ?? ",system,light").split(",") as [string, ColorSchemePreference, "light" | "dark"];
37-
return { theme: parts[0], colorSchemePreference: parts[1], systemColorScheme: parts[2] };
35+
function parseState(str?: string | null) {
36+
const parts = (str ?? ",system").split(",") as [string, ColorSchemePreference];
37+
return { theme: parts[0], colorSchemePreference: parts[1] };
3838
}
3939

40+
let tInit = 0;
41+
4042
function useLoadSyncedState({ dontSync, targetId, setThemeState }: LoadSyncedStateProps) {
4143
React.useEffect(() => {
4244
if (dontSync) return;
45+
tInit = Date.now();
4346
const key = targetId ?? DEFAULT_ID;
44-
setThemeState(parseState(localStorage.getItem(key)));
47+
setThemeState(state => ({ ...state, ...parseState(localStorage.getItem(key)) }));
4548
const storageListener = (e: StorageEvent) => {
46-
if (e.key === key) setThemeState(parseState(e.newValue));
49+
if (e.key === key) setThemeState(state => ({ ...state, ...parseState(e.newValue) }));
4750
};
4851
window.addEventListener("storage", storageListener);
4952
return () => {
@@ -114,10 +117,10 @@ export function ThemeSwitcher({ targetId, dontSync, themeTransition }: ThemeSwit
114117
React.useEffect(() => {
115118
const restoreTransitions = modifyTransition(themeTransition);
116119
updateDOM({ targetId, themeState, dontSync });
117-
if (!dontSync) {
120+
if (!dontSync && tInit < Date.now() - 300) {
118121
// save to localStorage
119-
const { theme, colorSchemePreference: csp, systemColorScheme: scs } = themeState;
120-
const stateToSave = [theme, csp, scs].join(",");
122+
const { theme, colorSchemePreference } = themeState;
123+
const stateToSave = [theme, colorSchemePreference].join(",");
121124
const key = targetId ?? DEFAULT_ID;
122125
localStorage.setItem(key, stateToSave);
123126
}

0 commit comments

Comments
 (0)