diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 3c7e5da589..2f2c2934de 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -487,6 +487,11 @@ func setUserProtoServers(_ serverProtocol: ServerProtocol, servers: [ServerCfg]) try await sendCommandOkResp(.apiSetUserProtoServers(userId: userId, serverProtocol: serverProtocol, servers: servers)) } +func addKnownProtoServer(server: String) async throws { + let userId = try currentUserId("addKnownProtoServer") + try await sendCommandOkResp(.apiAddKnownProtoServer(userId: userId, server: server)) +} + func testProtoServer(server: String) async throws -> Result<(), ProtocolTestFailure> { let userId = try currentUserId("testProtoServer") let r = await chatSendCmd(.apiTestProtoServer(userId: userId, server: server)) diff --git a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift index a6a353c068..d70bc2380a 100644 --- a/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift +++ b/apps/ios/Shared/Views/ChatList/ServersSummaryView.swift @@ -385,9 +385,9 @@ struct SMPServerSummaryView: View { .textSelection(.enabled) if let known = summary.known, !known { Button { - // TODO + addKnownServer() } label: { - Text("TODO Add as known") + Text("Add as known") } } } header: { @@ -497,6 +497,21 @@ struct SMPServerSummaryView: View { indentedInfoRow("errors", "\(stats._connSubErrs)") } } + + func addKnownServer() { + Task { + do { + try await addKnownProtoServer(server: summary.smpServer) + await MainActor.run { + // TODO disable button, etc. + } + } catch let error { + await MainActor.run { + alert = errorAddingServerAlert(error) + } + } + } + } } private func indentedInfoRow(_ title: LocalizedStringKey, _ value: String) -> some View { @@ -509,9 +524,20 @@ private func indentedInfoRow(_ title: LocalizedStringKey, _ value: String) -> so } } +private func errorAddingServerAlert(_ error: Error) -> SomeAlert { + SomeAlert( + alert: mkAlert( + title: "Error adding server", + message: "Make sure server address is in correct format (\(responseError(error)))." + ), + id: "error saving server" + ) +} + struct XFTPServerSummaryView: View { var summary: XFTPServerSummary var statsStartedAt: Date + @State private var alert: SomeAlert? var body: some View { List { @@ -520,9 +546,9 @@ struct XFTPServerSummaryView: View { .textSelection(.enabled) if let known = summary.known, !known { Button { - // TODO + addKnownServer() } label: { - Text("TODO Add as known") + Text("Add as known") } } } header: { @@ -543,6 +569,7 @@ struct XFTPServerSummaryView: View { statsSection(stats) } } + .alert(item: $alert) { $0.alert } } private func sessionsSection(_ sess: ServerSessions) -> some View { @@ -580,6 +607,21 @@ struct XFTPServerSummaryView: View { indentedInfoRow("errors", "\(stats._deleteErrs)") } } + + func addKnownServer() { + Task { + do { + try await addKnownProtoServer(server: summary.xftpServer) + await MainActor.run { + // TODO disable button, etc. + } + } catch let error { + await MainActor.run { + alert = errorAddingServerAlert(error) + } + } + } + } } #Preview { diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index 9dacedb31b..6998b36249 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -71,6 +71,7 @@ public enum ChatCommand { case apiSendMemberContactInvitation(contactId: Int64, msg: MsgContent) case apiGetUserProtoServers(userId: Int64, serverProtocol: ServerProtocol) case apiSetUserProtoServers(userId: Int64, serverProtocol: ServerProtocol, servers: [ServerCfg]) + case apiAddKnownProtoServer(userId: Int64, server: String) case apiTestProtoServer(userId: Int64, server: String) case apiSetChatItemTTL(userId: Int64, seconds: Int64?) case apiGetChatItemTTL(userId: Int64) @@ -224,6 +225,7 @@ public enum ChatCommand { case let .apiSendMemberContactInvitation(contactId, mc): return "/_invite member contact @\(contactId) \(mc.cmdString)" case let .apiGetUserProtoServers(userId, serverProtocol): return "/_servers \(userId) \(serverProtocol)" case let .apiSetUserProtoServers(userId, serverProtocol, servers): return "/_servers \(userId) \(serverProtocol) \(protoServersStr(servers))" + case let .apiAddKnownProtoServer(userId, server): return "/_known server \(userId) \(server)" case let .apiTestProtoServer(userId, server): return "/_server test \(userId) \(server)" case let .apiSetChatItemTTL(userId, seconds): return "/_ttl \(userId) \(chatItemTTLStr(seconds: seconds))" case let .apiGetChatItemTTL(userId): return "/_ttl \(userId)" @@ -377,6 +379,7 @@ public enum ChatCommand { case .apiSendMemberContactInvitation: return "apiSendMemberContactInvitation" case .apiGetUserProtoServers: return "apiGetUserProtoServers" case .apiSetUserProtoServers: return "apiSetUserProtoServers" + case .apiAddKnownProtoServer: return "apiAddKnownProtoServer" case .apiTestProtoServer: return "apiTestProtoServer" case .apiSetChatItemTTL: return "apiSetChatItemTTL" case .apiGetChatItemTTL: return "apiGetChatItemTTL"