152 lines
5.0 KiB
Swift
152 lines
5.0 KiB
Swift
//
|
|
// SettingsAccountView.swift
|
|
// punchnet
|
|
//
|
|
// Created by 安礼成 on 2026/1/16.
|
|
//
|
|
import SwiftUI
|
|
|
|
struct SettingsAccountView: View {
|
|
@Environment(AppContext.self) var appContext: AppContext
|
|
@Environment(\.openWindow) var openWindow
|
|
@Environment(\.openURL) var openURL
|
|
|
|
var body: some View {
|
|
ScrollView(.vertical, showsIndicators: false) {
|
|
VStack(alignment: .leading, spacing: 24) {
|
|
// MARK: - 账户部分
|
|
sectionHeader(title: "账户安全", icon: "shield.lefthalf.filled")
|
|
|
|
VStack(spacing: 0) {
|
|
if let loginCredit = appContext.loginCredit {
|
|
switch loginCredit {
|
|
case .token(let token, _):
|
|
TokenCreditView(token: token)
|
|
case .accountAndPasword(let account, _, _):
|
|
AccountCreditView(username: account)
|
|
}
|
|
} else {
|
|
// 蓝色主按钮
|
|
Button {
|
|
self.openWindow(id: "main")
|
|
} label: {
|
|
Text("登录")
|
|
.fontWeight(.medium)
|
|
}
|
|
.buttonStyle(.borderedProminent)
|
|
}
|
|
}
|
|
.background(Color.primary.opacity(0.03))
|
|
.cornerRadius(12)
|
|
.overlay(RoundedRectangle(cornerRadius: 12).stroke(Color.primary.opacity(0.05), lineWidth: 1))
|
|
}
|
|
.frame(maxWidth: 600) // 限制宽度防止在大屏幕上显得太散
|
|
}
|
|
}
|
|
|
|
// 辅助头部组件
|
|
private func sectionHeader(title: String, icon: String) -> some View {
|
|
HStack {
|
|
Image(systemName: icon)
|
|
.foregroundColor(.blue)
|
|
|
|
Text(title)
|
|
.font(.system(size: 16, weight: .bold))
|
|
}
|
|
.padding(.leading, 4)
|
|
}
|
|
}
|
|
|
|
// MARK: - 内部视图扩展
|
|
extension SettingsAccountView {
|
|
|
|
// 统一的条目容器样式
|
|
struct AccountRow: View {
|
|
let icon: String
|
|
let title: String
|
|
let subtitle: String
|
|
var actions: AnyView
|
|
|
|
var body: some View {
|
|
HStack(spacing: 16) {
|
|
// 模拟 Logo
|
|
Circle()
|
|
.fill(Color.blue.gradient)
|
|
.frame(width: 32, height: 32)
|
|
.overlay(
|
|
Image(systemName: icon)
|
|
.foregroundColor(.white)
|
|
.font(.system(size: 14))
|
|
)
|
|
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
Text(title)
|
|
.font(.subheadline)
|
|
.foregroundColor(.secondary)
|
|
|
|
Text(subtitle)
|
|
.font(.system(size: 15, weight: .medium, design: .monospaced))
|
|
.lineLimit(1)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
actions
|
|
}
|
|
.padding(16)
|
|
}
|
|
}
|
|
|
|
struct AccountCreditView: View {
|
|
@Environment(AppContext.self) var appContext: AppContext
|
|
@Environment(\.openWindow) var openWindow
|
|
|
|
let username: String
|
|
|
|
var body: some View {
|
|
AccountRow(icon: "person.fill", title: "当前登录账号", subtitle: username, actions: AnyView(
|
|
HStack(spacing: 12) {
|
|
// Button("修改密码") {
|
|
//
|
|
// }
|
|
// .buttonStyle(.link)
|
|
|
|
Button("退出登录") {
|
|
Task { @MainActor in
|
|
try await appContext.logout()
|
|
}
|
|
self.appContext.appScene = .login(username: username)
|
|
self.openWindow(id: "main")
|
|
}
|
|
.buttonStyle(.bordered)
|
|
.foregroundColor(.red)
|
|
}
|
|
))
|
|
|
|
}
|
|
}
|
|
|
|
struct TokenCreditView: View {
|
|
@Environment(AppContext.self) var appContext: AppContext
|
|
@Environment(\.openWindow) var openWindow
|
|
|
|
let token: String
|
|
|
|
var body: some View {
|
|
AccountRow(icon: "key.horizontal.fill", title: "Token 登录", subtitle: token, actions: AnyView(
|
|
Button("退出登录") {
|
|
Task { @MainActor in
|
|
try await appContext.logout()
|
|
}
|
|
self.appContext.appScene = .login(username: nil)
|
|
self.openWindow(id: "main")
|
|
// 执行关闭当前窗口的操作
|
|
}
|
|
.buttonStyle(.bordered)
|
|
.foregroundColor(.red)
|
|
))
|
|
}
|
|
}
|
|
|
|
}
|