Files
human-adapter-react/src/stores/appStore.ts
T

93 lines
2.7 KiB
TypeScript

import { create } from "zustand";
import { persist } from "zustand/middleware";
import type { Organization, Task, Worker } from "@/lib/types";
interface AppState {
currentOrganization: Organization | null;
selectedTask: Task | null;
workers: Worker[];
organizations: Organization[];
isLoading: boolean;
error: string | null;
}
interface AppActions {
setCurrentOrganization: (org: Organization | null) => void;
setSelectedTask: (task: Task | null) => void;
setWorkers: (workers: Worker[]) => void;
addWorker: (worker: Worker) => void;
updateWorker: (workerId: string, updates: Partial<Worker>) => void;
removeWorker: (workerId: string) => void;
setOrganizations: (orgs: Organization[]) => void;
addOrganization: (org: Organization) => void;
updateOrganization: (orgId: string, updates: Partial<Organization>) => void;
removeOrganization: (orgId: string) => void;
setLoading: (loading: boolean) => void;
setError: (error: string | null) => void;
clearError: () => void;
}
export const useAppStore = create<AppState & AppActions>()(
persist(
(set) => ({
currentOrganization: null,
selectedTask: null,
workers: [],
organizations: [],
isLoading: false,
error: null,
setCurrentOrganization: (org) => set({ currentOrganization: org }),
setSelectedTask: (task) => set({ selectedTask: task }),
setWorkers: (workers) => set({ workers }),
addWorker: (worker) =>
set((state) => ({ workers: [...state.workers, worker] })),
updateWorker: (workerId, updates) =>
set((state) => ({
workers: state.workers.map((w) =>
w.id === workerId ? { ...w, ...updates } : w
),
})),
removeWorker: (workerId) =>
set((state) => ({
workers: state.workers.filter((w) => w.id !== workerId),
})),
setOrganizations: (orgs) => set({ organizations: orgs }),
addOrganization: (org) =>
set((state) => ({ organizations: [...state.organizations, org] })),
updateOrganization: (orgId, updates) =>
set((state) => ({
organizations: state.organizations.map((o) =>
o.id === orgId ? { ...o, ...updates } : o
),
})),
removeOrganization: (orgId) =>
set((state) => ({
organizations: state.organizations.filter((o) => o.id !== orgId),
})),
setLoading: (loading) => set({ isLoading: loading }),
setError: (error) => set({ error }),
clearError: () => set({ error: null }),
}),
{
name: "app-storage",
partialize: (state) => ({
currentOrganization: state.currentOrganization,
organizations: state.organizations,
}),
}
)
);