@eventcatalogtest/studio
Version:
A drag and drop UI for distributed systems that keeps your diagrams where they belong – in your repo
77 lines (68 loc) • 1.97 kB
text/typescript
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
import { Descendant } from 'slate'
interface Document {
id: string
name: string
content: Descendant[]
createdAt: string
updatedAt: string
}
interface DocumentStore {
currentDocument: Document | null
isDocumentPanelOpen: boolean
toggleDocumentPanel: () => void
setDocumentPanelOpen: (open: boolean) => void
getCurrentDocument: () => Document
setCurrentDocument: (document: Document) => void
updateCurrentDocumentContent: (content: Descendant[]) => void
}
const createEmptyDocument = (name = 'Untitled Document'): Document => ({
id: `doc-${Date.now()}`,
name,
content: [
{
type: 'paragraph',
children: [{ text: '' }],
} as any,
],
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
})
export const useDocumentStore = create<DocumentStore>()(
persist(
(set, get) => ({
currentDocument: createEmptyDocument(),
isDocumentPanelOpen: false,
getCurrentDocument: () => {
const current = get().currentDocument
return current || createEmptyDocument()
},
setCurrentDocument: (document: Document) => {
set({ currentDocument: document })
},
updateCurrentDocumentContent: (content: Descendant[]) => {
const current = get().currentDocument
if (current) {
set({
currentDocument: {
...current,
content,
updatedAt: new Date().toISOString()
}
})
}
},
toggleDocumentPanel: () => {
set((state) => ({ isDocumentPanelOpen: !state.isDocumentPanelOpen }))
},
setDocumentPanelOpen: (open: boolean) => {
set({ isDocumentPanelOpen: open })
},
}),
{
name: 'document-storage',
storage: createJSONStorage(() => localStorage),
}
)
)