aboutsummaryrefslogtreecommitdiff
path: root/Hotline/macOS/ServerView.swift
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-02-02 23:19:57 +0100
committerRuben Beltran del Rio <git@r.bdr.sh>2025-02-02 23:19:57 +0100
commitc676230cbc7da1c2c4d5540f89da32e9228deffd (patch)
treeb47f940282ee552b2608d847a9ce5e06b5749f29 /Hotline/macOS/ServerView.swift
parent77b3ac3c051fc4e8fa126cd21e261be28f4aad1a (diff)
Add autoconnect + reconnect logic
Diffstat (limited to 'Hotline/macOS/ServerView.swift')
-rw-r--r--Hotline/macOS/ServerView.swift40
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
+ }
}
}