import { ReactElement, useEffect, useMemo, useState } from 'react'; import { LoadingState, PanelMenuItem, PluginExtensionPanelContext, PluginExtensionPoints, getTimeZone, } from '@grafana/data'; import { usePluginLinks } from '@grafana/runtime'; import { DashboardModel } from '../../state/DashboardModel'; import { PanelModel } from '../../state/PanelModel'; import { getPanelMenu } from '../../utils/getPanelMenu'; interface PanelHeaderMenuProviderApi { items: PanelMenuItem[]; } interface Props { panel: PanelModel; dashboard: DashboardModel; loadingState?: LoadingState; children: (props: PanelHeaderMenuProviderApi) => ReactElement; } export function PanelHeaderMenuProvider({ panel, dashboard, loadingState, children }: Props) { const [items, setItems] = useState([]); const context = useMemo(() => createExtensionContext(panel, dashboard), [panel, dashboard]); const { links } = usePluginLinks({ extensionPointId: PluginExtensionPoints.DashboardPanelMenu, context, limitPerPlugin: 3, }); useEffect(() => { setItems(getPanelMenu(dashboard, panel, links)); }, [dashboard, panel, loadingState, setItems, links]); return children({ items }); } function createExtensionContext(panel: PanelModel, dashboard: DashboardModel): PluginExtensionPanelContext { return { id: panel.id, pluginId: panel.type, title: panel.title, timeRange: dashboard.time, timeZone: getTimeZone({ timeZone: dashboard.timezone, }), dashboard: { uid: dashboard.uid, title: dashboard.title, tags: Array.from(dashboard.tags), }, targets: panel.targets, scopedVars: panel.scopedVars, data: panel.getQueryRunner().getLastResult(), }; }