1
mirror of https://github.com/jakejarvis/jarv.is.git synced 2025-04-26 22:48:29 -04:00

restore live theme switching when system setting changes

TODO: removing the event listener is infuriatingly not cooperating
This commit is contained in:
Jake Jarvis 2021-12-16 09:25:47 -05:00
parent 2377fbfdf2
commit fe1a10d437
Signed by: jake
GPG Key ID: 2B0C9CF251E69A39
2 changed files with 16 additions and 7 deletions

View File

@ -14,8 +14,4 @@ try {
cl.remove("light");
cl.add("dark");
}
// TODO: fix real-time switching (works but bulb icon isn't updated)
// window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e) => e.matches && setDark(true));
// window.matchMedia("(prefers-color-scheme: light)").addEventListener("change", (e) => e.matches && setDark(false));
} catch (error) {}

View File

@ -1,14 +1,26 @@
import { h } from "preact";
import { useState, useEffect } from "preact/hooks";
import { isDark, setDarkPref } from "../utils/theme.js";
import { useState, useEffect, useCallback } from "preact/hooks";
import { isDark, getDarkPref, setDarkPref } from "../utils/theme.js";
// react components:
import BulbOn from "../assets/bulb-on.svg";
import BulbOff from "../assets/bulb-off.svg";
const ThemeToggle = () => {
// sync button up with theme state after initialization
// sync button up with theme and preference states after initialization
const [dark, setDark] = useState(isDark());
const [saved, setSaved] = useState(!!getDarkPref());
// real-time switching between modes if preference isn't set (and it's supported by OS/browser)
const callback = useCallback((e) => setDark(e.matches), []);
useEffect(() => {
if (saved) {
// TODO: FIX THIS...
window.matchMedia("(prefers-color-scheme: dark)").removeEventListener("change", callback, true);
} else {
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", callback, true);
}
}, [saved, callback]);
useEffect(() => {
// sets appropriate `<html class="...">`
@ -19,6 +31,7 @@ const ThemeToggle = () => {
const handleToggle = () => {
// only update the local storage preference if the user explicitly presses the lightbulb
setDarkPref(!dark);
setSaved(true);
// set theme to the opposite of current theme
setDark(!dark);