mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Add split view and basic APIs to extensions * Add comments * Update public/app/AppWrapper.tsx Co-authored-by: Levente Balogh <balogh.levente.hu@gmail.com> * Moved the .grafana-app element and deduplicate some code * Remove the provider variants of usePluginLinks/Components * Change buildPluginSectionNav * Update comment * Use eventBus * Remove non existent exports * refactor: use a sidecar service to encapsulate the state * Don't wrap single app in split wrapper * Use hook splitter * Remove inline styles * Type the style props from useSplitter * Move the overflow style changes to appWrapper * Deduplicate some common top level providers * Move modals * Move routes wrappers to it's own file * Use better css and add comments * Remove query rows app extension point * Fix test --------- Co-authored-by: Levente Balogh <balogh.levente.hu@gmail.com>
48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { useObservable } from 'react-use';
|
|
|
|
import { PluginExtension } from '@grafana/data';
|
|
import { GetPluginExtensionsOptions, UsePluginExtensionsResult } from '@grafana/runtime';
|
|
import { useSidecar } from 'app/core/context/SidecarContext';
|
|
|
|
import { getPluginExtensions } from './getPluginExtensions';
|
|
import { PluginExtensionRegistries } from './registry/types';
|
|
|
|
export function createUsePluginExtensions(registries: PluginExtensionRegistries) {
|
|
const observableAddedComponentsRegistry = registries.addedComponentsRegistry.asObservable();
|
|
const observableAddedLinksRegistry = registries.addedLinksRegistry.asObservable();
|
|
|
|
return function usePluginExtensions(options: GetPluginExtensionsOptions): UsePluginExtensionsResult<PluginExtension> {
|
|
const addedComponentsRegistry = useObservable(observableAddedComponentsRegistry);
|
|
const addedLinksRegistry = useObservable(observableAddedLinksRegistry);
|
|
const { activePluginId } = useSidecar();
|
|
|
|
const { extensions } = useMemo(() => {
|
|
if (!addedLinksRegistry && !addedComponentsRegistry) {
|
|
return { extensions: [], isLoading: false };
|
|
}
|
|
|
|
return getPluginExtensions({
|
|
extensionPointId: options.extensionPointId,
|
|
context: options.context,
|
|
limitPerPlugin: options.limitPerPlugin,
|
|
addedComponentsRegistry,
|
|
addedLinksRegistry,
|
|
});
|
|
// Doing the deps like this instead of just `option` because users probably aren't going to memoize the
|
|
// options object so we are checking it's simple value attributes.
|
|
// The context though still has to be memoized though and not mutated.
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: refactor `getPluginExtensions` to accept service dependencies as arguments instead of relying on the sidecar singleton under the hood
|
|
}, [
|
|
addedLinksRegistry,
|
|
addedComponentsRegistry,
|
|
options.extensionPointId,
|
|
options.context,
|
|
options.limitPerPlugin,
|
|
activePluginId,
|
|
]);
|
|
|
|
return { extensions, isLoading: false };
|
|
};
|
|
}
|