Files
kandev/apps/web/lib/state/slices/system/system-slice.ts
T
2026-06-14 22:33:34 +01:00

70 lines
1.7 KiB
TypeScript

import type { StateCreator } from "zustand";
import type { SystemSlice, SystemSliceState } from "./types";
export const defaultSystemState: SystemSliceState = {
system: {
info: null,
diskUsage: null,
database: null,
backups: { items: [], loaded: false },
logs: { files: [], tail: [], tailLoaded: false },
updates: null,
jobs: {},
metrics: null,
},
};
type ImmerSet = Parameters<
StateCreator<SystemSlice, [["zustand/immer", never]], [], SystemSlice>
>[0];
export const createSystemSlice: StateCreator<
SystemSlice,
[["zustand/immer", never]],
[],
SystemSlice
> = (set: ImmerSet, _get, _api) => ({
...defaultSystemState,
setSystemInfo: (info) =>
set((draft) => {
draft.system.info = info;
}),
setSystemDiskUsage: (usage) =>
set((draft) => {
draft.system.diskUsage = usage;
}),
setSystemDatabase: (stats) =>
set((draft) => {
draft.system.database = stats;
}),
setSystemBackups: (items) =>
set((draft) => {
draft.system.backups = { items, loaded: true };
}),
setSystemLogs: (files) =>
set((draft) => {
draft.system.logs.files = files;
}),
setSystemLogTail: (lines) =>
set((draft) => {
draft.system.logs.tail = lines;
draft.system.logs.tailLoaded = true;
}),
setSystemUpdates: (updates) =>
set((draft) => {
draft.system.updates = updates;
}),
upsertSystemJob: (job) =>
set((draft) => {
draft.system.jobs[job.id] = job;
}),
clearSystemJob: (jobId) =>
set((draft) => {
delete draft.system.jobs[jobId];
}),
setSystemMetricsSnapshot: (snapshot) =>
set((draft) => {
draft.system.metrics = snapshot;
}),
});