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:
parent
2377fbfdf2
commit
fe1a10d437
@ -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) {}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user