From dbbd9f23d103b9e8a532a390b4dcc2d047110d80 Mon Sep 17 00:00:00 2001 From: Matt Cowley Date: Tue, 8 Jul 2025 14:51:30 +0100 Subject: [PATCH] Plugin Extensions: Expose PluginMeta generic in usePluginContext (#107577) * Plugin Extensions: Expose PluginMeta generic in usePluginContext * Plugin Extensions: Cast usePluginContext type on return * Plugin Extensions: Fix PluginContext export --- .../plugins/DataSourcePluginContextProvider.tsx | 4 ++-- .../src/context/plugins/PluginContext.tsx | 9 +++++---- .../src/context/plugins/PluginContextProvider.tsx | 4 ++-- packages/grafana-data/src/context/plugins/guards.ts | 6 +++++- .../src/context/plugins/usePluginContext.tsx | 11 +++++++---- packages/grafana-data/src/index.ts | 2 +- 6 files changed, 22 insertions(+), 14 deletions(-) diff --git a/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx b/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx index 1464f1a6f6c..db5b5a5b610 100644 --- a/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx +++ b/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren, ReactElement, useMemo } from 'react'; import { DataSourceInstanceSettings } from '../../types/datasource'; -import { Context, DataSourcePluginContextType } from './PluginContext'; +import { PluginContext, DataSourcePluginContextType } from './PluginContext'; export type DataSourcePluginContextProviderProps = { instanceSettings: DataSourceInstanceSettings; @@ -16,5 +16,5 @@ export function DataSourcePluginContextProvider( return { instanceSettings, meta: instanceSettings.meta }; }, [instanceSettings]); - return {children}; + return {children}; } diff --git a/packages/grafana-data/src/context/plugins/PluginContext.tsx b/packages/grafana-data/src/context/plugins/PluginContext.tsx index f8748617541..7471109d93d 100644 --- a/packages/grafana-data/src/context/plugins/PluginContext.tsx +++ b/packages/grafana-data/src/context/plugins/PluginContext.tsx @@ -1,14 +1,15 @@ import { createContext } from 'react'; +import { KeyValue } from '../../types/data'; import { DataSourceInstanceSettings } from '../../types/datasource'; import { PluginMeta } from '../../types/plugin'; -export interface PluginContextType { - meta: PluginMeta; +export interface PluginContextType { + meta: PluginMeta; } -export interface DataSourcePluginContextType extends PluginContextType { +export interface DataSourcePluginContextType extends PluginContextType { instanceSettings: DataSourceInstanceSettings; } -export const Context = createContext(undefined); +export const PluginContext = createContext(undefined); diff --git a/packages/grafana-data/src/context/plugins/PluginContextProvider.tsx b/packages/grafana-data/src/context/plugins/PluginContextProvider.tsx index f60381c5aaa..c7698b18a34 100644 --- a/packages/grafana-data/src/context/plugins/PluginContextProvider.tsx +++ b/packages/grafana-data/src/context/plugins/PluginContextProvider.tsx @@ -2,7 +2,7 @@ import { PropsWithChildren, ReactElement } from 'react'; import { PluginMeta } from '../../types/plugin'; -import { Context } from './PluginContext'; +import { PluginContext } from './PluginContext'; export type PluginContextProviderProps = { meta: PluginMeta; @@ -10,5 +10,5 @@ export type PluginContextProviderProps = { export function PluginContextProvider(props: PropsWithChildren): ReactElement { const { children, ...rest } = props; - return {children}; + return {children}; } diff --git a/packages/grafana-data/src/context/plugins/guards.ts b/packages/grafana-data/src/context/plugins/guards.ts index 3a93c862f09..3b89b24dfed 100644 --- a/packages/grafana-data/src/context/plugins/guards.ts +++ b/packages/grafana-data/src/context/plugins/guards.ts @@ -1,5 +1,9 @@ +import { KeyValue } from '../../types/data'; + import { type DataSourcePluginContextType, type PluginContextType } from './PluginContext'; -export function isDataSourcePluginContext(context: PluginContextType): context is DataSourcePluginContextType { +export function isDataSourcePluginContext( + context: PluginContextType +): context is DataSourcePluginContextType { return 'instanceSettings' in context && 'meta' in context; } diff --git a/packages/grafana-data/src/context/plugins/usePluginContext.tsx b/packages/grafana-data/src/context/plugins/usePluginContext.tsx index 58190a7e4e1..b00875909d7 100644 --- a/packages/grafana-data/src/context/plugins/usePluginContext.tsx +++ b/packages/grafana-data/src/context/plugins/usePluginContext.tsx @@ -1,9 +1,11 @@ import { useContext } from 'react'; -import { Context, PluginContextType } from './PluginContext'; +import { KeyValue } from '../../types/data'; -export function usePluginContext(): PluginContextType | null { - const context = useContext(Context); +import { PluginContext, PluginContextType } from './PluginContext'; + +export function usePluginContext(): PluginContextType | null { + const context = useContext(PluginContext); // The extensions hooks (e.g. `usePluginLinks()`) are using this hook to check // if they are inside a plugin or not (core Grafana), so we should be able to return an empty state as well (`null`). @@ -11,5 +13,6 @@ export function usePluginContext(): PluginContextType | null { return null; } - return context; + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return context as PluginContextType; } diff --git a/packages/grafana-data/src/index.ts b/packages/grafana-data/src/index.ts index 80351af8bc2..bc9e4d245db 100644 --- a/packages/grafana-data/src/index.ts +++ b/packages/grafana-data/src/index.ts @@ -435,7 +435,7 @@ export { type GroupingToMatrixTransformerOptions } from './transformations/trans export { type PluginContextType, type DataSourcePluginContextType, - Context as PluginContext, + PluginContext, } from './context/plugins/PluginContext'; export { type PluginContextProviderProps, PluginContextProvider } from './context/plugins/PluginContextProvider'; export {