Skip to content

Commit 8d192b7

Browse files
harish-sethuramangaearon
harish-sethuraman
authored andcommitted
Add IIFE for dark mode in document load and preserve in localStorage
1 parent ce58bc4 commit 8d192b7

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

beta/src/components/Layout/Nav/Nav.tsx

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,10 @@ export default function Nav() {
102102
});
103103

104104
React.useEffect(() => {
105-
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
106-
document.documentElement.classList.add('dark');
107-
setIsDark(true);
108-
} else {
109-
setIsDark(false);
110-
}
111-
},[]);
105+
window.__onThemeChange = () => {
106+
setIsDark(window.__theme === 'dark' ? true : false);
107+
};
108+
}, []);
112109

113110
const section = inferSection(pathname);
114111

@@ -151,13 +148,9 @@ export default function Nav() {
151148
type="button"
152149
aria-label={isDark ? 'Use Light Mode' : 'Use Dark Mode'}
153150
onClick={() => {
154-
if (isDark) {
155-
document.documentElement.classList.remove('dark');
156-
setIsDark(false);
157-
} else {
158-
document.documentElement.classList.add('dark');
159-
setIsDark(true);
160-
}
151+
window.__setPreferredTheme(
152+
window.__theme === 'light' ? 'dark' : 'light'
153+
);
161154
}}
162155
className="hidden lg:flex items-center h-full pr-2">
163156
{isDark ? lightIcon : darkIcon}
@@ -186,13 +179,9 @@ export default function Nav() {
186179
type="button"
187180
aria-label={isDark ? 'Use Light Mode' : 'Use Dark Mode'}
188181
onClick={() => {
189-
if (isDark) {
190-
document.documentElement.classList.remove('dark');
191-
setIsDark(false);
192-
} else {
193-
document.documentElement.classList.add('dark');
194-
setIsDark(true);
195-
}
182+
window.__setPreferredTheme(
183+
window.__theme === 'light' ? 'dark' : 'light'
184+
);
196185
}}
197186
className="flex lg:hidden items-center p-1 h-full ml-4 lg:ml-6">
198187
{isDark ? lightIcon : darkIcon}

beta/src/pages/_document.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,45 @@ class MyDocument extends Document {
1212
<Html lang="en">
1313
<Head />
1414
<body className="font-sans antialiased text-lg bg-wash dark:bg-wash-dark text-secondary dark:text-secondary-dark leading-base">
15+
<script
16+
dangerouslySetInnerHTML={{
17+
__html: `(function () {
18+
window.__onThemeChange = function () {};
19+
function setTheme(newTheme) {
20+
window.__theme = newTheme;
21+
preferredTheme = newTheme;
22+
23+
document.documentElement.className = newTheme;
24+
window.__onThemeChange(newTheme);
25+
}
26+
27+
var preferredTheme;
28+
try {
29+
preferredTheme = localStorage.getItem("theme");
30+
} catch (err) {
31+
console.error("Couldn't fetch theme from local storage")
32+
33+
}
34+
35+
window.__setPreferredTheme = function (newTheme) {
36+
setTheme(newTheme);
37+
try {
38+
localStorage.setItem("theme", newTheme);
39+
} catch (err) {
40+
console.error("Couldn't set theme in local storage")
41+
}
42+
};
43+
44+
var darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
45+
darkQuery.addListener(function (e) {
46+
window.__setPreferredTheme(e.matches ? "dark" : "light");
47+
});
48+
49+
setTheme(preferredTheme || (darkQuery.matches ? "dark" : "light"));
50+
})();
51+
`,
52+
}}
53+
/>
1554
<Main />
1655
<NextScript />
1756
</body>

0 commit comments

Comments
 (0)