diff --git a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift index f779d007a3..0fa33f6290 100644 --- a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift +++ b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift @@ -189,14 +189,18 @@ struct ServersSummaryView: View { _ header: LocalizedStringKey? = nil, _ footer: LocalizedStringKey? = nil ) -> some View { + // Sort by known, then connected, then address let sortedServers = servers.sorted { - $0.connected == $1.connected - ? serverAddress($0.smpServer) < serverAddress($1.smpServer) - : $0.connected && !$1.connected + $0.known == $1.known ? ( + $0.connected == $1.connected + ? serverAddress($0.smpServer) < serverAddress($1.smpServer) + : $0.connected && !$1.connected + ) : ($0.known ?? false) && !($1.known ?? false) } + let reserveIconSpace = sortedServers.contains(where: { $0.known ?? false }) Section { ForEach(sortedServers) { server in - smpServerView(server, showReconnectButton, statsStartedAt) + smpServerView(server, showReconnectButton, statsStartedAt, reserveIconSpace) } } header: { if let header = header { @@ -209,7 +213,7 @@ struct ServersSummaryView: View { } } - private func smpServerView(_ srvSumm: SMPServerSummary, _ showReconnectButton: Bool, _ statsStartedAt: Date) -> some View { + private func smpServerView(_ srvSumm: SMPServerSummary, _ showReconnectButton: Bool, _ statsStartedAt: Date, _ reserveIconSpace: Bool) -> some View { NavigationLink(tag: srvSumm.id, selection: $selectedSMPServer) { SMPServerSummaryView( summary: srvSumm, @@ -220,6 +224,19 @@ struct ServersSummaryView: View { .navigationBarTitleDisplayMode(.large) } label: { HStack { + Group { + if srvSumm.known ?? false { + Image(systemName: "server.rack") + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundColor(.secondary) + } else if reserveIconSpace { + Color.clear + } + } + .frame(width: 20, alignment: .center) + .padding(.trailing, 4) + Text(serverAddress(srvSumm.smpServer)) .lineLimit(1) if srvSumm.connected { @@ -243,10 +260,16 @@ struct ServersSummaryView: View { _ header: LocalizedStringKey? = nil, _ footer: LocalizedStringKey? = nil ) -> some View { - let sortedServers = servers.sorted { serverAddress($0.xftpServer) < serverAddress($1.xftpServer) } + // Sort by known, then address + let sortedServers = servers.sorted { + $0.known == $1.known + ? serverAddress($0.xftpServer) < serverAddress($1.xftpServer) + : ($0.known ?? false) && !($1.known ?? false) + } + let reserveIconSpace = sortedServers.contains(where: { $0.known ?? false }) Section { ForEach(sortedServers) { server in - xftpServerView(server, statsStartedAt) + xftpServerView(server, statsStartedAt, reserveIconSpace) } } header: { if let header = header { @@ -259,7 +282,7 @@ struct ServersSummaryView: View { } } - private func xftpServerView(_ srvSumm: XFTPServerSummary, _ statsStartedAt: Date) -> some View { + private func xftpServerView(_ srvSumm: XFTPServerSummary, _ statsStartedAt: Date, _ reserveIconSpace: Bool) -> some View { NavigationLink(tag: srvSumm.id, selection: $selectedXFTPServer) { XFTPServerSummaryView( summary: srvSumm, @@ -269,6 +292,19 @@ struct ServersSummaryView: View { .navigationBarTitleDisplayMode(.large) } label: { HStack { + Group { + if srvSumm.known ?? false { + Image(systemName: "server.rack") + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundColor(.secondary) + } else if reserveIconSpace { + Color.clear + } + } + .frame(width: 20, alignment: .center) + .padding(.trailing, 4) + Text(serverAddress(srvSumm.xftpServer)) .lineLimit(1) if srvSumm.rcvInProgress || srvSumm.sndInProgress || srvSumm.delInProgress { @@ -410,7 +446,10 @@ struct SMPServerSummaryView: View { Text("Server address") } footer: { if let known = summary.known, known { - Text("Server is configured in **Settings** → **Network & servers**.") + HStack { + Image(systemName: "server.rack").font(.caption) + Text("Server is configured in **Settings** → **Network & servers**.") + } } } @@ -420,9 +459,15 @@ struct SMPServerSummaryView: View { reconnectButtonSection() } footer: { if summary.subs != nil { - Text("Connection status is displayed based on Message subscriptions.") + HStack { + Image(systemName: "dot.radiowaves.up.forward") + Text("Connection status is displayed based on Message subscriptions.") + } } else if summary.sessions != nil { - Text("Connection status is displayed based on Transport sessions.") + HStack { + Image(systemName: "dot.radiowaves.up.forward") + Text("Connection status is displayed based on Transport sessions.") + } } } } @@ -593,7 +638,10 @@ struct XFTPServerSummaryView: View { Text("Server address") } footer: { if let known = summary.known, known { - Text("Server is configured in **Settings** → **Network & servers**.") + HStack { + Image(systemName: "server.rack").font(.caption) + Text("Server is configured in **Settings** → **Network & servers**.") + } } }