From c676230cbc7da1c2c4d5540f89da32e9228deffd Mon Sep 17 00:00:00 2001 From: Ruben Beltran del Rio Date: Sun, 2 Feb 2025 23:19:57 +0100 Subject: Add autoconnect + reconnect logic --- Hotline/macOS/ServerView.swift | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'Hotline/macOS/ServerView.swift') diff --git a/Hotline/macOS/ServerView.swift b/Hotline/macOS/ServerView.swift index e9f4a96..1e53e49 100644 --- a/Hotline/macOS/ServerView.swift +++ b/Hotline/macOS/ServerView.swift @@ -143,6 +143,8 @@ struct ServerView: View { @Environment(\.scenePhase) private var scenePhase @Environment(\.modelContext) private var modelContext + @State private var reconnectTimer: Task? + @State private var shouldReconnect: Bool = false @State private var model: Hotline = Hotline(trackerClient: HotlineTrackerClient(), client: HotlineClient()) @State private var state: ServerState = ServerState(selection: .chat) @State private var agreementShown: Bool = false @@ -151,6 +153,7 @@ struct ServerView: View { @State private var connectPassword: String = "" @State private var connectNameSheetPresented: Bool = false @State private var connectName: String = "" + @State private var autoconnect: Bool = false @Binding var server: Server @@ -227,6 +230,16 @@ struct ServerView: View { .onDisappear { model.disconnect() } + .onChange(of: model.status) { + if model.status == .loggedIn { + reconnectTimer?.cancel() + shouldReconnect = server.autoconnect + } + if model.status == .disconnected && shouldReconnect { + shouldReconnect = false + startReconnectTimer() + } + } .alert(model.errorMessage ?? "Server Error", isPresented: $model.errorDisplayed) { Button("OK") {} } @@ -248,6 +261,15 @@ struct ServerView: View { .focusedSceneValue(\.activeServerState, state) } + private func startReconnectTimer() { + reconnectTimer = Task { + while !Task.isCancelled { + connectToServer() + try? await Task.sleep(for: .seconds(5)) + } + } + } + var connectForm: some View { VStack(alignment: .center) { GroupBox { @@ -297,7 +319,7 @@ struct ServerView: View { Button("Connect") { Task { - await connectToServer() + connectToServer() } } @@ -335,6 +357,7 @@ struct ServerView: View { TextField("Bookmark Name", text: $connectName) .textFieldStyle(.roundedBorder) .controlSize(.large) + Toggle("Connect on Startup", isOn: $autoconnect) } .frame(width: 250) .padding() @@ -353,19 +376,24 @@ struct ServerView: View { connectNameSheetPresented = false connectName = "" Task.detached { - let (host, port) = Server.parseServerAddressAndPort(connectAddress) - let login: String? = connectLogin.isEmpty ? nil : connectLogin - let password: String? = connectPassword.isEmpty ? nil : connectPassword + let (host, port) = await Server.parseServerAddressAndPort(connectAddress) + let login: String? = await connectLogin.isEmpty ? nil : connectLogin + let password: String? = await connectPassword.isEmpty ? nil : connectPassword if !host.isEmpty { - let newBookmark = Bookmark(type: .server, name: name, address: host, port: port, login: login, password: password) - Bookmark.add(newBookmark, context: modelContext) + let newBookmark = await Bookmark(type: .server, name: name, address: host, port: port, login: login, password: password, autoconnect: autoconnect) + await MainActor.run { + Bookmark.add(newBookmark, context: modelContext) + } } } } } } } + .onAppear { + autoconnect = false + } } } -- cgit