mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* Chore: Fix typescript strict null errors * Added new limit * Fixed ts issue * fixed tests * trying to fix type inference * Fixing more ts errors * Revert tsconfig option * Fix * Fixed code * More fixes * fix tests * Updated snapshot * Chore: More ts strict null fixes * More fixes in some really messed up azure config components * More fixes, current count: 441 * 419 * More fixes * Fixed invalid initial state in explore * Fixing tests * Fixed tests * Explore fix * More fixes * Progress * Sub 300 * Fixed incorrect type * removed unused import
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { useState, useEffect } from 'react';
|
|
import Prism, { Grammar } from 'prismjs';
|
|
import { AbsoluteTimeRange } from '@grafana/data';
|
|
import LokiLanguageProvider from 'app/plugins/datasource/loki/language_provider';
|
|
import { useLokiLabels } from 'app/plugins/datasource/loki/components/useLokiLabels';
|
|
import { useRefMounted } from 'app/core/hooks/useRefMounted';
|
|
|
|
const PRISM_SYNTAX = 'promql';
|
|
|
|
/**
|
|
* Initialise the language provider. Returns a languageProviderInitialized boolean cause there does not seem other way
|
|
* to know if the provider is already initialised or not. By the initialisation it modifies the provided
|
|
* languageProvider directly.
|
|
*/
|
|
const useInitLanguageProvider = (languageProvider: LokiLanguageProvider, absoluteRange: AbsoluteTimeRange) => {
|
|
const mounted = useRefMounted();
|
|
|
|
const [languageProviderInitialized, setLanguageProviderInitialized] = useState(false);
|
|
|
|
// Async
|
|
const initializeLanguageProvider = async () => {
|
|
languageProvider.initialRange = absoluteRange;
|
|
await languageProvider.start();
|
|
if (mounted.current) {
|
|
setLanguageProviderInitialized(true);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
initializeLanguageProvider();
|
|
}, []);
|
|
|
|
return languageProviderInitialized;
|
|
};
|
|
|
|
/**
|
|
* Returns syntax from languageProvider and initialises global Prism syntax. Waits until languageProvider itself is
|
|
* initialised (outside of this hook).
|
|
*/
|
|
const useLokiSyntax = (languageProvider: LokiLanguageProvider, languageProviderInitialized: boolean) => {
|
|
// State
|
|
const [syntax, setSyntax] = useState<Grammar | null>(null);
|
|
|
|
// Effects
|
|
useEffect(() => {
|
|
if (languageProviderInitialized) {
|
|
const syntax = languageProvider.getSyntax();
|
|
Prism.languages[PRISM_SYNTAX] = syntax;
|
|
setSyntax(syntax);
|
|
}
|
|
}, [languageProviderInitialized, languageProvider]);
|
|
|
|
return {
|
|
isSyntaxReady: !!syntax,
|
|
syntax,
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Initializes given language provider, exposes Loki syntax and enables loading label option values
|
|
*/
|
|
export const useLokiSyntaxAndLabels = (languageProvider: LokiLanguageProvider, absoluteRange: AbsoluteTimeRange) => {
|
|
const languageProviderInitialized = useInitLanguageProvider(languageProvider, absoluteRange);
|
|
|
|
const { logLabelOptions, refreshLabels, setActiveOption } = useLokiLabels(
|
|
languageProvider,
|
|
languageProviderInitialized,
|
|
absoluteRange
|
|
);
|
|
const { isSyntaxReady, syntax } = useLokiSyntax(languageProvider, languageProviderInitialized);
|
|
|
|
return {
|
|
isSyntaxReady,
|
|
syntax,
|
|
logLabelOptions,
|
|
setActiveOption,
|
|
refreshLabels,
|
|
};
|
|
};
|