87 lines
2.6 KiB
TypeScript
87 lines
2.6 KiB
TypeScript
import { create } from 'zustand';
|
|
import { devtools } from 'zustand/middleware';
|
|
|
|
interface DashboardState {
|
|
dashboards: Record<string, any>[];
|
|
activeDashboardId: string | null;
|
|
cards: Record<string, any>[];
|
|
editMode: boolean;
|
|
loading: boolean;
|
|
|
|
setDashboards: (dashboards: Record<string, any>[]) => void;
|
|
setActiveDashboard: (id: string | null) => void;
|
|
setCards: (cards: Record<string, any>[]) => void;
|
|
addCard: (card: Record<string, any>) => void;
|
|
updateCard: (cardId: string, updates: Record<string, any>) => void;
|
|
removeCard: (cardId: string) => void;
|
|
toggleEditMode: () => void;
|
|
setEditMode: (on: boolean) => void;
|
|
setLoading: (loading: boolean) => void;
|
|
addDashboard: (dashboard: Record<string, any>) => void;
|
|
updateDashboardInList: (id: string, updates: Record<string, any>) => void;
|
|
removeDashboard: (id: string) => void;
|
|
}
|
|
|
|
export const useDashboardStore = create<DashboardState>()(
|
|
devtools(
|
|
(set) => ({
|
|
dashboards: [],
|
|
activeDashboardId: null,
|
|
cards: [],
|
|
editMode: false,
|
|
loading: false,
|
|
|
|
setDashboards: (dashboards) => set({ dashboards }),
|
|
|
|
setActiveDashboard: (id) => set({ activeDashboardId: id, editMode: false }),
|
|
|
|
setCards: (cards) => set({ cards }),
|
|
|
|
addCard: (card) => set((s) => ({ cards: [...s.cards, card] })),
|
|
|
|
updateCard: (cardId, updates) =>
|
|
set((s) => ({
|
|
cards: s.cards.map((c) =>
|
|
(c.card_id ?? c.CARD_ID) === cardId ? { ...c, ...updates } : c
|
|
),
|
|
})),
|
|
|
|
removeCard: (cardId) =>
|
|
set((s) => ({
|
|
cards: s.cards.filter((c) => (c.card_id ?? c.CARD_ID) !== cardId),
|
|
})),
|
|
|
|
toggleEditMode: () => set((s) => ({ editMode: !s.editMode })),
|
|
|
|
setEditMode: (on) => set({ editMode: on }),
|
|
|
|
setLoading: (loading) => set({ loading }),
|
|
|
|
addDashboard: (dashboard) =>
|
|
set((s) => ({ dashboards: [...s.dashboards, dashboard] })),
|
|
|
|
updateDashboardInList: (id, updates) =>
|
|
set((s) => ({
|
|
dashboards: s.dashboards.map((d) =>
|
|
(d.dashboard_id ?? d.DASHBOARD_ID) === id ? { ...d, ...updates } : d
|
|
),
|
|
})),
|
|
|
|
removeDashboard: (id) =>
|
|
set((s) => {
|
|
const filtered = s.dashboards.filter(
|
|
(d) => (d.dashboard_id ?? d.DASHBOARD_ID) !== id
|
|
);
|
|
const isActive = s.activeDashboardId === id;
|
|
return {
|
|
dashboards: filtered,
|
|
activeDashboardId: isActive
|
|
? (filtered[0]?.dashboard_id ?? filtered[0]?.DASHBOARD_ID ?? null)
|
|
: s.activeDashboardId,
|
|
};
|
|
}),
|
|
}),
|
|
{ name: 'dashboard-store' }
|
|
)
|
|
);
|