// // NetworkState.swift // punchnet // // Created by 安礼成 on 2026/1/16. // import Foundation import Observation @Observable class NetworkModel { // 连接状态 enum ConnectState { case waitAuth case connected case disconnected } // 资源列表 struct Resource: Codable { var id: Int var name: String var url: String var connectionStatus: String enum CodingKeys: String, CodingKey { case id case name case url case connectionStatus = "connection_status" } } // 设备列表 struct Node: Codable { var id: Int var name: String var ip: String var system: String var connectStatus: Int func hash(into hasher: inout Hasher) { hasher.combine(id) } enum CodingKeys: String, CodingKey { case id case name case ip case system case connectStatus = "connect_status" } static func == (lhs: Self, rhs: Self) -> Bool { return lhs.id == rhs.id } } struct NetworkContext: Codable { let ip: String let resourceList: [Resource] let nodeList: [Node] enum CodingKeys: String, CodingKey { case ip case resourceList = "resource_list" case nodeList = "node_list" } } // 状态管理 var connectState: ConnectState = .disconnected // 网络连接开关 var isOn: Bool = false { didSet { if isOn { self.connectState = .connected } else { self.connectState = .disconnected } } } // 当前选中的设备 var selectedNode: Node? var ip: String = "" var resourceList: [Resource] = [] var nodeList: [Node] = [] init() { } func changeSelectedNode(nodeId: Int?) { if let nodeId { if let node = self.nodeList.first(where: { $0.id == nodeId}) { self.selectedNode = node } } } @MainActor func connect(networkSession: UserContext.NetworkSession) async throws { let params: [String: Any] = [ "client_id": SystemConfig.getClientId(), "access_token": networkSession.accessToken ] let networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) self.ip = networkContext.ip self.resourceList = networkContext.resourceList self.nodeList = networkContext.nodeList self.connectState = .connected self.isOn = true } }