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()
 | 
						|
    }
 | 
						|
}
 |