import { useSmartRelayNavigation } from '@/PageManager' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { useRelayConnectionRows } from '@/hooks/useRelayConnectionRows' import { toRelay } from '@/lib/link' import { simplifyUrl } from '@/lib/url' import { cn } from '@/lib/utils' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' const MAX_ICONS = 14 function rowMuted(connected: boolean) { return !connected } function rowMenuClass(connected: boolean) { return cn(rowMuted(connected) && 'opacity-50 text-muted-foreground') } function rowTitle(url: string, connected: boolean, t: (k: string) => string) { const base = simplifyUrl(url) if (!connected) return `${base} — ${t('Not connected')}` return base } /** * Desktop sidebar: relay avatars for relays with an open WebSocket in the pool. */ export function ConnectedRelaysSidebarStrip({ className }: { className?: string }) { const { t } = useTranslation() const { navigateToRelay } = useSmartRelayNavigation() const { rows } = useRelayConnectionRows() const shown = rows.slice(0, MAX_ICONS) const overflowRows = rows.slice(MAX_ICONS) const overflow = overflowRows.length if (rows.length === 0) { return (

{t('Active relays')}

) } return (

{t('Active relays')}

{shown.map(({ url, connected }) => ( ))} {overflow > 0 ? ( {t('More relays', { count: overflow })} {overflowRows.map(({ url, connected }) => ( navigateToRelay(toRelay(url))} > {simplifyUrl(url)} ))} ) : null}
) }