-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDarkModeContext.tsx
More file actions
34 lines (25 loc) · 1.05 KB
/
DarkModeContext.tsx
File metadata and controls
34 lines (25 loc) · 1.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { noop } from "lodash";
import { createContext, ReactNode, useMemo, useState } from "react";
type DarkModeContextValue = {
isDarkModeEnabled: boolean;
toggleDarkMode: (enable?: boolean) => void;
};
export const DarkModeContext = createContext<DarkModeContextValue>({ isDarkModeEnabled: true, toggleDarkMode: noop });
export function DarkModeProvider({ children }: { children: ReactNode }) {
/**
* We make dark mode enabled by default.
*/
const [isDarkModeEnabled, setIsDarkModeEnabled] = useState(() => {
if (typeof window === "undefined") {
return true;
}
return window.localStorage.getItem("darkMode") !== "false";
});
const toggleDarkMode = (enable?: boolean) => {
const toggleTo = enable ?? !isDarkModeEnabled;
window.localStorage.setItem("darkMode", toggleTo.toString());
setIsDarkModeEnabled(toggleTo);
};
const value = useMemo(() => ({ isDarkModeEnabled, toggleDarkMode }), [isDarkModeEnabled, toggleDarkMode]);
return <DarkModeContext.Provider value={value}>{children}</DarkModeContext.Provider>;
}