63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
| //
 | |
| //  AppInfoHeader.swift
 | |
| //  Runner
 | |
| //
 | |
| //  Created by LittleSheep on 2025/10/30.
 | |
| //
 | |
| 
 | |
| import Combine
 | |
| import SwiftUI
 | |
| 
 | |
| struct AppInfoHeaderView : View {
 | |
|     @EnvironmentObject var appState: AppState // Access AppState
 | |
|     @State private var webSocketConnectionState: WebSocketState = .disconnected // New state for WebSocket status
 | |
|     @State private var cancellables = Set<AnyCancellable>() // For managing subscriptions
 | |
| 
 | |
|     var body: some View {
 | |
|         VStack(alignment: .leading) {
 | |
|             HStack(spacing: 12) {
 | |
|                 Image("Logo")
 | |
|                     .resizable()
 | |
|                     .frame(width: 40, height: 40)
 | |
|                 
 | |
|                 VStack(alignment: .leading) {
 | |
|                     Text("Solian").font(.headline)
 | |
|                     Text("for Apple Watch").font(.system(size: 11))
 | |
|                     
 | |
|                     // Display WebSocket connection status
 | |
|                     Text(webSocketStatusMessage)
 | |
|                         .font(.system(size: 10))
 | |
|                         .foregroundColor(.secondary)
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         .onAppear {
 | |
|             setupWebSocketListeners()
 | |
|         }
 | |
|         .onDisappear {
 | |
|             cancellables.forEach { $0.cancel() }
 | |
|             cancellables.removeAll()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private var webSocketStatusMessage: String {
 | |
|         switch webSocketConnectionState {
 | |
|         case .connected: return "Connected"
 | |
|         case .connecting: return "Connecting..."
 | |
|         case .disconnected: return "Disconnected"
 | |
|         case .serverDown: return "Server Down"
 | |
|         case .duplicateDevice: return "Duplicate Device"
 | |
|         case .error(let msg): return "Error: \(msg)"
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private func setupWebSocketListeners() {
 | |
|         appState.networkService.stateStream
 | |
|             .receive(on: DispatchQueue.main)
 | |
|             .sink { state in
 | |
|                 webSocketConnectionState = state
 | |
|             }
 | |
|             .store(in: &cancellables)
 | |
|     }
 | |
| }
 |