import React, { type JSX, useEffect } from 'react'; import { ContentIcon } from '../icons'; import type { ExtractedLink } from '../utils/ai'; import { Popover } from './ui/Popover'; interface SourcesProps { links: ExtractedLink[]; titleText?: string; } export function SourcesPanel({ links, titleText = 'Sources' }: SourcesProps): JSX.Element | null { const [open, setOpen] = React.useState(false); const triggerRef = React.useRef(null); const [boundary, setBoundary] = React.useState(null); useEffect(() => { if (!open) { return undefined; } const trigger = triggerRef.current; const scrollContainer = trigger?.closest('.DocSearch-Sidepanel-Content') ?? trigger?.closest('.DocSearch-Dropdown') ?? null; setBoundary(scrollContainer); if (!scrollContainer) { return undefined; } const handleScroll = (): void => { if (!triggerRef.current) { return; } const triggerRect = triggerRef.current.getBoundingClientRect(); const containerRect = scrollContainer.getBoundingClientRect(); const isOutOfView = triggerRect.bottom <= containerRect.top || triggerRect.top >= containerRect.bottom; if (isOutOfView) { setOpen(false); } }; scrollContainer.addEventListener('scroll', handleScroll, { passive: true }); return () => { scrollContainer.removeEventListener('scroll', handleScroll); }; }, [open]); if (links.length === 0) { return null; } return ( {links.length} sources {titleText} ); }