Skip to content

Commit 8f8466b

Browse files
Merge pull request #7 from netlify-templates/cg/refactorTheme
Refactor code around dark/light theme
2 parents 9e981c5 + a3b55de commit 8f8466b

File tree

3 files changed

+39
-40
lines changed

3 files changed

+39
-40
lines changed

components/Footer.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ const ThemeSwitcher = () => {
5454
type="button"
5555
aria-label="Use Dark Mode"
5656
onClick={() => {
57-
window.__setPreferredTheme("dark");
57+
document.documentElement.classList.add("dark");
58+
localStorage.setItem("theme", "dark");
5859
}}
5960
className="flex items-center h-full pr-2 dark:bg-primary rounded-3xl flex justify-center align-center p-2 w-24 h-10 transition"
6061
>
@@ -65,7 +66,8 @@ const ThemeSwitcher = () => {
6566
type="button"
6667
aria-label="Use Light Mode"
6768
onClick={() => {
68-
window.__setPreferredTheme("light");
69+
document.documentElement.classList.remove("dark");
70+
localStorage.setItem("theme", "light");
6971
}}
7072
className="flex items-center h-full pr-2 bg-primary dark:bg-transparent rounded-3xl flex justify-center align-center p-2 w-24 h-10 transition"
7173
>

components/Layout.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import classNames from "classnames";
2+
import { useEffect } from "react";
23
import styles from "./Layout.module.css";
34

45
export function GradientBackground({ variant, className }) {
@@ -14,6 +15,40 @@ export function GradientBackground({ variant, className }) {
1415
}
1516

1617
export default function Layout({ children }) {
18+
const setAppTheme = () => {
19+
const darkMode = localStorage.getItem("theme") === "dark";
20+
const lightMode = localStorage.getItem("theme") === "light";
21+
22+
if (darkMode) {
23+
document.documentElement.classList.add("dark");
24+
} else if (lightMode) {
25+
document.documentElement.classList.remove("dark");
26+
}
27+
return;
28+
};
29+
30+
const handleSystemThemeChange = () => {
31+
var darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
32+
33+
darkQuery.onchange = (e) => {
34+
if (e.matches) {
35+
document.documentElement.classList.add("dark");
36+
localStorage.setItem("theme", "dark");
37+
} else {
38+
document.documentElement.classList.remove("dark");
39+
localStorage.setItem("theme", "light");
40+
}
41+
};
42+
};
43+
44+
useEffect(() => {
45+
setAppTheme();
46+
}, []);
47+
48+
useEffect(() => {
49+
handleSystemThemeChange();
50+
}, []);
51+
1752
return (
1853
<div className="relative pb-24">
1954
<div className="flex flex-col items-center max-w-2xl w-full mx-auto">

pages/_document.js

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,44 +9,6 @@ class MyDocument extends Document {
99
<body
1010
className={`antialiased text-lg bg-white dark:bg-gray-900 dark:text-white leading-base`}
1111
>
12-
<script
13-
dangerouslySetInnerHTML={{
14-
__html: `
15-
(function () {
16-
function setTheme(newTheme) {
17-
window.__theme = newTheme;
18-
if (newTheme === 'dark') {
19-
document.documentElement.classList.add('dark');
20-
} else if (newTheme === 'light') {
21-
document.documentElement.classList.remove('dark');
22-
}
23-
}
24-
var preferredTheme;
25-
try {
26-
preferredTheme = localStorage.getItem('theme');
27-
} catch (err) { }
28-
window.__setPreferredTheme = function(newTheme) {
29-
preferredTheme = newTheme;
30-
setTheme(newTheme);
31-
try {
32-
localStorage.setItem('theme', newTheme);
33-
} catch (err) { }
34-
};
35-
var initialTheme = preferredTheme;
36-
var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
37-
if (!initialTheme) {
38-
initialTheme = darkQuery.matches ? 'dark' : 'light';
39-
}
40-
setTheme(initialTheme);
41-
darkQuery.addListener(function (e) {
42-
if (!preferredTheme) {
43-
setTheme(e.matches ? 'dark' : 'light');
44-
}
45-
});
46-
})();
47-
`,
48-
}}
49-
/>
5012
<Main />
5113
<NextScript />
5214
</body>

0 commit comments

Comments
 (0)