107 lines
2.3 KiB
TypeScript
107 lines
2.3 KiB
TypeScript
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<AppState>()((set) => ({
|
|
selectedDevice: 0,
|
|
devices: [],
|
|
currentPage: "messages",
|
|
rasterSources: [],
|
|
commandPaletteOpen: false,
|
|
darkMode: true,
|
|
accent: "orange",
|
|
|
|
setRasterSources: (sources: RasterSource[]) => {
|
|
set(
|
|
produce<AppState>((draft) => {
|
|
draft.rasterSources = sources;
|
|
})
|
|
);
|
|
},
|
|
addRasterSource: (source: RasterSource) => {
|
|
set(
|
|
produce<AppState>((draft) => {
|
|
draft.rasterSources.push(source);
|
|
})
|
|
);
|
|
},
|
|
removeRasterSource: (index: number) => {
|
|
set(
|
|
produce<AppState>((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<AppState>((draft) => {
|
|
draft.commandPaletteOpen = open;
|
|
})
|
|
);
|
|
},
|
|
setDarkMode: (enabled: boolean) => {
|
|
set(
|
|
produce<AppState>((draft) => {
|
|
draft.darkMode = enabled;
|
|
})
|
|
);
|
|
},
|
|
setAccent(color) {
|
|
set(
|
|
produce<AppState>((draft) => {
|
|
draft.accent = color;
|
|
})
|
|
);
|
|
}
|
|
}));
|