Scopes: Add ScopesContext to @grafana/runtime (#97566)

This commit is contained in:
Bogdan Matei
2024-12-09 16:37:50 +02:00
committed by GitHub
parent a7d345282f
commit 7cc0604360
2 changed files with 63 additions and 0 deletions
@@ -0,0 +1,61 @@
import { createContext, useContext } from 'react';
import { useObservable } from 'react-use';
import { Observable } from 'rxjs';
import { Scope } from '@grafana/data';
export interface ScopesContextValueState {
drawerOpened: boolean;
enabled: boolean;
loading: boolean;
readOnly: boolean;
value: Scope[];
}
export interface ScopesContextValue {
/**
* Current state.
*/
state: ScopesContextValueState;
/**
* Observable that emits the current state.
*/
stateObservable: Observable<ScopesContextValue['state']>;
/**
* Change the selected scopes. The service takes care about loading them and propagating the changes.
* @param scopeNames
*/
changeScopes(scopeNames: string[]): void;
/**
* Set read-only mode.
* If `readOnly` is `true`, the selector will be set to read-only and the dashboards panel will be closed.
*/
setReadOnly(readOnly: boolean): void;
/**
* Enable or disable the usage of scopes.
* This will hide the selector and the dashboards panel, and it will stop propagating the scopes to the query object.
*/
setEnabled(enabled: boolean): void;
}
export const ScopesContext = createContext<ScopesContextValue | undefined>(undefined);
export function useScopes(): ScopesContextValue | undefined {
const context = useContext(ScopesContext);
useObservable(context?.stateObservable ?? new Observable(), context?.state);
return context
? {
state: context.state,
stateObservable: context.stateObservable,
changeScopes: context.changeScopes,
setReadOnly: context.setReadOnly,
setEnabled: context.setEnabled,
}
: undefined;
}
@@ -36,3 +36,5 @@ export { setPluginLinksHook, usePluginLinks } from './pluginExtensions/usePlugin
export { isPluginExtensionLink, isPluginExtensionComponent } from './pluginExtensions/utils';
export { setCurrentUser } from './user';
export { ScopesContext, type ScopesContextValueState, type ScopesContextValue, useScopes } from './ScopesContext';