| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- import SwiftUI
- /// Modal Sheet allowing logged-in users to update their profile (nickname, email, phone).
- struct EditProfileModalView: View {
- @Environment(\.dismiss) private var dismiss
- @ObservedObject var authManager: AuthManager = .shared
-
- @State private var usernameInput: String = ""
- @State private var emailInput: String = ""
- @State private var phoneInput: String = ""
- @State private var errorMessage: String?
- @State private var successToast: String?
-
- var body: some View {
- ZStack {
- Color.spaceBlack.ignoresSafeArea()
-
- VStack(spacing: 20) {
- // Header
- HStack {
- Text("编辑个人资料")
- .font(.system(size: 18, weight: .bold))
- .foregroundStyle(Color.primary)
- Spacer()
- Button {
- dismiss()
- } label: {
- Image(systemName: "xmark.circle.fill")
- .font(.system(size: 22))
- .foregroundStyle(Color.secondary.opacity(0.6))
- }
- }
- .padding(.horizontal, 20)
- .padding(.top, 20)
-
- VStack(spacing: 14) {
- inputSection(label: "用户昵称", icon: "person", text: $usernameInput, placeholder: "请输入新的用户昵称")
- inputSection(label: "电子邮箱", icon: "envelope", text: $emailInput, placeholder: "绑定/修改电子邮箱")
- inputSection(label: "手机号码", icon: "phone", text: $phoneInput, placeholder: "绑定/修改手机号码")
-
- if let error = errorMessage {
- Text(error)
- .font(.system(size: 12))
- .foregroundStyle(Color.recordingRed)
- .frame(maxWidth: .infinity, alignment: .leading)
- }
-
- if let toast = successToast {
- Text(toast)
- .font(.system(size: 12))
- .foregroundStyle(Color.green)
- .frame(maxWidth: .infinity, alignment: .leading)
- }
- }
- .padding(.horizontal, 20)
- .padding(.top, 10)
-
- Spacer()
-
- Button {
- handleSave()
- } label: {
- if authManager.isProcessing {
- ProgressView()
- .tint(Color.spaceBlack)
- } else {
- Text("保存修改")
- .font(.system(size: 15, weight: .semibold))
- .foregroundStyle(Color.spaceBlack)
- }
- }
- .frame(maxWidth: .infinity)
- .padding(.vertical, 14)
- .background(Color.primary)
- .cornerRadius(8)
- .padding(.horizontal, 20)
- .padding(.bottom, 24)
- .disabled(authManager.isProcessing)
- }
- }
- .onAppear {
- if let user = authManager.currentUser {
- usernameInput = user.username
- emailInput = user.email ?? ""
- phoneInput = user.phoneNumber ?? ""
- }
- }
- }
-
- private func inputSection(label: String, icon: String, text: Binding<String>, placeholder: String) -> some View {
- VStack(alignment: .leading, spacing: 6) {
- Text(label)
- .font(.system(size: 12))
- .foregroundStyle(Color.secondary)
-
- HStack(spacing: 12) {
- Image(systemName: icon)
- .font(.system(size: 14))
- .foregroundStyle(Color.secondary)
- .frame(width: 20)
-
- TextField(placeholder, text: text)
- .font(.system(size: 14))
- .autocapitalization(.none)
- .disableAutocorrection(true)
- }
- .padding(.horizontal, 14)
- .padding(.vertical, 12)
- .background(Color.cardBackground.opacity(0.3))
- .businessBorder(cornerRadius: 8)
- }
- }
-
- private func handleSave() {
- errorMessage = nil
- successToast = nil
-
- authManager.updateProfile(
- username: usernameInput,
- email: emailInput,
- phoneNumber: phoneInput,
- avatarURL: nil
- ) { success, err in
- if success {
- successToast = "个人资料更新成功!"
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
- dismiss()
- }
- } else {
- errorMessage = err ?? "保存修改失败"
- }
- }
- }
- }
|