@@ -11,13 +11,15 @@ export const data_fr_theme = "data-fr-theme";
1111export const data_fr_scheme = "data-fr-scheme" ;
1212export const rootColorSchemeStyleTagId = "dsfr-root-color-scheme" ;
1313
14- export const $clientSideIsDark = createStatefulObservable < boolean > ( ( ) => {
14+ const $clientSideIsDark = createStatefulObservable < boolean > ( ( ) => {
1515 throw new Error ( "not initialized yet" ) ;
1616} ) ;
1717
1818type UseIsDark = ( ) => {
1919 isDark : boolean ;
20- setIsDark : ( isDark : boolean | "system" ) => void ;
20+ setIsDark : (
21+ isDark : boolean | "system" | ( ( currentIsDark : boolean ) => boolean | "system" )
22+ ) => void ;
2123} ;
2224
2325const $isAfterFirstEffect = createStatefulObservable ( ( ) => false ) ;
@@ -26,26 +28,33 @@ const useIsDarkClientSide: UseIsDark = () => {
2628 useRerenderOnChange ( $clientSideIsDark ) ;
2729 useRerenderOnChange ( $isAfterFirstEffect ) ;
2830
29- const setIsDark = useConstCallback ( ( isDark : boolean | "system" ) =>
30- document . documentElement . setAttribute (
31- data_fr_scheme ,
32- ( ( ) : ColorScheme | "system" => {
33- switch ( isDark ) {
34- case "system" :
35- return "system" ;
36- case true :
37- return "dark" ;
38- case false :
39- return "light" ;
40- }
41- } ) ( )
42- )
31+ const isDark = $isAfterFirstEffect . current
32+ ? $clientSideIsDark . current
33+ : ssrWasPerformedWithIsDark ;
34+
35+ const setIsDark = useConstCallback < ReturnType < UseIsDark > [ "setIsDark" ] > (
36+ newIsDarkOrDeduceNewIsDarkFromCurrentIsDark =>
37+ document . documentElement . setAttribute (
38+ data_fr_scheme ,
39+ ( ( ) : ColorScheme | "system" => {
40+ switch (
41+ typeof newIsDarkOrDeduceNewIsDarkFromCurrentIsDark === "function"
42+ ? newIsDarkOrDeduceNewIsDarkFromCurrentIsDark ( isDark )
43+ : newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
44+ ) {
45+ case "system" :
46+ return "system" ;
47+ case true :
48+ return "dark" ;
49+ case false :
50+ return "light" ;
51+ }
52+ } ) ( )
53+ )
4354 ) ;
4455
4556 return {
46- "isDark" : $isAfterFirstEffect . current
47- ? $clientSideIsDark . current
48- : ssrWasPerformedWithIsDark ,
57+ isDark,
4958 setIsDark
5059 } ;
5160} ;
0 commit comments