diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AllServersView.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AllServersView.swift new file mode 100644 index 0000000000..5662415732 --- /dev/null +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AllServersView.swift @@ -0,0 +1,87 @@ +// +// AllServersView.swift +// SimpleX (iOS) +// +// Created by spaced4ndy on 30.10.2024. +// Copyright © 2024 SimpleX Chat. All rights reserved. +// + +import SwiftUI +import SimpleXChat + +struct AllServersView: View { + @EnvironmentObject var theme: AppTheme + @State private var serverOperators: [ServerOperator] = [] + + var body: some View { + VStack { + List { + operatorsSection() + + Section { + NavigationLink { + ProtocolServersView(serverProtocol: .smp) + .navigationTitle("SMP servers") + .modifier(ThemedBackground(grouped: true)) + } label: { + Text("Message servers") + } + + NavigationLink { + ProtocolServersView(serverProtocol: .xftp) + .navigationTitle("XFTP servers") + .modifier(ThemedBackground(grouped: true)) + } label: { + Text("Media & file servers") + } + } header: { + Text("Other servers") + .foregroundColor(theme.colors.secondary) + } + } + } + .onAppear { + serverOperators = ChatModel.shared.serverOperators + } + } + + @ViewBuilder private func operatorsSection() -> some View { + let servers = [ServerCfg.sampleData.preset, ServerCfg.sampleData.untested] + Section { + ForEach($serverOperators) { srvOperator in + serverOperatorView(srvOperator, servers) + } + } header: { + Text("Operators") + .foregroundColor(theme.colors.secondary) + } + } + + @ViewBuilder private func serverOperatorView(_ serverOperator: Binding, _ servers: [ServerCfg]) -> some View { + let srvOperator = serverOperator.wrappedValue + NavigationLink() { + OperatorView( + serverProtocol: .smp, + serverOperator: serverOperator, + serverOperatorToEdit: srvOperator, + useOperator: srvOperator.enabled, + currServers: servers + ) + .navigationBarTitle("\(srvOperator.name) servers") + .modifier(ThemedBackground(grouped: true)) + .navigationBarTitleDisplayMode(.large) + } label: { + HStack { + Image(srvOperator.info.logo) + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + Text(srvOperator.name) + } + } + } +} + +#Preview { + AllServersView() +} diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift index 155a3956be..d9e177b933 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift @@ -28,19 +28,11 @@ struct NetworkAndServers: View { List { Section { NavigationLink { - ProtocolServersView(serverProtocol: .smp) - .navigationTitle("Your SMP servers") + AllServersView() + .navigationTitle("Servers") .modifier(ThemedBackground(grouped: true)) } label: { - Text("Message servers") - } - - NavigationLink { - ProtocolServersView(serverProtocol: .xftp) - .navigationTitle("Your XFTP servers") - .modifier(ThemedBackground(grouped: true)) - } label: { - Text("Media & file servers") + Text("Servers") } NavigationLink { diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift index 3f9ab252b7..9ebab9de53 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/ProtocolServersView.swift @@ -17,7 +17,6 @@ struct ProtocolServersView: View { @EnvironmentObject var theme: AppTheme @Environment(\.editMode) private var editMode let serverProtocol: ServerProtocol - @State private var serverOperators: [ServerOperator] = [] @State private var currServers: [ServerCfg] = [] @State private var presetServers: [ServerCfg] = [] @State private var configuredServers: [ServerCfg] = [] @@ -55,8 +54,6 @@ struct ProtocolServersView: View { private func protocolServersView() -> some View { List { - operatorsSection() - if !configuredServers.isEmpty { Section { ForEach($configuredServers) { srv in @@ -158,7 +155,6 @@ struct ProtocolServersView: View { } } .onAppear { - serverOperators = ChatModel.shared.serverOperators // this condition is needed to prevent re-setting the servers when exiting single server view if justOpened { do { @@ -179,42 +175,6 @@ struct ProtocolServersView: View { } } - @ViewBuilder private func operatorsSection() -> some View { - let servers = [ServerCfg.sampleData.preset, ServerCfg.sampleData.untested] - Section { - ForEach($serverOperators) { srvOperator in - serverOperatorView(srvOperator, servers) - } - } header: { - Text("Operators") - .foregroundColor(theme.colors.secondary) - } - } - - @ViewBuilder private func serverOperatorView(_ serverOperator: Binding, _ servers: [ServerCfg]) -> some View { - let srvOperator = serverOperator.wrappedValue - NavigationLink() { - OperatorView( - serverProtocol: .smp, - serverOperator: serverOperator, - serverOperatorToEdit: srvOperator, - useOperator: srvOperator.enabled, - currServers: servers - ) - .navigationBarTitle("\(srvOperator.name) servers") - .modifier(ThemedBackground(grouped: true)) - .navigationBarTitleDisplayMode(.large) - } label: { - HStack { - Image(srvOperator.info.logo) - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - Text(srvOperator.name) - } - } - } - private func partitionServers(_ servers: [ServerCfg]) { configuredServers = servers.filter { $0.preset || $0.enabled } otherServers = servers.filter { !($0.preset || $0.enabled) } diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 4c56b00fcf..9da64e8a4e 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -144,6 +144,7 @@ 5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; }; 640417CD2B29B8C200CCB412 /* NewChatMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */; }; 640417CE2B29B8C200CCB412 /* NewChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CC2B29B8C200CCB412 /* NewChatView.swift */; }; + 6407435D2CD2497800158442 /* AllServersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407435C2CD2497800158442 /* AllServersView.swift */; }; 6407BA83295DA85D0082BA18 /* CIInvalidJSONView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */; }; 6419EC562AB8BC8B004A607A /* ContextInvitingContactMemberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */; }; 6419EC582AB97507004A607A /* CIMemberCreatedContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */; }; @@ -488,6 +489,7 @@ 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ZoomableScrollView.swift; path = Shared/Views/ZoomableScrollView.swift; sourceTree = SOURCE_ROOT; }; 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatMenuButton.swift; sourceTree = ""; }; 640417CC2B29B8C200CCB412 /* NewChatView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatView.swift; sourceTree = ""; }; + 6407435C2CD2497800158442 /* AllServersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllServersView.swift; sourceTree = ""; }; 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIInvalidJSONView.swift; sourceTree = ""; }; 6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextInvitingContactMemberView.swift; sourceTree = ""; }; 6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIMemberCreatedContactView.swift; sourceTree = ""; }; @@ -1061,6 +1063,7 @@ 5C93293029239BED0090FFF9 /* ProtocolServerView.swift */, 5C93292E29239A170090FFF9 /* ProtocolServersView.swift */, 643B3B4D2CCFD6400083A2CF /* OperatorView.swift */, + 6407435C2CD2497800158442 /* AllServersView.swift */, 5C9C2DA6289957AE00CC63B1 /* AdvancedNetworkSettings.swift */, 5C9C2DA82899DA6F00CC63B1 /* NetworkAndServers.swift */, ); @@ -1491,6 +1494,7 @@ 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */, 6448BBB628FA9D56000D2AB9 /* GroupLinkView.swift in Sources */, 8C9BC2652C240D5200875A27 /* ThemeModeEditor.swift in Sources */, + 6407435D2CD2497800158442 /* AllServersView.swift in Sources */, 5CB346E92869E8BA001FD2EF /* PushEnvironment.swift in Sources */, 5C55A91F283AD0E400C4E99E /* CallManager.swift in Sources */, 5CFA59D12864782E00863A68 /* ChatArchiveView.swift in Sources */,