grafana_bak/public/app/features/explore/hooks/useExplorePageTitle.ts
2025-04-01 10:38:02 +09:00

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]);
}