diff options
| author | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-02-02 23:19:57 +0100 |
|---|---|---|
| committer | Ruben Beltran del Rio <git@r.bdr.sh> | 2025-02-02 23:19:57 +0100 |
| commit | c676230cbc7da1c2c4d5540f89da32e9228deffd (patch) | |
| tree | b47f940282ee552b2608d847a9ce5e06b5749f29 /Hotline/macOS/ServerView.swift | |
| parent | 77b3ac3c051fc4e8fa126cd21e261be28f4aad1a (diff) | |
Add autoconnect + reconnect logic
Diffstat (limited to 'Hotline/macOS/ServerView.swift')
| -rw-r--r-- | Hotline/macOS/ServerView.swift | 40 |
1 files changed, 34 insertions, 6 deletions
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<Void, Never>? + @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 + } } } |