Aethel Bot OSS repository! aethel.xyz
bot fun ai discord discord-bot aethel
at dev 1.6 kB view raw
1import { create } from 'zustand'; 2import { persist } from 'zustand/middleware'; 3 4interface ThemeState { 5 isDarkMode: boolean; 6 toggleTheme: () => void; 7 setTheme: (isDark: boolean) => void; 8} 9 10export const useThemeStore = create<ThemeState>()( 11 persist( 12 (set, get) => ({ 13 isDarkMode: false, 14 toggleTheme: () => { 15 const newTheme = !get().isDarkMode; 16 set({ isDarkMode: newTheme }); 17 updateBodyClass(newTheme); 18 }, 19 setTheme: (isDark: boolean) => { 20 set({ isDarkMode: isDark }); 21 updateBodyClass(isDark); 22 }, 23 }), 24 { 25 name: 'theme-storage', 26 onRehydrateStorage: () => (state) => { 27 if (state) { 28 updateBodyClass(state.isDarkMode); 29 } 30 }, 31 }, 32 ), 33); 34 35function updateBodyClass(isDark: boolean) { 36 if (typeof document !== 'undefined') { 37 if (isDark) { 38 document.documentElement.classList.add('dark'); 39 document.body.classList.add('dark'); 40 } else { 41 document.documentElement.classList.remove('dark'); 42 document.body.classList.remove('dark'); 43 } 44 } 45} 46 47if (typeof window !== 'undefined') { 48 const stored = localStorage.getItem('theme-storage'); 49 if (stored) { 50 try { 51 const { state } = JSON.parse(stored); 52 updateBodyClass(state.isDarkMode); 53 } catch (_e) { 54 const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; 55 updateBodyClass(prefersDark); 56 } 57 } else { 58 const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; 59 updateBodyClass(prefersDark); 60 } 61}