import React, { useEffect, useRef, useState } from 'react'; import { AnnotationQuery, DataSourceApi } from '@grafana/data'; import { AngularComponent, getAngularLoader } from '@grafana/runtime'; export interface Props { annotation: AnnotationQuery; datasource: DataSourceApi; onChange: (annotation: AnnotationQuery) => void; } export const AngularEditorLoader: React.FC = React.memo(({ annotation, datasource, onChange }) => { const ref = useRef(null); const [angularComponent, setAngularComponent] = useState(null); useEffect(() => { return () => { if (angularComponent) { angularComponent.destroy(); } }; }, [angularComponent]); useEffect(() => { if (ref.current) { const loader = getAngularLoader(); const template = ` `; const scopeProps = { ctrl: { currentDatasource: datasource, currentAnnotation: annotation, }, }; const component = loader.load(ref.current, scopeProps, template); component.digest(); component.getScope().$watch(() => { onChange({ ...annotation, }); }); setAngularComponent(component); } }, [ref]); return
; }); AngularEditorLoader.displayName = 'AngularEditorLoader';