Files
invyone/frontend/stores/dashboardStore.ts
T
2026-04-10 13:33:37 +09:00

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' }
)
);