import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react'; import { Tooltip, TooltipContent, TooltipTrigger } from '../components/ui/tooltip'; import { AgentBadge } from './agent-badge'; const AGENT_BADGE_GAP = 6; const getRowWidth = (widths: number[], overflowWidth: number) => { if (widths.length === 0) { return overflowWidth; } return ( widths.reduce((total, width) => total + width, 0) + (widths.length - 1) * AGENT_BADGE_GAP + AGENT_BADGE_GAP + overflowWidth ); }; export function AgentBadgeRow({ agents, skillId }: { agents: string[]; skillId: string }) { const containerRef = useRef(null); const measureRef = useRef(null); const overflowMeasureRef = useRef(null); const [visibleCount, setVisibleCount] = useState(agents.length); const measureVisibleCount = useCallback(() => { const container = containerRef.current; const measure = measureRef.current; const overflowMeasure = overflowMeasureRef.current; if (!container || !measure || !overflowMeasure) { return; } const style = window.getComputedStyle(container); const inlinePadding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight); const availableWidth = container.clientWidth - inlinePadding; const badgeWidths = Array.from(measure.children) .filter((child) => child !== overflowMeasure) .map((child) => child.getBoundingClientRect().width); const totalBadgeWidth = badgeWidths.reduce((total, width) => total + width, 0) + Math.max(0, badgeWidths.length - 1) * AGENT_BADGE_GAP; if (totalBadgeWidth <= availableWidth) { setVisibleCount(agents.length); return; } const overflowWidth = overflowMeasure.getBoundingClientRect().width; let nextVisibleCount = 0; for (let count = 1; count < badgeWidths.length; count += 1) { const rowWidth = getRowWidth(badgeWidths.slice(0, count), overflowWidth); if (rowWidth > availableWidth) { break; } nextVisibleCount = count; } setVisibleCount(nextVisibleCount); }, [agents.length]); useLayoutEffect(() => { measureVisibleCount(); const container = containerRef.current; if (!container) { return; } const resizeObserver = new ResizeObserver(measureVisibleCount); resizeObserver.observe(container); return () => resizeObserver.disconnect(); }, [measureVisibleCount]); const visibleAgents = useMemo(() => agents.slice(0, visibleCount), [agents, visibleCount]); const hiddenAgents = useMemo(() => agents.slice(visibleCount), [agents, visibleCount]); return (
{visibleAgents.map((agent) => ( ))} {hiddenAgents.length > 0 ? ( {hiddenAgents.map((agent) => ( ))} ) : null}
); }