@@ -0,0 +1,54 @@
|
||||
import type { Theme } from "@/modules/auth/types/auth.types";
|
||||
import { create } from "zustand";
|
||||
import { persist } from "zustand/middleware";
|
||||
|
||||
interface ThemeState {
|
||||
theme: Theme;
|
||||
toggleTheme: () => void;
|
||||
setTheme: (theme: Theme) => void;
|
||||
}
|
||||
|
||||
export const useThemeStore = create<ThemeState>()(
|
||||
persist(
|
||||
(set) => ({
|
||||
theme: "dark",
|
||||
toggleTheme: () => {
|
||||
set((state) => {
|
||||
const newTheme = state.theme === "dark" ? "light" : "dark";
|
||||
// Применяем класс к documentElement
|
||||
if (newTheme === "dark") {
|
||||
document.documentElement.classList.add("dark");
|
||||
} else {
|
||||
document.documentElement.classList.remove("dark");
|
||||
}
|
||||
return { theme: newTheme };
|
||||
});
|
||||
},
|
||||
setTheme: (theme: Theme) => {
|
||||
if (theme === "dark") {
|
||||
document.documentElement.classList.add("dark");
|
||||
} else {
|
||||
document.documentElement.classList.remove("dark");
|
||||
}
|
||||
set({ theme });
|
||||
},
|
||||
}),
|
||||
{
|
||||
name: "theme-storage",
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
// Инициализация темы при загрузке
|
||||
if (typeof window !== "undefined") {
|
||||
const storedTheme = localStorage.getItem("theme-storage");
|
||||
if (storedTheme) {
|
||||
const { state } = JSON.parse(storedTheme);
|
||||
if (state.theme === "dark") {
|
||||
document.documentElement.classList.add("dark");
|
||||
}
|
||||
} else {
|
||||
// По умолчанию dark
|
||||
document.documentElement.classList.add("dark");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user