import React, { useState, useMemo } from 'react'; import { applyFieldOverrides, FieldConfigSource, getTimeZone, PanelData, PanelPlugin } from '@grafana/data'; import { PanelRendererProps } from '@grafana/runtime'; import { appEvents } from 'app/core/core'; import { useAsync } from 'react-use'; import { getPanelOptionsWithDefaults, OptionDefaults } from '../dashboard/state/getPanelOptionsWithDefaults'; import { importPanelPlugin } from '../plugins/plugin_loader'; import { useTheme2 } from '@grafana/ui'; export function PanelRenderer

(props: PanelRendererProps) { const { pluginId, data, timeZone = getTimeZone(), options = {}, width, height, title, onOptionsChange = () => {}, onChangeTimeRange = () => {}, fieldConfig: config = { defaults: {}, overrides: [] }, } = props; const [fieldConfig, setFieldConfig] = useState(config); const { value: plugin, error, loading } = useAsync(() => importPanelPlugin(pluginId), [pluginId]); const optionsWithDefaults = useOptionDefaults(plugin, options, fieldConfig); const dataWithOverrides = useFieldOverrides(plugin, optionsWithDefaults, data, timeZone); if (error) { return

Failed to load plugin: {error.message}
; } if (loading) { return
Loading plugin panel...
; } if (!plugin || !plugin.panel) { return
Seems like the plugin you are trying to load does not have a panel component.
; } if (!dataWithOverrides) { return
No panel data
; } const PanelComponent = plugin.panel; return ( str} onOptionsChange={onOptionsChange} onFieldConfigChange={setFieldConfig} onChangeTimeRange={onChangeTimeRange} eventBus={appEvents} /> ); } const useOptionDefaults =

( plugin: PanelPlugin | undefined, options: P, fieldConfig: FieldConfigSource ): OptionDefaults | undefined => { return useMemo(() => { if (!plugin) { return; } return getPanelOptionsWithDefaults({ plugin, currentOptions: options, currentFieldConfig: fieldConfig, isAfterPluginChange: false, }); }, [plugin, fieldConfig, options]); }; const useFieldOverrides = ( plugin: PanelPlugin | undefined, defaultOptions: OptionDefaults | undefined, data: PanelData | undefined, timeZone: string ): PanelData | undefined => { const fieldConfig = defaultOptions?.fieldConfig; const series = data?.series; const fieldConfigRegistry = plugin?.fieldConfigRegistry; const theme = useTheme2(); return useMemo(() => { if (!fieldConfigRegistry || !fieldConfig || !data) { return; } return { ...data, series: applyFieldOverrides({ data: series, fieldConfig, fieldConfigRegistry, replaceVariables: (str: string) => str, theme, timeZone, }), }; }, [fieldConfigRegistry, fieldConfig, data, series, timeZone, theme]); };