All files / layouts uiStore.ts

50% Statements 5/10
100% Branches 0/0
37.5% Functions 3/8
50% Lines 4/8

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    37x         37x         6x       6x                                                
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 }),
    },
  ),
)