mirror of https://github.com/grafana/grafana
Loki: Refactor editor and syntax hooks (#21687)
parent
b28eac2626
commit
39f7cff7c7
@ -1,60 +0,0 @@ |
||||
import { useState, useEffect } from 'react'; |
||||
import Prism from 'prismjs'; |
||||
import { AbsoluteTimeRange } from '@grafana/data'; |
||||
import { CascaderOption } from '@grafana/ui'; |
||||
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'; |
||||
|
||||
/** |
||||
* |
||||
* @param languageProvider |
||||
* @description Initializes given language provider, exposes Loki syntax and enables loading label option values |
||||
*/ |
||||
export const useLokiSyntax = (languageProvider: LokiLanguageProvider, absoluteRange: AbsoluteTimeRange) => { |
||||
const mounted = useRefMounted(); |
||||
// State
|
||||
const [languageProviderInitialized, setLanguageProviderInitilized] = useState(false); |
||||
const [syntax, setSyntax] = useState(null); |
||||
|
||||
/** |
||||
* Holds information about currently selected option from rc-cascader to perform effect |
||||
* that loads option values not fetched yet. Based on that useLokiLabels hook decides whether or not |
||||
* the option requires additional data fetching |
||||
*/ |
||||
const [activeOption, setActiveOption] = useState<CascaderOption[]>(); |
||||
|
||||
const { logLabelOptions, setLogLabelOptions, refreshLabels } = useLokiLabels( |
||||
languageProvider, |
||||
languageProviderInitialized, |
||||
activeOption, |
||||
absoluteRange |
||||
); |
||||
|
||||
// Async
|
||||
const initializeLanguageProvider = async () => { |
||||
languageProvider.initialRange = absoluteRange; |
||||
await languageProvider.start(); |
||||
Prism.languages[PRISM_SYNTAX] = languageProvider.getSyntax(); |
||||
if (mounted.current) { |
||||
setLogLabelOptions(languageProvider.logLabelOptions); |
||||
setSyntax(languageProvider.getSyntax()); |
||||
setLanguageProviderInitilized(true); |
||||
} |
||||
}; |
||||
|
||||
// Effects
|
||||
useEffect(() => { |
||||
initializeLanguageProvider(); |
||||
}, []); |
||||
|
||||
return { |
||||
isSyntaxReady: languageProviderInitialized, |
||||
syntax, |
||||
logLabelOptions, |
||||
setActiveOption, |
||||
refreshLabels, |
||||
}; |
||||
}; |
@ -0,0 +1,79 @@ |
||||
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); |
||||
|
||||
// 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, |
||||
}; |
||||
}; |
Loading…
Reference in new issue