import { useSmartRelayNavigation } from '@/PageManager' import { Button } from '@/components/ui/button' import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerOverlay } from '@/components/ui/drawer' 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 { useScreenSize } from '@/providers/ScreenSizeProvider' import { Server } from 'lucide-react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import RelayIcon from '../RelayIcon' function rowMuted(connected: boolean) { return !connected } function rowTitle(url: string, connected: boolean, t: (k: string) => string) { const base = simplifyUrl(url) if (!connected) return `${base} — ${t('Not connected')}` return base } /** * Server icon + menu listing relays with an open WebSocket in the pool. */ export function ActiveRelaysTitlebarButton() { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const { navigateToRelay } = useSmartRelayNavigation() const { rows, connectedCount } = useRelayConnectionRows() const [drawerOpen, setDrawerOpen] = useState(false) const countSummary = rows.length > 0 ? `${connectedCount}/${rows.length}` : '' const trigger = ( ) const rowClass = (connected: boolean) => cn(rowMuted(connected) && 'opacity-45 text-muted-foreground') if (isSmallScreen) { return ( <> {trigger} setDrawerOpen(false)} /> {t('Active relays')} {rows.length > 0 ? (

{connectedCount} / {rows.length}

) : null}
{rows.map(({ url, connected }) => ( ))}
) } return ( {trigger} {t('Active relays')} {rows.map(({ url, connected }) => ( navigateToRelay(toRelay(url))} className={cn('min-w-52 gap-2', rowClass(connected))} > {simplifyUrl(url)} ))} ) }