66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { useEffect } from 'react';
|
|
|
|
import { getDataSourceSrv } from '@grafana/runtime';
|
|
import { Branding } from 'app/core/components/Branding/Branding';
|
|
import { useGrafana } from 'app/core/context/GrafanaContext';
|
|
import { useNavModel } from 'app/core/hooks/useNavModel';
|
|
import { ExploreQueryParams } from 'app/types';
|
|
|
|
import { isFulfilled, hasKey } from './utils';
|
|
|
|
export function useExplorePageTitle(params: ExploreQueryParams) {
|
|
const navModel = useNavModel('explore');
|
|
const { chrome } = useGrafana();
|
|
|
|
useEffect(() => {
|
|
if (!params.panes || typeof params.panes !== 'string') {
|
|
return;
|
|
}
|
|
|
|
let panesObject: unknown;
|
|
try {
|
|
panesObject = JSON.parse(params.panes);
|
|
} catch {
|
|
return;
|
|
}
|
|
|
|
if (typeof panesObject !== 'object' || panesObject === null) {
|
|
return;
|
|
}
|
|
|
|
Promise.allSettled(
|
|
Object.values(panesObject).map((pane) => {
|
|
if (
|
|
!pane ||
|
|
typeof pane !== 'object' ||
|
|
!hasKey('datasource', pane) ||
|
|
!pane.datasource ||
|
|
typeof pane.datasource !== 'string'
|
|
) {
|
|
return Promise.reject();
|
|
}
|
|
|
|
return getDataSourceSrv().get(pane.datasource);
|
|
})
|
|
)
|
|
.then((results) => results.filter(isFulfilled).map((result) => result.value))
|
|
.then((datasources) => {
|
|
if (datasources.length === 0) {
|
|
global.document.title = `${navModel.main.text} - ${Branding.AppTitle}`;
|
|
chrome.update({
|
|
pageNav: undefined,
|
|
});
|
|
return;
|
|
}
|
|
|
|
const namesString = datasources.map((ds) => ds.name).join(' | ');
|
|
chrome.update({
|
|
pageNav: {
|
|
text: namesString,
|
|
},
|
|
});
|
|
global.document.title = `${navModel.main.text} - ${namesString} - ${Branding.AppTitle}`;
|
|
});
|
|
}, [params.panes, navModel.main.text, chrome]);
|
|
}
|