@eventcatalogtest/studio
Version:
A drag and drop UI for distributed systems that keeps your diagrams where they belong – in your repo
145 lines (130 loc) • 5.19 kB
text/typescript
import { create } from 'zustand'
// persist the design store
import { createJSONStorage, persist } from 'zustand/middleware'
import useFlowStore from './flow-store'
interface Design {
id: string;
type: string;
name: string;
description: string;
data: any;
createdAt: Date;
updatedAt: Date;
lastModified: string;
hasUncommittedChanges?: boolean;
}
interface DesignStore {
designs: Design[]
currentDesign: Design | null
setCurrentDesign: (design: Design) => void
createNewDesign: (design: Design) => void
updateDesignName: (id: string, name: string) => void
deleteDesign: (id: string) => void
updateCurrentDesignData: (data: any) => void
}
export const useDesignStore = create<DesignStore>()(
persist(
(set, get) => ({
designs: [],
currentDesign: null,
setCurrentDesign: (design: Design) => {
// Save current design before switching
const currentState = get().currentDesign;
if (currentState) {
// Import flow store to trigger save
import('./flow-store').then(({ default: useFlowStore }) => {
useFlowStore.getState().actions.saveCurrentFlowToDesign();
});
}
set({ currentDesign: design })
useFlowStore.getState().actions.importFlow(design.data)
// Load document for the new design
try {
import('./document-store').then(({ useDocumentStore }) => {
if (design.data?.document) {
// Check if it's the new object format
if (design.data.document.id && design.data.document.content) {
useDocumentStore.getState().setCurrentDocument(design.data.document);
}
// Legacy support: if it's still an array format, convert it
else if (Array.isArray(design.data.document)) {
const convertedDoc = {
id: `doc-${Date.now()}`,
name: `${design.name} Document`,
content: design.data.document,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
useDocumentStore.getState().setCurrentDocument(convertedDoc);
}
} else {
// Set empty document if no document exists for this design
const emptyDoc = {
id: `doc-${Date.now()}`,
name: `${design.name} Document`,
content: [{ type: 'paragraph', children: [{ text: 'Start typing... Use @ to mention nodes' }] } as any],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
useDocumentStore.getState().setCurrentDocument(emptyDoc);
}
});
} catch (error) {
console.warn('Could not load document for design:', error);
}
},
createNewDesign: (design: Design) => {
set({ designs: [...get().designs, design] })
},
deleteDesign: (id: string) => {
const { designs, currentDesign } = get();
const updatedDesigns = designs.filter(design => design.id !== id);
const updatedCurrentDesign = currentDesign?.id === id ? null : currentDesign;
set({
designs: updatedDesigns,
currentDesign: updatedCurrentDesign
});
},
updateDesignName: (id: string, name: string) => {
const { designs, currentDesign } = get();
// Update in the designs array
const updatedDesigns = designs.map(design =>
design.id === id
? { ...design, name, updatedAt: new Date(), lastModified: 'now' }
: design
);
// Update current design if it's the one being updated
const updatedCurrentDesign = currentDesign?.id === id
? { ...currentDesign, name, updatedAt: new Date(), lastModified: 'now' }
: currentDesign;
set({
designs: updatedDesigns,
currentDesign: updatedCurrentDesign
});
},
updateCurrentDesignData: (data: any) => {
const { designs, currentDesign } = get();
if (!currentDesign) return;
const updatedDesign = {
...currentDesign,
data,
updatedAt: new Date(),
lastModified: 'now',
hasUncommittedChanges: true
};
// Update in the designs array
const updatedDesigns = designs.map(design =>
design.id === currentDesign.id ? updatedDesign : design
);
set({
designs: updatedDesigns,
currentDesign: updatedDesign
});
}
}),
{
name: 'designs',
storage: createJSONStorage(() => localStorage)
}
)
)