1"use client";
2
3
15import { create } from "zustand";
16import { persist, createJSONStorage } from "zustand/middleware";
17
18export interface ViewOverrides {
19 filter?: unknown | null;
20 sort?: unknown[] | null;
21 group?: unknown[] | null;
22 searchText?: string;
23}
24
25interface DatabaseState {
26
27 activeViews: Record<string, string>;
28
29 overrides: Record<string, ViewOverrides>;
30
31 selectedRecordIds: string[];
32
33 panelRecordId: string | null;
34 panelDatabaseId: string | null;
35 panelOpen: boolean;
36
37 setActiveView: (databaseId: string, viewId: string) => void;
38 setOverrides: (databaseId: string, viewId: string, patch: Partial<ViewOverrides>) => void;
39 clearOverrides: (databaseId: string, viewId: string) => void;
40 toggleSelectedRecord: (recordId: string) => void;
41 setSelectedRecords: (recordIds: string[]) => void;
42 clearSelection: () => void;
43 openPanel: (databaseId: string, recordId: string) => void;
44 closePanel: () => void;
45}
46
47const key = (databaseId: string, viewId: string) => `${databaseId}:${viewId}`;
48
49export const useDatabaseStore = create<DatabaseState>()(
50 persist(
51 (set) => ({
52 activeViews: {},
53 overrides: {},
54 selectedRecordIds: [],
55 panelRecordId: null,
56 panelDatabaseId: null,
57 panelOpen: false,
58
59 setActiveView: (databaseId, viewId) =>
60 set((s) => ({ activeViews: { ...s.activeViews, [databaseId]: viewId } })),
61
62 setOverrides: (databaseId, viewId, patch) =>
63 set((s) => {
64 const k = key(databaseId, viewId);
65 return {
66 overrides: {
67 ...s.overrides,
68 [k]: { ...s.overrides[k], ...patch }
69 }
70 };
71 }),
72
73 clearOverrides: (databaseId, viewId) =>
74 set((s) => {
75 const k = key(databaseId, viewId);
76 if (!s.overrides[k]) return s;
77 const next = { ...s.overrides };
78 delete next[k];
79 return { overrides: next };
80 }),
81
82 toggleSelectedRecord: (recordId) =>
83 set((s) => ({
84 selectedRecordIds: s.selectedRecordIds.includes(recordId)
85 ? s.selectedRecordIds.filter((id) => id !== recordId)
86 : [...s.selectedRecordIds, recordId]
87 })),
88
89 setSelectedRecords: (recordIds) => set({ selectedRecordIds: recordIds }),
90 clearSelection: () => set({ selectedRecordIds: [] }),
91
92 openPanel: (databaseId, recordId) =>
93 set({ panelDatabaseId: databaseId, panelRecordId: recordId, panelOpen: true }),
94 closePanel: () => set({ panelOpen: false, panelRecordId: null, panelDatabaseId: null })
95 }),
96 {
97 name: "factory-database-store",
98 storage: createJSONStorage(() => localStorage),
99
100 partialize: (s) => ({ activeViews: s.activeViews, overrides: s.overrides })
101 }
102 )
103);
104