Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[system] Fix mode blink when open multiple sessions #33877

Merged
merged 10 commits into from Aug 24, 2022
36 changes: 18 additions & 18 deletions packages/mui-system/src/cssVars/useCurrentColorScheme.ts
Expand Up @@ -130,11 +130,26 @@ export default function useCurrentColorScheme<SupportedColorScheme extends strin

const [state, setState] = React.useState(() => {
const initialMode = resolveValue(modeStorageKey, defaultMode);
const systemMode = getSystemMode(initialMode);
const lightColorScheme =
resolveValue(`${colorSchemeStorageKey}-light`) || defaultLightColorScheme;
const darkColorScheme = resolveValue(`${colorSchemeStorageKey}-dark`) || defaultDarkColorScheme;
if (typeof window !== 'undefined') {
if (initialMode) {
localStorage.setItem(modeStorageKey, initialMode);
}
if (lightColorScheme) {
localStorage.setItem(`${colorSchemeStorageKey}-light`, lightColorScheme);
}
if (darkColorScheme) {
localStorage.setItem(`${colorSchemeStorageKey}-dark`, darkColorScheme);
}
}
return {
mode: initialMode,
systemMode: getSystemMode(initialMode),
lightColorScheme: resolveValue(`${colorSchemeStorageKey}-light`) || defaultLightColorScheme,
darkColorScheme: resolveValue(`${colorSchemeStorageKey}-dark`) || defaultDarkColorScheme,
systemMode,
lightColorScheme,
darkColorScheme,
} as State<SupportedColorScheme>;
});

Expand Down Expand Up @@ -243,21 +258,6 @@ export default function useCurrentColorScheme<SupportedColorScheme extends strin
return () => media.removeListener(handler);
}, []);

// Save mode, lightColorScheme & darkColorScheme to localStorage
React.useEffect(() => {
siriwatknp marked this conversation as resolved.
Show resolved Hide resolved
if (state.mode) {
localStorage.setItem(modeStorageKey, state.mode);
}
processState(state, (mode) => {
if (mode === 'light') {
localStorage.setItem(`${colorSchemeStorageKey}-light`, state.lightColorScheme);
}
if (mode === 'dark') {
localStorage.setItem(`${colorSchemeStorageKey}-dark`, state.darkColorScheme);
}
});
}, [state, colorSchemeStorageKey, modeStorageKey]);

// Handle when localStorage has changed
React.useEffect(() => {
const handleStorage = (event: StorageEvent) => {
Expand Down