diff --git a/src/components/Settings/RelaySettings.tsx b/src/components/Settings/RelaySettings.tsx index c20f181c..765f5861 100644 --- a/src/components/Settings/RelaySettings.tsx +++ b/src/components/Settings/RelaySettings.tsx @@ -11,9 +11,6 @@ interface RelaySettingsProps { } const RelaySettings: React.FC = ({ relayStatuses }) => { - const activeRelays = relayStatuses.filter(r => r.isInPool) - const recentRelays = relayStatuses.filter(r => !r.isInPool) - const formatRelayUrl = (url: string) => { return url.replace(/^wss?:\/\//, '').replace(/\/$/, '') } @@ -26,150 +23,109 @@ const RelaySettings: React.FC = ({ relayStatuses }) => { } } + // Sort relays: local relays first, then by connection status, then by URL + const sortedRelays = [...relayStatuses].sort((a, b) => { + const aIsLocal = isLocalRelay(a.url) + const bIsLocal = isLocalRelay(b.url) + + // Local relays always first + if (aIsLocal && !bIsLocal) return -1 + if (!aIsLocal && bIsLocal) return 1 + + // Within local or remote groups, connected before disconnected + if (a.isInPool !== b.isInPool) return a.isInPool ? -1 : 1 + + // Finally sort by URL + return a.url.localeCompare(b.url) + }) + + const getRelayIcon = (relay: RelayStatus) => { + const isLocal = isLocalRelay(relay.url) + const isConnected = relay.isInPool + + if (isLocal) { + return { + icon: faPlane, + color: isConnected ? '#22c55e' : '#ef4444', + size: '1rem' + } + } else { + if (isConnected) { + return { + icon: faCheckCircle, + color: '#22c55e', + size: '1rem' + } + } else { + return { + icon: faCircle, + color: '#ef4444', + size: '0.7rem' + } + } + } + } + return (

Relays

- {activeRelays.length > 0 && ( -
-
- {activeRelays.map((relay) => ( -
- -
-
- {formatRelayUrl(relay.url)} - {isLocalRelay(relay.url) && ( - - - - )} -
-
-
- ))} -
-
- )} - - {recentRelays.length > 0 && ( + {sortedRelays.length > 0 && (
-

- Offline -

- {recentRelays.map((relay) => ( -
- -
-
{ + const iconConfig = getRelayIcon(relay) + const isDisconnected = !relay.isInPool + + return ( +
- {formatRelayUrl(relay.url)} - {isLocalRelay(relay.url) && ( - - - - )} + gap: '0.75rem', + padding: '0.75rem', + background: 'var(--surface-secondary)', + borderRadius: '6px', + marginBottom: '0.5rem', + opacity: isDisconnected ? 0.7 : 1 + }} + > + +
+
+ {formatRelayUrl(relay.url)} +
+ {isDisconnected && ( +
+ + {formatLastSeen(relay.lastSeen)} +
+ )}
-
- - {formatLastSeen(relay.lastSeen)} -
-
- ))} + ) + })}
)}