修改逻辑

This commit is contained in:
anlicheng 2026-03-03 14:46:14 +08:00
parent 38ed560122
commit 5e40f5b7a7
7 changed files with 50 additions and 137 deletions

View File

@ -92,7 +92,6 @@ class VPNManager: ObservableObject {
return manager return manager
} }
deinit { deinit {
NotificationCenter.default.removeObserver(self) NotificationCenter.default.removeObserver(self)
} }

View File

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

View File

@ -93,28 +93,6 @@ struct NodeDetail: Codable {
@Observable @Observable
class NetworkModel { 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 selectedNode: Node?
var networkContext: NetworkContext = .default() var networkContext: NetworkContext = .default()
@ -138,8 +116,6 @@ class NetworkModel {
] ]
self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self)
self.connectState = .connected
self.isOn = true
} }
} }

View File

@ -7,11 +7,21 @@
import SwiftUI import SwiftUI
//
enum ConnectState {
case waitAuth
case connected
case disconnected
}
struct NetworkView: View { struct NetworkView: View {
@Environment(UserContext.self) var userContext: UserContext @Environment(UserContext.self) var userContext: UserContext
@Environment(\.openWindow) private var openWindow @Environment(\.openWindow) private var openWindow
@State private var networkModel = NetworkModel() @State private var networkModel = NetworkModel()
@State private var showMode: ShowMode = .resource @State private var showMode: ShowMode = .resource
//
@State private var connectState: ConnectState = .disconnected
@State private var isOn: Bool = false
// //
enum ShowMode { enum ShowMode {
@ -31,7 +41,7 @@ struct NetworkView: View {
} }
HStack { HStack {
Toggle("", isOn: $networkModel.isOn) Toggle("", isOn: $isOn)
.toggleStyle(SwitchToggleStyle(tint: .green)) .toggleStyle(SwitchToggleStyle(tint: .green))
.disabled(true) .disabled(true)
@ -42,7 +52,7 @@ struct NetworkView: View {
} }
.frame(width: 320) .frame(width: 320)
if self.networkModel.connectState == .connected { if self.connectState == .connected {
// //
HStack { HStack {
Button { Button {
@ -62,7 +72,7 @@ struct NetworkView: View {
} }
Group { Group {
switch self.networkModel.connectState { switch self.connectState {
case .waitAuth: case .waitAuth:
NetworkWaitAuthView(networkModel: self.networkModel) NetworkWaitAuthView(networkModel: self.networkModel)
case .connected: case .connected:
@ -83,8 +93,18 @@ struct NetworkView: View {
} }
.padding(.top, 10) .padding(.top, 10)
.padding(.leading, 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 { .toolbar {
if self.networkModel.connectState == .connected { if self.connectState == .connected {
ToolbarItem(placement: .primaryAction) { ToolbarItem(placement: .primaryAction) {
Button { Button {
openWindow(id: "settings") openWindow(id: "settings")

View File

@ -8,16 +8,14 @@
import SwiftUI import SwiftUI
struct RootView: View { struct RootView: View {
@State private var userContext = UserContext() @Environment(UserContext.self) var userContext
var body: some View { var body: some View {
Group { Group {
if userContext.isLogined { if userContext.isLogined {
NetworkView() NetworkView()
.environment(userContext)
} else { } else {
LoginView() LoginView()
.environment(userContext)
} }
} }
} }

View File

@ -9,6 +9,7 @@ import SwiftUI
struct SettingsAccountView: View { struct SettingsAccountView: View {
@State var state: SettingsState = SettingsState() @State var state: SettingsState = SettingsState()
@Environment(UserContext.self) var userContext: UserContext
var body: some View { var body: some View {
@ -16,11 +17,14 @@ struct SettingsAccountView: View {
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text("账户") Text("账户")
AccountCreditView() if let loginCredit = userContext.loginCredit {
AccountCreditView() switch loginCredit {
TokenCreditView() case .token(let token):
AccountCreditView() TokenCreditView(token: token)
TokenCreditView() case .accountAndPasword(let account, let password):
AccountCreditView(username: account)
}
}
Text("网络") Text("网络")
@ -68,13 +72,15 @@ extension SettingsAccountView {
// //
struct AccountCreditView: View { struct AccountCreditView: View {
let username: String
var body: some View { var body: some View {
HStack { HStack {
Image("logo") Image("logo")
.resizable() .resizable()
.frame(width: 20, height: 20) .frame(width: 20, height: 20)
Text("13012345678") Text(username)
Spacer() Spacer()
@ -85,7 +91,9 @@ extension SettingsAccountView {
} }
Button { Button {
Task {
try await VPNManager.shared.disableVpn()
}
} label: { } label: {
Text("退出登陆") Text("退出登陆")
} }
@ -97,6 +105,7 @@ extension SettingsAccountView {
// Token // Token
struct TokenCreditView: View { struct TokenCreditView: View {
let token: String
var body: some View { var body: some View {
HStack { HStack {
@ -104,12 +113,14 @@ extension SettingsAccountView {
.resizable() .resizable()
.frame(width: 20, height: 20) .frame(width: 20, height: 20)
Text("key_001") Text(token)
Spacer() Spacer()
Button { Button {
Task {
try await VPNManager.shared.disableVpn()
}
} label: { } label: {
Text("退出登陆") Text("退出登陆")
} }
@ -119,13 +130,8 @@ extension SettingsAccountView {
} }
} }
} }
#Preview { #Preview {
SettingsAccountView() SettingsAccountView()
} }

View File

@ -37,6 +37,7 @@ struct punchnetApp: App {
private var noticeServer: UDPNoticeCenterServer private var noticeServer: UDPNoticeCenterServer
@State private var appContext: AppContext @State private var appContext: AppContext
@State private var userContext = UserContext()
init() { init() {
self.noticeServer = UDPNoticeCenterServer() self.noticeServer = UDPNoticeCenterServer()
@ -70,6 +71,7 @@ struct punchnetApp: App {
//.toolbar(.hidden) //.toolbar(.hidden)
.navigationTitle("") .navigationTitle("")
.environment(self.appContext) .environment(self.appContext)
.environment(self.userContext)
} }
.commands { .commands {
CommandGroup(replacing: .appInfo) { CommandGroup(replacing: .appInfo) {
@ -85,6 +87,7 @@ struct punchnetApp: App {
Window("设置", id: "settings") { Window("设置", id: "settings") {
SettingsView() SettingsView()
.environment(self.userContext)
} }
.defaultSize(width: 800, height: 500) .defaultSize(width: 800, height: 500)