import React, { useState, useEffect } from 'react' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faPlane, faGlobe, faCircle, faSpinner } from '@fortawesome/free-solid-svg-icons' import { RelayPool } from 'applesauce-relay' import { useRelayStatus } from '../hooks/useRelayStatus' import { isLocalRelay } from '../utils/helpers' import { useIsMobile } from '../hooks/useMediaQuery' interface RelayStatusIndicatorProps { relayPool: RelayPool | null showOnMobile?: boolean // Control visibility based on scroll } export const RelayStatusIndicator: React.FC = ({ relayPool, showOnMobile = true }) => { // Poll frequently for responsive offline indicator (5s instead of default 20s) const relayStatuses = useRelayStatus({ relayPool, pollingInterval: 5000 }) const [isConnecting, setIsConnecting] = useState(true) const [isExpanded, setIsExpanded] = useState(false) const isMobile = useIsMobile() if (!relayPool) return null // Get currently connected relays const connectedRelays = relayStatuses.filter(r => r.isInPool) const connectedUrls = connectedRelays.map(r => r.url) // Determine connection status const hasLocalRelay = connectedUrls.some(url => isLocalRelay(url)) const hasRemoteRelay = connectedUrls.some(url => !isLocalRelay(url)) const localOnlyMode = hasLocalRelay && !hasRemoteRelay const offlineMode = connectedUrls.length === 0 // Show "Connecting" for first few seconds or until relays connect useEffect(() => { if (connectedUrls.length > 0) { // Connected! Stop showing connecting state setIsConnecting(false) } else { // No connections yet - show connecting for 8 seconds setIsConnecting(true) const timeout = setTimeout(() => { setIsConnecting(false) }, 8000) return () => clearTimeout(timeout) } }, [connectedUrls.length]) // Debug logging useEffect(() => { console.log('🔌 Relay Status Indicator:', { mode: isConnecting ? 'CONNECTING' : offlineMode ? 'OFFLINE' : localOnlyMode ? 'LOCAL_ONLY' : 'ONLINE', totalStatuses: relayStatuses.length, connectedCount: connectedUrls.length, connectedUrls: connectedUrls.map(u => u.replace(/^wss?:\/\//, '')), hasLocalRelay, hasRemoteRelay, isConnecting }) }, [offlineMode, localOnlyMode, connectedUrls, relayStatuses.length, hasLocalRelay, hasRemoteRelay, isConnecting]) // Don't show indicator when fully connected (but show when connecting) if (!localOnlyMode && !offlineMode && !isConnecting) return null const handleClick = () => { if (isMobile) { setIsExpanded(!isExpanded) } } // On mobile, default to collapsed (icon only). On desktop, always show details. const showDetails = !isMobile || isExpanded // On mobile when collapsed, make it circular like the highlight button const isCollapsedOnMobile = isMobile && !isExpanded return (
{showDetails && ( <>
{isConnecting ? ( Connecting ) : offlineMode ? ( <> Offline No relays connected ) : ( <> Flight Mode {connectedUrls.length} local relay{connectedUrls.length !== 1 ? 's' : ''} )}
{!offlineMode && !isConnecting && (
)} )}
) }