From b01cb4195021d71241b7a2ba189f10fa8a574a59 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 13 Dec 2025 23:40:12 +0000 Subject: [PATCH] iOS: copy bridge URL/host/port --- apps/ios/Sources/Settings/SettingsTab.swift | 59 +++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/apps/ios/Sources/Settings/SettingsTab.swift b/apps/ios/Sources/Settings/SettingsTab.swift index fc6f54b5c..345a445b7 100644 --- a/apps/ios/Sources/Settings/SettingsTab.swift +++ b/apps/ios/Sources/Settings/SettingsTab.swift @@ -55,14 +55,30 @@ struct SettingsTab: View { if let serverName = self.appModel.bridgeServerName { LabeledContent("Server", value: serverName) if let addr = self.appModel.bridgeRemoteAddress { + let parts = Self.parseHostPort(from: addr) + let urlString = Self.httpURLString(host: parts?.host, port: parts?.port, fallback: addr) LabeledContent("Address") { - Text(addr) + Text(urlString) } .contextMenu { Button { - UIPasteboard.general.string = addr + UIPasteboard.general.string = urlString } label: { - Label("Copy", systemImage: "doc.on.doc") + Label("Copy URL", systemImage: "doc.on.doc") + } + + if let parts { + Button { + UIPasteboard.general.string = parts.host + } label: { + Label("Copy Host", systemImage: "doc.on.doc") + } + + Button { + UIPasteboard.general.string = "\(parts.port)" + } label: { + Label("Copy Port", systemImage: "doc.on.doc") + } } } } @@ -287,4 +303,41 @@ struct SettingsTab: View { return en0 ?? fallback } + + private struct HostPort: Equatable { + var host: String + var port: Int + } + + private static func parseHostPort(from address: String) -> HostPort? { + let trimmed = address.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + + if trimmed.hasPrefix("["), + let close = trimmed.firstIndex(of: "]"), + close < trimmed.endIndex + { + let host = String(trimmed[trimmed.index(after: trimmed.startIndex).. String { + if let host, let port { + let needsBrackets = host.contains(":") && !host.hasPrefix("[") && !host.hasSuffix("]") + let hostPart = needsBrackets ? "[\(host)]" : host + return "http://\(hostPart):\(port)" + } + return "http://\(fallback)" + } }