57 lines
1.9 KiB
Swift
57 lines
1.9 KiB
Swift
//
|
|
// AppState.swift
|
|
// WatchRunner Watch App
|
|
//
|
|
// Created by LittleSheep on 2025/10/29.
|
|
//
|
|
|
|
import SwiftUI
|
|
import Combine
|
|
|
|
// MARK: - App State
|
|
|
|
@MainActor
|
|
class AppState: ObservableObject {
|
|
@Published var token: String? = nil
|
|
@Published var serverUrl: String? = nil
|
|
@Published var isReady = false
|
|
|
|
let networkService = NetworkService()
|
|
private var wcService = WatchConnectivityService()
|
|
private var cancellables = Set<AnyCancellable>()
|
|
private var hasAttemptedConnection = false
|
|
|
|
init() {
|
|
wcService.$token.combineLatest(wcService.$serverUrl, wcService.$isFetched)
|
|
.receive(on: DispatchQueue.main)
|
|
.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)
|
|
}
|
|
|
|
func requestData() {
|
|
wcService.requestDataFromPhone()
|
|
}
|
|
}
|