This commit is contained in:
anlicheng 2026-03-24 23:14:02 +08:00
parent 6a29b8bc85
commit 7872604857
5 changed files with 102 additions and 47 deletions

View File

@ -31,6 +31,11 @@ class AppContext {
//
var loginCredit: Credit?
//
var isLogined: Bool {
return loginCredit != nil
}
enum Credit {
case token(token: String, session: SDLAPIClient.NetworkSession)
case accountAndPasword(account: String, password: String, session: SDLAPIClient.NetworkSession)
@ -116,6 +121,8 @@ class AppContext {
// 退
func logout() async throws {
try await VPNManager.shared.disableVpn()
self.networkContext = .default()
self.loginCredit = nil
}
}

View File

@ -0,0 +1,68 @@
//
// MainMenuBar.swift
// punchnet
//
// Created by on 2026/3/24.
//
import SwiftUI
struct MainMenuBar: View {
@State private var vpnManager = VPNManager.shared
@Environment(AppContext.self) private var appContext: AppContext
@Environment(\.openWindow) private var openWindow
@Environment(\.dismissWindow) private var dismissWindow
var body: some View {
VStack {
switch self.vpnManager.vpnStatus {
case .connected:
Button(action: {
Task { @MainActor in
try await vpnManager.disableVpn()
}
}, label: {
Text("停止")
})
case .disconnected:
Button(action: {
Task { @MainActor in
await self.startVPN()
}
}, label: {
Text("启动")
})
}
Divider()
// Button("") {
// openWindow(id: appContext.isLoggedIn ? "logined" : "login")
// }
SettingsLink {
Text("设置")
}
.buttonStyle(.plain)
Divider()
Button(action: {
NSApplication.shared.terminate(nil)
}, label: {
Text("退出应用")
})
}
}
private func startVPN() async {
if let options = appContext.vpnOptions {
try? await vpnManager.enableVpn(options: options)
dismissWindow(id: "login")
openWindow(id: "logined")
} else {
openWindow(id: "login")
}
}
}

View File

@ -69,9 +69,7 @@ struct NetworkView: View {
.frame(width: 160)
}
Button {
openWindow(id: "settings")
} label: {
SettingsLink {
Image(systemName: "slider.horizontal.3")
.font(.system(size: 14))
.foregroundColor(.secondary)

View File

@ -28,7 +28,7 @@ struct SettingsAccountView: View {
} else {
//
Button {
self.openMainWindow(id: "main")
self.openMainWindow(id: "login")
} label: {
Text("登录")
.fontWeight(.medium)
@ -116,20 +116,29 @@ extension SettingsAccountView {
struct AccountCreditView: View {
@Environment(AppContext.self) var appContext: AppContext
@Environment(\.openWindow) var openWindow
@Environment(\.dismissWindow) var dismissWindow
let username: String
var body: some View {
AccountRow(icon: "person.fill", title: "当前登录账号", subtitle: username, actions: AnyView(
HStack(spacing: 12) {
Button("修改密码") {
}
.buttonStyle(.link)
// Button("") {
//
// }
// .buttonStyle(.link)
Button("退出登录") {
Task { @MainActor in
try await appContext.logout()
}
self.dismissWindow(id: "logined")
self.dismissWindow(id: "settings")
self.openWindow(id: "login")
}
.buttonStyle(.bordered)
.foregroundColor(.red)
@ -140,6 +149,9 @@ extension SettingsAccountView {
struct TokenCreditView: View {
@Environment(AppContext.self) var appContext: AppContext
@Environment(\.openWindow) var openWindow
@Environment(\.dismissWindow) var dismissWindow
let token: String
var body: some View {
@ -148,10 +160,16 @@ extension SettingsAccountView {
Task { @MainActor in
try await appContext.logout()
}
self.dismissWindow(id: "logined")
self.dismissWindow(id: "settings")
self.openWindow(id: "login")
}
.buttonStyle(.bordered)
.foregroundColor(.red)
))
}
}
}

View File

@ -69,7 +69,7 @@ struct punchnetApp: App {
.windowResizability(.contentSize)
.defaultPosition(.center)
Window("设置", id: "settings") {
Settings {
SettingsView()
.environment(self.appContext)
.frame(width: 750, height: 500)
@ -78,48 +78,12 @@ struct punchnetApp: App {
.defaultPosition(.center)
MenuBarExtra("punchnet", image: "logo_32") {
VStack {
switch self.vpnManager.vpnStatus {
case .connected:
Button(action: {
Task { @MainActor in
try await vpnManager.disableVpn()
}
}, label: {
Text("停止")
})
case .disconnected:
Button(action: {
Task { @MainActor in
await self.startVPN()
}
}, label: {
Text("启动")
})
}
Divider()
Button(action: {
NSApplication.shared.terminate(nil)
}, label: {
Text("退出应用")
})
}
MainMenuBar()
.environment(appContext)
}
.menuBarExtraStyle(.menu)
}
private func startVPN() async {
if let options = appContext.vpnOptions {
try? await vpnManager.enableVpn(options: options)
} else {
openWindow(id: "login")
}
}
}
// APP