toes/src/client/state.ts

61 lines
1.8 KiB
TypeScript

import type { App } from '../shared/types'
// UI state (survives re-renders)
export let currentView: 'dashboard' | 'settings' = 'dashboard'
export let isNarrow: boolean = window.matchMedia('(max-width: 768px)').matches
export let selectedApp: string | null = localStorage.getItem('selectedApp')
export let sidebarCollapsed: boolean = localStorage.getItem('sidebarCollapsed') === 'true'
export let sidebarSection: 'apps' | 'tools' = (localStorage.getItem('sidebarSection') as 'apps' | 'tools') || 'apps'
// Server state (from SSE)
export let apps: App[] = []
export let setupMode: boolean = false
// Tab state
export let appTabs: Record<string, string> = JSON.parse(localStorage.getItem('appTabs') || '{}')
// State setters
export function setCurrentView(view: 'dashboard' | 'settings') {
currentView = view
}
export function setSelectedApp(name: string | null) {
selectedApp = name
if (name) {
localStorage.setItem('selectedApp', name)
} else {
localStorage.removeItem('selectedApp')
}
}
export function setIsNarrow(narrow: boolean) {
isNarrow = narrow
}
export function setSidebarCollapsed(collapsed: boolean) {
sidebarCollapsed = collapsed
localStorage.setItem('sidebarCollapsed', String(collapsed))
}
export function setSidebarSection(section: 'apps' | 'tools') {
sidebarSection = section
localStorage.setItem('sidebarSection', section)
}
export function setApps(newApps: App[]) {
apps = newApps
}
export function setSetupMode(mode: boolean) {
setupMode = mode
}
export const getSelectedTab = (appName: string | null) =>
appName ? appTabs[appName] || 'overview' : 'overview'
export function setSelectedTab(appName: string | null, tab: string) {
if (!appName) return
appTabs[appName] = tab
localStorage.setItem('appTabs', JSON.stringify(appTabs))
}