diff --git a/punchnet/Core/VPNManager.swift b/punchnet/Core/VPNManager.swift index ec8ec80..9c11fcc 100644 --- a/punchnet/Core/VPNManager.swift +++ b/punchnet/Core/VPNManager.swift @@ -92,7 +92,6 @@ class VPNManager: ObservableObject { return manager } - deinit { NotificationCenter.default.removeObserver(self) } diff --git a/punchnet/Views/AbortView.swift b/punchnet/Views/AbortView.swift deleted file mode 100644 index e552c5b..0000000 --- a/punchnet/Views/AbortView.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// AbortView.swift -// sdlan -// -// Created by 安礼成 on 2024/6/5. -// - -import Foundation -import SwiftUI - -struct AbortView: View { - struct AlertShow: Identifiable { - enum ShowContent { - case error(String) - case upgrade(String, String) - } - - var id: String - var content: ShowContent - } - - @State private var alertShow: AlertShow? - - var body: some View { - VStack { - Image("logo") - - Text("sdlan") - - Text("Version1.1") - - Button { -// Task { -// guard let response = try? await SDLAPI.checkVersion(clientId: "test", version: 1, channel: "macos") else { -// DispatchQueue.main.async { -// self.alertShow = AlertShow(id: "network_error", content: .error("Network Error")) -// } -// return -// } -// -// if let result = response.result { -// if result.upgrade_type == 0 { -// DispatchQueue.main.async { -// self.alertShow = AlertShow(id: "upgrade_0", content: .upgrade(result.upgrade_prompt, "")) -// } -// } else if result.upgrade_type == 1 { -// DispatchQueue.main.async { -// self.alertShow = AlertShow(id: "upgrade_1", content: .upgrade(result.upgrade_prompt, result.upgrade_address)) -// } -// } else if result.upgrade_type == 2 { -// DispatchQueue.main.async { -// self.alertShow = AlertShow(id: "upgrade_1", content: .upgrade(result.upgrade_prompt, result.upgrade_address)) -// } -// } -// } else if let error = response.error { -// DispatchQueue.main.async { -// self.alertShow = AlertShow(id: "response_error", content: .error(error.message)) -// } -// } -// } - - } label: { - Text("版本检测") - .font(.system(size: 16, weight: .regular)) - .foregroundColor(.white) - .cornerRadius(5.0) - } - .frame(width: 138, height: 33) - .buttonStyle(PlainButtonStyle()) - .background(Color(red: 74 / 255, green: 207 / 255, blue: 154 / 255)) - .cornerRadius(5.0) - - } - .alert(item: $alertShow) { show in - switch show.content { - case .error(let errorMessage): - Alert(title: Text("错误提示"), message: Text(errorMessage)) - case .upgrade(let prompt, let address): - Alert(title: Text("版本升级"), message: Text(prompt), primaryButton: .default(Text("升级版本"), action: { - if let url = URL(string: address) { - // schema: "macappstore://apps.apple.com/app/idYOUR_APP_ID" - NSWorkspace.shared.open(url) - } - }), secondaryButton: .cancel()) - } - } - } - -} diff --git a/punchnet/Views/Network/NetworkModel.swift b/punchnet/Views/Network/NetworkModel.swift index bb84f34..0efca45 100644 --- a/punchnet/Views/Network/NetworkModel.swift +++ b/punchnet/Views/Network/NetworkModel.swift @@ -93,28 +93,6 @@ struct NodeDetail: Codable { @Observable class NetworkModel { - - // 连接状态 - enum ConnectState { - case waitAuth - case connected - case disconnected - } - - // 状态管理 - var connectState: ConnectState = .disconnected - - // 网络连接开关 - var isOn: Bool = false { - didSet { - if isOn { - self.connectState = .connected - } else { - self.connectState = .disconnected - } - } - } - // 当前选中的设备 var selectedNode: Node? var networkContext: NetworkContext = .default() @@ -138,8 +116,6 @@ class NetworkModel { ] self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) - self.connectState = .connected - self.isOn = true } } diff --git a/punchnet/Views/Network/NetworkView.swift b/punchnet/Views/Network/NetworkView.swift index 3fde4d4..96c79b4 100644 --- a/punchnet/Views/Network/NetworkView.swift +++ b/punchnet/Views/Network/NetworkView.swift @@ -7,11 +7,21 @@ import SwiftUI +// 连接状态 +enum ConnectState { + case waitAuth + case connected + case disconnected +} + struct NetworkView: View { @Environment(UserContext.self) var userContext: UserContext @Environment(\.openWindow) private var openWindow @State private var networkModel = NetworkModel() @State private var showMode: ShowMode = .resource + // 状态管理 + @State private var connectState: ConnectState = .disconnected + @State private var isOn: Bool = false // 展示状态 enum ShowMode { @@ -31,7 +41,7 @@ struct NetworkView: View { } HStack { - Toggle("", isOn: $networkModel.isOn) + Toggle("", isOn: $isOn) .toggleStyle(SwitchToggleStyle(tint: .green)) .disabled(true) @@ -42,7 +52,7 @@ struct NetworkView: View { } .frame(width: 320) - if self.networkModel.connectState == .connected { + if self.connectState == .connected { // 显示设备和资源选项 HStack { Button { @@ -62,7 +72,7 @@ struct NetworkView: View { } Group { - switch self.networkModel.connectState { + switch self.connectState { case .waitAuth: NetworkWaitAuthView(networkModel: self.networkModel) case .connected: @@ -83,8 +93,18 @@ struct NetworkView: View { } .padding(.top, 10) .padding(.leading, 10) + .onChange(of: VPNManager.shared.vpnStatus) { _, newState in + switch newState { + case .connected: + self.connectState = .connected + self.isOn = true + case .disconnected: + self.connectState = .disconnected + self.isOn = false + } + } .toolbar { - if self.networkModel.connectState == .connected { + if self.connectState == .connected { ToolbarItem(placement: .primaryAction) { Button { openWindow(id: "settings") diff --git a/punchnet/Views/RootView.swift b/punchnet/Views/RootView.swift index fb2020e..882448f 100644 --- a/punchnet/Views/RootView.swift +++ b/punchnet/Views/RootView.swift @@ -8,16 +8,14 @@ import SwiftUI struct RootView: View { - @State private var userContext = UserContext() - + @Environment(UserContext.self) var userContext + var body: some View { Group { if userContext.isLogined { NetworkView() - .environment(userContext) } else { LoginView() - .environment(userContext) } } } diff --git a/punchnet/Views/Settings/SettingsAccountView.swift b/punchnet/Views/Settings/SettingsAccountView.swift index f390194..02f1b13 100644 --- a/punchnet/Views/Settings/SettingsAccountView.swift +++ b/punchnet/Views/Settings/SettingsAccountView.swift @@ -9,6 +9,7 @@ import SwiftUI struct SettingsAccountView: View { @State var state: SettingsState = SettingsState() + @Environment(UserContext.self) var userContext: UserContext var body: some View { @@ -16,11 +17,14 @@ struct SettingsAccountView: View { VStack(alignment: .leading) { Text("账户") - AccountCreditView() - AccountCreditView() - TokenCreditView() - AccountCreditView() - TokenCreditView() + if let loginCredit = userContext.loginCredit { + switch loginCredit { + case .token(let token): + TokenCreditView(token: token) + case .accountAndPasword(let account, let password): + AccountCreditView(username: account) + } + } Text("网络") @@ -68,13 +72,15 @@ extension SettingsAccountView { // 基于账号密码的登陆 struct AccountCreditView: View { + let username: String + var body: some View { HStack { Image("logo") .resizable() .frame(width: 20, height: 20) - Text("13012345678") + Text(username) Spacer() @@ -85,18 +91,21 @@ extension SettingsAccountView { } Button { - + Task { + try await VPNManager.shared.disableVpn() + } } label: { Text("退出登陆") } } .frame(width: 400) } - + } // 基于Token的登陆 struct TokenCreditView: View { + let token: String var body: some View { HStack { @@ -104,12 +113,14 @@ extension SettingsAccountView { .resizable() .frame(width: 20, height: 20) - Text("key_001") + Text(token) Spacer() Button { - + Task { + try await VPNManager.shared.disableVpn() + } } label: { Text("退出登陆") } @@ -119,13 +130,8 @@ extension SettingsAccountView { } } - - - } - - #Preview { SettingsAccountView() } diff --git a/punchnet/punchnetApp.swift b/punchnet/punchnetApp.swift index e59a49d..f395210 100644 --- a/punchnet/punchnetApp.swift +++ b/punchnet/punchnetApp.swift @@ -37,6 +37,7 @@ struct punchnetApp: App { private var noticeServer: UDPNoticeCenterServer @State private var appContext: AppContext + @State private var userContext = UserContext() init() { self.noticeServer = UDPNoticeCenterServer() @@ -70,6 +71,7 @@ struct punchnetApp: App { //.toolbar(.hidden) .navigationTitle("") .environment(self.appContext) + .environment(self.userContext) } .commands { CommandGroup(replacing: .appInfo) { @@ -85,6 +87,7 @@ struct punchnetApp: App { Window("设置", id: "settings") { SettingsView() + .environment(self.userContext) } .defaultSize(width: 800, height: 500)