import { produce } from "immer"; import create from "zustand"; export interface RasterSource { enabled: boolean; title: string; tiles: string[]; tileSize: number; } export type accentColor = | "red" | "orange" | "yellow" | "green" | "blue" | "purple" | "pink"; interface AppState { selectedDevice: number; devices: { id: number; num: number; }[]; rasterSources: RasterSource[]; commandPaletteOpen: boolean; darkMode: boolean; accent: accentColor; setRasterSources: (sources: RasterSource[]) => void; addRasterSource: (source: RasterSource) => void; removeRasterSource: (index: number) => void; setSelectedDevice: (deviceId: number) => void; addDevice: (device: { id: number; num: number }) => void; removeDevice: (deviceId: number) => void; setCommandPaletteOpen: (open: boolean) => void; setDarkMode: (enabled: boolean) => void; setAccent: (color: accentColor) => void; } export const useAppStore = create()((set) => ({ selectedDevice: 0, devices: [], currentPage: "messages", rasterSources: [], commandPaletteOpen: false, darkMode: true, accent: "orange", setRasterSources: (sources: RasterSource[]) => { set( produce((draft) => { draft.rasterSources = sources; }) ); }, addRasterSource: (source: RasterSource) => { set( produce((draft) => { draft.rasterSources.push(source); }) ); }, removeRasterSource: (index: number) => { set( produce((draft) => { draft.rasterSources.splice(index, 1); }) ); }, setSelectedDevice: (deviceId) => set(() => ({ selectedDevice: deviceId })), addDevice: (device) => set((state) => ({ devices: [...state.devices, device] })), removeDevice: (deviceId) => set((state) => ({ devices: state.devices.filter((device) => device.id !== deviceId) })), setCommandPaletteOpen: (open: boolean) => { set( produce((draft) => { draft.commandPaletteOpen = open; }) ); }, setDarkMode: (enabled: boolean) => { set( produce((draft) => { draft.darkMode = enabled; }) ); }, setAccent(color) { set( produce((draft) => { draft.accent = color; }) ); } }));