import React from 'react'; import {Popover, Tab, TabList, TabPanel, TabProvider} from '@gravity-ui/uikit'; import type { TopologyNodeDataStatsItem, TopologyNodeDataStatsSection, } from '../../store/reducers/query/types'; import {cn} from '../../utils/cn'; import type {ExtendedTBlock} from './types'; const b = cn('ydb-gravity-graph'); type Props = { block: ExtendedTBlock; children: React.ReactElement>; }; const getStatsContent = (stat: TopologyNodeDataStatsItem | TopologyNodeDataStatsSection) => { if ('value' in stat) { return (

{stat.name}: {stat.value}

); } return (
{stat.name}:
{stat.items?.map(({name, value}: TopologyNodeDataStatsItem) => (

{name}: {value}

))}
); }; const useTooltipContent = (block: ExtendedTBlock) => { const firstTab = block?.stats?.[0]?.group || ''; const [activeTab, setActiveTab] = React.useState(firstTab); const validatedActiveTab = block.stats?.some(({group}) => group === activeTab) ? activeTab : firstTab; React.useEffect(() => { if (activeTab !== validatedActiveTab) { setActiveTab(validatedActiveTab); } }, [activeTab, validatedActiveTab]); return React.useMemo( () => ( {block?.stats?.map((item) => ( {item.group} ))} {block?.stats?.map((item) => ( {item.stats?.map(getStatsContent)} ))} ), [block?.stats, validatedActiveTab], ); }; export const TooltipComponent = ({block, children}: Props) => { const content = useTooltipContent(block); const trigger = React.cloneElement(children, { role: children.props.role ?? 'button', tabIndex: children.props.tabIndex ?? 0, onKeyDown: (event: React.KeyboardEvent) => { children.props.onKeyDown?.(event); if (event.defaultPrevented) { return; } if (event.key === 'Enter') { event.preventDefault(); event.currentTarget.click(); } else if (event.key === ' ') { event.preventDefault(); } }, onKeyUp: (event: React.KeyboardEvent) => { children.props.onKeyUp?.(event); if (!event.defaultPrevented && event.key === ' ') { event.currentTarget.click(); } }, }); return ( {trigger} ); };