Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 45x 45x 5x 5x | import { create } from 'zustand'
import { persist } from 'zustand/middleware'
export type Theme = 'dark' | 'light' | 'high-contrast'
interface UiState {
sidebarOpen: boolean
theme: Theme
sessionTimeoutAt: number | null
toggleSidebar: () => void
setSidebarOpen: (open: boolean) => void
setTheme: (theme: Theme) => void
setSessionTimeoutAt: (timestamp: number | null) => void
resetSession: () => void
}
const defaults = {
sidebarOpen: true,
theme: 'dark' as Theme,
sessionTimeoutAt: null as number | null,
}
export const useUiStore = create<UiState>()(
persist(
(set) => ({
...defaults,
toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
setSidebarOpen: (open) => set({ sidebarOpen: open }),
setTheme: (theme) => set({ theme }),
setSessionTimeoutAt: (timestamp) => set({ sessionTimeoutAt: timestamp }),
resetSession: () => set({ ...defaults }),
}),
{
name: 'ui-storage',
partialize: (state) => ({ theme: state.theme }),
},
),
)
|