@eventcatalogtest/studio
Version:
A drag and drop UI for distributed systems that keeps your diagrams where they belong – in your repo
117 lines (113 loc) • 3.97 kB
text/typescript
import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
export type SidebarTab = 'components' | 'canvas' | 'catalog';
interface SelectedComponent {
nodeType: string;
label: string;
data: any;
iconComponent?: any;
iconColor?: string;
}
interface SidebarStore {
isOpen: boolean;
activeTab: SidebarTab;
showMinimap: boolean;
showComments: boolean;
showFeedbackPanel: boolean;
dontWarnOnDelete: boolean;
floatingPanels: {
components: boolean;
canvas: boolean;
catalog: boolean;
};
selectedComponent: SelectedComponent | null;
toggleSidebar: () => void;
setSidebarOpen: (open: boolean) => void;
setActiveTab: (tab: SidebarTab) => void;
toggleMinimap: () => void;
setMinimapOpen: (open: boolean) => void;
toggleComments: () => void;
setCommentsVisible: (visible: boolean) => void;
toggleFeedbackPanel: () => void;
setFeedbackPanelOpen: (open: boolean) => void;
setDontWarnOnDelete: (dontWarn: boolean) => void;
toggleFloatingPanel: (panel: SidebarTab) => void;
setFloatingPanelOpen: (panel: SidebarTab, open: boolean) => void;
setSelectedComponent: (component: SelectedComponent | null) => void;
}
export const useSidebarStore = create<SidebarStore>()(
persist(
(set) => ({
isOpen: true, // Default open
activeTab: 'components', // Default to components tab
showMinimap: true, // Default show minimap
showComments: true, // Default show comments
showFeedbackPanel: false, // Default hide feedback panel
dontWarnOnDelete: false, // Default show warnings
floatingPanels: {
components: false,
canvas: false,
catalog: false,
},
selectedComponent: null,
toggleSidebar: () => set((state) => ({ isOpen: !state.isOpen })),
setSidebarOpen: (open: boolean) => set({ isOpen: open }),
setActiveTab: (tab: SidebarTab) => set({ activeTab: tab }),
toggleMinimap: () => set((state) => ({ showMinimap: !state.showMinimap })),
setMinimapOpen: (open: boolean) => set({ showMinimap: open }),
toggleComments: () => set((state) => ({ showComments: !state.showComments })),
setCommentsVisible: (visible: boolean) => set({ showComments: visible }),
toggleFeedbackPanel: () => set((state) => ({ showFeedbackPanel: !state.showFeedbackPanel })),
setFeedbackPanelOpen: (open: boolean) => set({ showFeedbackPanel: open }),
setDontWarnOnDelete: (dontWarn: boolean) => set({ dontWarnOnDelete: dontWarn }),
toggleFloatingPanel: (panel: SidebarTab) => set((state) => {
const isCurrentlyOpen = state.floatingPanels[panel];
if (isCurrentlyOpen) {
// Close the current panel
return {
floatingPanels: {
...state.floatingPanels,
[panel]: false,
},
};
} else {
// Close all panels and open the requested one
return {
floatingPanels: {
components: false,
canvas: false,
catalog: false,
[panel]: true,
},
};
}
}),
setFloatingPanelOpen: (panel: SidebarTab, open: boolean) => set((state) => {
if (open) {
// Close all other panels and open the requested one
return {
floatingPanels: {
components: false,
canvas: false,
catalog: false,
[panel]: true,
},
};
} else {
// Just close the requested panel
return {
floatingPanels: {
...state.floatingPanels,
[panel]: false,
},
};
}
}),
setSelectedComponent: (component: SelectedComponent | null) => set({ selectedComponent: component }),
}),
{
name: 'sidebar-storage',
storage: createJSONStorage(() => localStorage),
}
)
);