Skip to content

Commit ba442f9

Browse files
committed
Change color scheme when user system pref. changes #347
1 parent e3e82a3 commit ba442f9

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

src/useIsDark/client.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ export function getIsDarkClientSide() {
3535
return $isAfterFirstEffect.current ? $clientSideIsDark.current : ssrWasPerformedWithIsDark;
3636
}
3737

38+
function getSystemColorScheme() {
39+
return typeof window.matchMedia === "function" &&
40+
window.matchMedia("(prefers-color-scheme: dark)").matches
41+
? "dark"
42+
: "light";
43+
}
44+
3845
export const useIsDarkClientSide: UseIsDark = () => {
3946
useRerenderOnChange($clientSideIsDark);
4047
useRerenderOnChange($isAfterFirstEffect);
@@ -54,10 +61,7 @@ export const useIsDarkClientSide: UseIsDark = () => {
5461
: newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
5562
) {
5663
case "system":
57-
return typeof window.matchMedia === "function" &&
58-
window.matchMedia("(prefers-color-scheme: dark)").matches
59-
? "dark"
60-
: "light";
64+
return getSystemColorScheme();
6165
case true:
6266
return "dark";
6367
case false:
@@ -113,20 +117,40 @@ export function startClientSideIsDarkLogic(params: {
113117
trustedTypesPolicyName
114118
} = params;
115119

116-
reset_user_preference: {
120+
reset_persisted_value_if_website_config_changed: {
117121
const localStorageKey = "scheme-default";
118122

119123
const localStorageValue = localStorage.getItem(localStorageKey);
120124

121125
if (localStorageValue === colorSchemeExplicitlyProvidedAsParameter) {
122-
break reset_user_preference;
126+
break reset_persisted_value_if_website_config_changed;
123127
}
124128

125129
localStorage.removeItem("scheme");
126130

127131
localStorage.setItem(localStorageKey, colorSchemeExplicitlyProvidedAsParameter);
128132
}
129133

134+
reset_persisted_value_if_system_pref_changed: {
135+
if (colorSchemeExplicitlyProvidedAsParameter !== "system") {
136+
break reset_persisted_value_if_system_pref_changed;
137+
}
138+
139+
const localStorageKey = "scheme-system";
140+
141+
const localStorageValue = localStorage.getItem(localStorageKey);
142+
143+
const systemColorScheme = getSystemColorScheme();
144+
145+
if (localStorageValue === systemColorScheme) {
146+
break reset_persisted_value_if_system_pref_changed;
147+
}
148+
149+
localStorage.removeItem("scheme");
150+
151+
localStorage.setItem(localStorageKey, systemColorScheme);
152+
}
153+
130154
const { clientSideIsDark, ssrWasPerformedWithIsDark: ssrWasPerformedWithIsDark_ } = ((): {
131155
clientSideIsDark: boolean;
132156
ssrWasPerformedWithIsDark: boolean;

0 commit comments

Comments
 (0)