41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
import {
|
|
addPreferencesListener,
|
|
applyTheme,
|
|
getStoredTheme,
|
|
initializeSessionTimeoutWatcher,
|
|
} from "@/lib/preferences";
|
|
|
|
export default function ThemeController() {
|
|
useEffect(() => {
|
|
const syncTheme = () => applyTheme(getStoredTheme());
|
|
|
|
syncTheme();
|
|
|
|
const media = window.matchMedia("(prefers-color-scheme: light)");
|
|
const onThemeMediaChange = () => {
|
|
if (getStoredTheme() === "system") {
|
|
syncTheme();
|
|
}
|
|
};
|
|
|
|
media.addEventListener("change", onThemeMediaChange);
|
|
window.addEventListener("pageshow", syncTheme);
|
|
document.addEventListener("visibilitychange", syncTheme);
|
|
const removePreferencesListener = addPreferencesListener(syncTheme);
|
|
const stopSessionWatcher = initializeSessionTimeoutWatcher();
|
|
|
|
return () => {
|
|
media.removeEventListener("change", onThemeMediaChange);
|
|
window.removeEventListener("pageshow", syncTheme);
|
|
document.removeEventListener("visibilitychange", syncTheme);
|
|
removePreferencesListener();
|
|
stopSessionWatcher();
|
|
};
|
|
}, []);
|
|
|
|
return null;
|
|
}
|