1
- import { assert } from "tsafe/assert" ;
1
+ import { assert , type Equals } from "tsafe/assert" ;
2
+ import { isAmong } from "tsafe/isAmong" ;
2
3
import { createStatefulObservable , useRerenderOnChange } from "../tools/StatefulObservable" ;
3
4
import { useConstCallback } from "../tools/powerhooks/useConstCallback" ;
4
5
import { fr } from "../fr" ;
@@ -54,14 +55,14 @@ export const useIsDarkClientSide: UseIsDark = () => {
54
55
newIsDarkOrDeduceNewIsDarkFromCurrentIsDark => {
55
56
const data_fr_js_value = document . documentElement . getAttribute ( "data-fr-js" ) ;
56
57
57
- const newColorScheme = ( ( ) : ColorScheme => {
58
+ const newColorScheme = ( ( ) : ColorScheme | "system" => {
58
59
switch (
59
60
typeof newIsDarkOrDeduceNewIsDarkFromCurrentIsDark === "function"
60
61
? newIsDarkOrDeduceNewIsDarkFromCurrentIsDark ( isDark )
61
62
: newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
62
63
) {
63
64
case "system" :
64
- return getSystemColorScheme ( ) ;
65
+ return "system" ;
65
66
case true :
66
67
return "dark" ;
67
68
case false :
@@ -73,7 +74,10 @@ export const useIsDarkClientSide: UseIsDark = () => {
73
74
74
75
if ( data_fr_js_value !== "true" ) {
75
76
//NOTE: DSFR not started yet.
76
- document . documentElement . setAttribute ( data_fr_theme , newColorScheme ) ;
77
+ document . documentElement . setAttribute (
78
+ data_fr_theme ,
79
+ newColorScheme === "system" ? getSystemColorScheme ( ) : newColorScheme
80
+ ) ;
77
81
localStorage . setItem ( "scheme" , newColorScheme ) ;
78
82
}
79
83
}
@@ -118,7 +122,7 @@ export function startClientSideIsDarkLogic(params: {
118
122
} = params ;
119
123
120
124
reset_persisted_value_if_website_config_changed: {
121
- const localStorageKey = "scheme-default" ;
125
+ const localStorageKey = "scheme-website-config- default" ;
122
126
123
127
const localStorageValue = localStorage . getItem ( localStorageKey ) ;
124
128
@@ -131,26 +135,6 @@ export function startClientSideIsDarkLogic(params: {
131
135
localStorage . setItem ( localStorageKey , colorSchemeExplicitlyProvidedAsParameter ) ;
132
136
}
133
137
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
-
154
138
const { clientSideIsDark, ssrWasPerformedWithIsDark : ssrWasPerformedWithIsDark_ } = ( ( ) : {
155
139
clientSideIsDark : boolean ;
156
140
ssrWasPerformedWithIsDark : boolean ;
@@ -170,7 +154,7 @@ export function startClientSideIsDarkLogic(params: {
170
154
return undefined ;
171
155
}
172
156
173
- switch ( colorSchemeExplicitlyProvidedAsParameter as ColorScheme ) {
157
+ switch ( colorSchemeExplicitlyProvidedAsParameter ) {
174
158
case "dark" :
175
159
return true ;
176
160
case "light" :
@@ -185,26 +169,29 @@ export function startClientSideIsDarkLogic(params: {
185
169
return undefined ;
186
170
}
187
171
172
+ assert (
173
+ isAmong < ColorScheme | "system" > (
174
+ [ "dark" , "light" , "system" ] ,
175
+ colorSchemeReadFromLocalStorage
176
+ )
177
+ ) ;
178
+
188
179
if ( colorSchemeReadFromLocalStorage === "system" ) {
189
180
return undefined ;
190
181
}
191
182
192
- switch ( colorSchemeReadFromLocalStorage as ColorScheme ) {
183
+ switch ( colorSchemeReadFromLocalStorage ) {
193
184
case "dark" :
194
185
return true ;
195
186
case "light" :
196
187
return false ;
197
188
}
198
- } ) ( ) ;
199
189
200
- const isDarkFromOsPreference = ( ( ) => {
201
- if ( ! window . matchMedia ) {
202
- return undefined ;
203
- }
204
-
205
- return window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ;
190
+ assert < Equals < typeof colorSchemeReadFromLocalStorage , never > > ;
206
191
} ) ( ) ;
207
192
193
+ const isDarkFromOsPreference = getSystemColorScheme ( ) === "dark" ;
194
+
208
195
const isDarkFallback = false ;
209
196
210
197
return {
@@ -229,9 +216,26 @@ export function startClientSideIsDarkLogic(params: {
229
216
230
217
$clientSideIsDark . current = clientSideIsDark ;
231
218
232
- [ data_fr_scheme , data_fr_theme ] . forEach ( attr =>
233
- document . documentElement . setAttribute ( attr , clientSideIsDark ? "dark" : "light" )
219
+ document . documentElement . setAttribute (
220
+ data_fr_scheme ,
221
+ ( ( ) : ColorScheme | "system" => {
222
+ const colorSchemeReadFromLocalStorage = localStorage . getItem ( "scheme" ) ;
223
+
224
+ if ( colorSchemeReadFromLocalStorage === null ) {
225
+ return colorSchemeExplicitlyProvidedAsParameter ;
226
+ }
227
+
228
+ assert (
229
+ isAmong < ColorScheme | "system" > (
230
+ [ "dark" , "light" , "system" ] ,
231
+ colorSchemeReadFromLocalStorage
232
+ )
233
+ ) ;
234
+
235
+ return colorSchemeReadFromLocalStorage ;
236
+ } ) ( )
234
237
) ;
238
+ document . documentElement . setAttribute ( data_fr_theme , clientSideIsDark ? "dark" : "light" ) ;
235
239
236
240
new MutationObserver ( ( ) => {
237
241
const isDarkFromHtmlAttribute = getCurrentIsDarkFromHtmlAttribute ( ) ;
0 commit comments