Skip to content

Commit d4493e0

Browse files
committed
Enable set action for darkMode hook
1 parent f82f2a2 commit d4493e0

File tree

2 files changed

+29
-20
lines changed

2 files changed

+29
-20
lines changed

src/lib/darkMode.ts

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ export const data_fr_theme = "data-fr-theme";
1111
export const data_fr_scheme = "data-fr-scheme";
1212
export 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

1818
type UseIsDark = () => {
1919
isDark: boolean;
20-
setIsDark: (isDark: boolean | "system") => void;
20+
setIsDark: (
21+
isDark: boolean | "system" | ((currentIsDark: boolean) => boolean | "system")
22+
) => void;
2123
};
2224

2325
const $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
};

src/lib/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export { startReactDsfr } from "./start";
22
export type { Params } from "./start";
3-
export { useIsDark, $clientSideIsDark } from "./darkMode";
3+
export { useIsDark } from "./darkMode";
44
export * from "./colors";
55
export type { BreakpointKeys } from "./breakpoints";
66
import { breakpoints } from "./breakpoints";

0 commit comments

Comments
 (0)