🐛 Fixed stupid app state updated twice

This commit is contained in:
2025-10-30 23:58:05 +08:00
parent 402bb3fe04
commit 3edcdd72af
4 changed files with 42 additions and 23 deletions

View File

@@ -19,22 +19,34 @@ class AppState: ObservableObject {
let networkService = NetworkService()
private var wcService = WatchConnectivityService()
private var cancellables = Set<AnyCancellable>()
private var hasAttemptedConnection = false
init() {
wcService.$token.combineLatest(wcService.$serverUrl)
wcService.$token.combineLatest(wcService.$serverUrl, wcService.$isFetched)
.receive(on: DispatchQueue.main)
.sink { [weak self] token, serverUrl in
self?.token = token
self?.serverUrl = serverUrl
if let token = token, let serverUrl = serverUrl {
self?.isReady = true
// Auto-connect WebSocket here
self?.networkService.connectWebSocket(token: token, serverUrl: serverUrl)
} else {
self?.isReady = false
// Disconnect WebSocket if token or serverUrl become nil
self?.networkService.disconnectWebSocket()
} }
.sink { [weak self] (token: String?, serverUrl: String?, isFetched: Bool?) in
guard let self = self else { return }
self.token = token
self.serverUrl = serverUrl
if let token = token, let serverUrl = serverUrl, !token.isEmpty, !serverUrl.isEmpty {
self.isReady = true
// Only connect once when we have valid credentials and tried fetch from phone
if !self.hasAttemptedConnection && isFetched == true {
self.hasAttemptedConnection = true
print("[AppState] Connecting WebSocket to server: \(serverUrl)")
self.networkService.connectWebSocket(token: token, serverUrl: serverUrl)
}
} else {
self.isReady = false
if self.hasAttemptedConnection {
self.hasAttemptedConnection = false
// Disconnect WebSocket if token or serverUrl become invalid
self.networkService.disconnectWebSocket()
}
}
}
.store(in: &cancellables)
}