import React, { useContext, useRef, useCallback } from 'react'; import type { AnyWorkspace } from '../stores/workspaces'; export type WorkspaceComponent = { name: T; component: React.FunctionComponent< Omit, 'type'> >; }; export type AnyWorkspaceComponent = | WorkspaceComponent<'My Queries'> | WorkspaceComponent<'Performance'> | WorkspaceComponent<'Databases'> | WorkspaceComponent<'Collections'> | WorkspaceComponent<'Collection'>; const WorkspacesContext = React.createContext([]); export const WorkspacesProvider: React.FunctionComponent<{ value: AnyWorkspaceComponent[]; }> = ({ value, children }) => { const valueRef = useRef(value); return ( {children} ); }; export const useWorkspacePlugin = () => { const workspaces = useContext(WorkspacesContext); return useCallback( (name: T) => { const plugin = workspaces.find((workspace) => workspace.name === name); if (!plugin) { throw new Error( `Component for workspace "${name}" is missing in context. Did you forget to set up WorkspacesProvider?` ); } return plugin.component as unknown as WorkspaceComponent['component']; }, [workspaces] ); };