Files
doktainer-upstream/src/components/ThemeController.tsx
T
2026-06-02 00:17:50 +07:00

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;
}