mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 16:45:43 -06:00
* Component that can cache and extract variable dependencies * Component that can cache and extract variable dependencies * Updates * Refactoring * Lots of refactoring and iterations of supporting both re-rendering and query re-execution * Updated SceneCanvasText * Updated name of file * Updated * Refactoring a bit * Added back getName * Added comment * minor fix * Minor fix * Merge fixes * Scene variable interpolation progress * Merge fixes * Added all format registeries * Progress on multi value support * Progress on multi value support * Updates * Progress on scoped vars * Fixed circular dependency * Updates * Some review fixes * Updated comment * Added forceRender function * Add back fail on console log * Update public/app/features/scenes/variables/interpolation/sceneInterpolator.test.ts * Moving functions from SceneObjectBase * fixing tests * Fixed e2e Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import React, { useEffect } from 'react';
|
|
|
|
import { SceneComponentProps, SceneEditor, SceneObject } from './types';
|
|
|
|
export function SceneComponentWrapper<T extends SceneObject>({
|
|
model,
|
|
isEditing,
|
|
...otherProps
|
|
}: SceneComponentProps<T>) {
|
|
const Component = (model as any).constructor['Component'] ?? EmptyRenderer;
|
|
const inner = <Component {...otherProps} model={model} isEditing={isEditing} />;
|
|
|
|
// Handle component activation state state
|
|
useEffect(() => {
|
|
if (!model.isActive) {
|
|
model.activate();
|
|
}
|
|
return () => {
|
|
if (model.isActive) {
|
|
model.deactivate();
|
|
}
|
|
};
|
|
}, [model]);
|
|
|
|
/** Useful for tests and evaluating efficiency in reducing renderings */
|
|
// @ts-ignore
|
|
model._renderCount += 1;
|
|
|
|
if (!isEditing) {
|
|
return inner;
|
|
}
|
|
|
|
const editor = getSceneEditor(model);
|
|
const EditWrapper = getSceneEditor(model).getEditComponentWrapper();
|
|
|
|
return (
|
|
<EditWrapper model={model} editor={editor}>
|
|
{inner}
|
|
</EditWrapper>
|
|
);
|
|
}
|
|
|
|
function EmptyRenderer<T>(_: SceneComponentProps<T>): React.ReactElement | null {
|
|
return null;
|
|
}
|
|
|
|
function getSceneEditor(sceneObject: SceneObject): SceneEditor {
|
|
const { $editor } = sceneObject.state;
|
|
if ($editor) {
|
|
return $editor;
|
|
}
|
|
|
|
if (sceneObject.parent) {
|
|
return getSceneEditor(sceneObject.parent);
|
|
}
|
|
|
|
throw new Error('No editor found in scene tree');
|
|
}
|