import React, { FC, useReducer } from 'react'; import { Icon, IconName, Tooltip } from '@grafana/ui'; import { sanitize, sanitizeUrl } from '@grafana/data/src/text/sanitize'; import { DashboardLinksDashboard } from './DashboardLinksDashboard'; import { getLinkSrv } from '../../../panel/panellinks/link_srv'; import { DashboardModel } from '../../state'; import { DashboardLink } from '../../state/DashboardModel'; import { linkIconMap } from '../LinksSettings/LinkSettingsEdit'; import { useEffectOnce } from 'react-use'; import { CoreEvents } from 'app/types'; import { selectors } from '@grafana/e2e-selectors'; export interface Props { dashboard: DashboardModel; links: DashboardLink[]; } export const DashboardLinks: FC = ({ dashboard, links }) => { if (!links.length) { return null; } // Emulate forceUpdate (https://reactjs.org/docs/hooks-faq.html#is-there-something-like-forceupdate) const [, forceUpdate] = useReducer((x) => x + 1, 0); useEffectOnce(() => { dashboard.on(CoreEvents.timeRangeUpdated, forceUpdate); return () => { dashboard.off(CoreEvents.timeRangeUpdated, forceUpdate); }; }); useEffectOnce(() => { dashboard.on(CoreEvents.submenuVisibilityChanged, forceUpdate); return () => { dashboard.off(CoreEvents.submenuVisibilityChanged, forceUpdate); }; }); return ( <> {links.map((link: DashboardLink, index: number) => { const linkInfo = getLinkSrv().getAnchorInfo(link); const key = `${link.title}-$${index}`; if (link.type === 'dashboards') { return ; } const linkElement = ( {sanitize(linkInfo.title)} ); return (
{link.tooltip ? {linkElement} : linkElement}
); })} ); };