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