punchnet-macos/punchnet/Views/Network/NetworkModel.swift
2026-02-26 15:34:58 +08:00

123 lines
2.8 KiB
Swift

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