UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

124 lines (122 loc) 3.34 kB
// src/hooks/useTheme.ts import { useEffect } from "react"; // src/store/themeStore.ts import { create } from "zustand"; import { devtools, persist } from "zustand/middleware"; var applyThemeToDOM = (mode) => { const htmlElement = document.documentElement; const originalTheme = htmlElement.getAttribute("data-original-theme"); if (mode === "dark") { htmlElement.setAttribute("data-theme", "dark"); return true; } else if (mode === "light") { if (originalTheme) { htmlElement.setAttribute("data-theme", originalTheme); } return false; } else if (mode === "system") { const isSystemDark = window.matchMedia( "(prefers-color-scheme: dark)" ).matches; if (isSystemDark) { htmlElement.setAttribute("data-theme", "dark"); return true; } else if (originalTheme) { htmlElement.setAttribute("data-theme", originalTheme); return false; } } return false; }; var saveOriginalTheme = () => { const htmlElement = document.documentElement; const currentTheme = htmlElement.getAttribute("data-theme"); if (currentTheme && !htmlElement.getAttribute("data-original-theme")) { htmlElement.setAttribute("data-original-theme", currentTheme); } }; var useThemeStore = create()( devtools( persist( (set, get) => ({ // Initial state themeMode: "system", isDark: false, // Actions applyTheme: (mode) => { const isDark = applyThemeToDOM(mode); set({ isDark }); }, toggleTheme: () => { const { themeMode, applyTheme } = get(); let newMode; if (themeMode === "light") { newMode = "dark"; } else if (themeMode === "dark") { newMode = "light"; } else { newMode = "dark"; } set({ themeMode: newMode }); applyTheme(newMode); }, setTheme: (mode) => { const { applyTheme } = get(); set({ themeMode: mode }); applyTheme(mode); }, initializeTheme: () => { const { themeMode, applyTheme } = get(); saveOriginalTheme(); applyTheme(themeMode); }, handleSystemThemeChange: () => { const { themeMode, applyTheme } = get(); if (themeMode === "system") { applyTheme("system"); } } }), { name: "theme-store", // Nome da chave no localStorage partialize: (state) => ({ themeMode: state.themeMode }) // Só persiste o themeMode, não o isDark } ), { name: "theme-store" } ) ); // src/hooks/useTheme.ts var useTheme = () => { const { themeMode, isDark, toggleTheme, setTheme, initializeTheme, handleSystemThemeChange } = useThemeStore(); useEffect(() => { initializeTheme(); const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); mediaQuery.addEventListener("change", handleSystemThemeChange); return () => { mediaQuery.removeEventListener("change", handleSystemThemeChange); }; }, [initializeTheme, handleSystemThemeChange]); return { themeMode, isDark, toggleTheme, setTheme }; }; export { useTheme }; //# sourceMappingURL=index.mjs.map