import { useState } from 'react'; import * as React from 'react'; import { PluginType } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { Alert } from '@grafana/ui'; type Props = { className?: string; pluginId?: string; pluginType?: PluginType; angularSupportEnabled?: boolean; showPluginDetailsLink?: boolean; interactionElementId?: string; children?: React.ReactNode; }; function deprecationMessage(pluginType?: string, angularSupportEnabled?: boolean): string { let pluginTypeString: string; switch (pluginType) { case PluginType.app: pluginTypeString = 'app plugin'; break; case PluginType.panel: pluginTypeString = 'panel plugin'; break; case PluginType.datasource: pluginTypeString = 'data source plugin'; break; default: pluginTypeString = 'plugin'; } let msg = `This ${pluginTypeString} uses a deprecated, legacy platform based on AngularJS and `; if (angularSupportEnabled === undefined) { return msg + ' may be incompatible depending on your Grafana configuration.'; } if (angularSupportEnabled) { return msg + ' will stop working in future releases of Grafana.'; } return msg + ' is incompatible with your current Grafana configuration.'; } // An Alert showing information about Angular deprecation notice. // If the plugin does not use Angular (!plugin.angularDetected), it returns null. export function AngularDeprecationPluginNotice(props: Props): React.ReactElement | null { const { className, angularSupportEnabled, pluginId, pluginType, showPluginDetailsLink, interactionElementId, children, } = props; const [dismissed, setDismissed] = useState(false); const interactionAttributes: Record = {}; if (pluginId) { interactionAttributes.pluginId = pluginId; } if (interactionElementId) { interactionAttributes.elementId = interactionElementId; } return dismissed ? null : ( setDismissed(true)}>

{deprecationMessage(pluginType, angularSupportEnabled)}

{children && ( <>
{children} )}
); }