import SwiftUI // ProfileView is now replaced by SettingsView in MainTabView. // This file is kept for legacy support (ChangePasswordView is here). struct ProfileView: View { @EnvironmentObject var authManager: AuthManager @State private var showChangePassword = false var body: some View { SettingsView() } } struct ChangePasswordView: View { @Binding var isPresented: Bool @EnvironmentObject var authManager: AuthManager @State private var oldPassword = "" @State private var newPassword = "" @State private var confirm = "" @State private var isLoading = false @State private var errorMessage = "" @State private var success = false var body: some View { ZStack { Color(hex: "06060f").ignoresSafeArea() VStack(spacing: 16) { RoundedRectangle(cornerRadius: 3).fill(Color.white.opacity(0.2)).frame(width: 40, height: 4).padding(.top, 12) Text("Смена пароля").font(.title3.bold()).foregroundColor(.white).padding(.top, 4) if success { VStack(spacing: 12) { Text("✅").font(.system(size: 50)) Text("Пароль изменён!").font(.title2.bold()).foregroundColor(.white) }.padding(.top, 40) Button("Закрыть") { isPresented = false }.foregroundColor(Color(hex: "0D9488")) } else { VStack(spacing: 12) { SecureField("Текущий пароль", text: $oldPassword) .padding().background(Color.white.opacity(0.08)).cornerRadius(12).foregroundColor(.white) SecureField("Новый пароль", text: $newPassword) .padding().background(Color.white.opacity(0.08)).cornerRadius(12).foregroundColor(.white) SecureField("Подтвердите пароль", text: $confirm) .padding().background(Color.white.opacity(0.08)).cornerRadius(12).foregroundColor(.white) if !errorMessage.isEmpty { Text(errorMessage).foregroundColor(.red).font(.caption) } Button(action: change) { if isLoading { ProgressView().tint(.black) } else { Text("Сменить").font(.headline).foregroundColor(.black) } } .frame(maxWidth: .infinity).padding() .background(Color(hex: "0D9488")).cornerRadius(12) .disabled(oldPassword.isEmpty || newPassword.isEmpty || isLoading) } Button("Отмена") { isPresented = false } .foregroundColor(Color(hex: "8888aa")).padding(.top, 4) } Spacer() }.padding() } } func change() { guard newPassword == confirm else { errorMessage = "Пароли не совпадают"; return } guard newPassword.count >= 8 else { errorMessage = "Минимум 8 символов"; return } isLoading = true Task { var req = URLRequest(url: URL(string: "https://api.digital-home.site/auth/password")!) req.httpMethod = "PUT" req.setValue("application/json", forHTTPHeaderField: "Content-Type") req.setValue("Bearer \(authManager.token)", forHTTPHeaderField: "Authorization") req.httpBody = try? JSONEncoder().encode(["old_password": oldPassword, "new_password": newPassword]) let (_, response) = (try? await URLSession.shared.data(for: req)) ?? (Data(), nil) await MainActor.run { if (response as? HTTPURLResponse)?.statusCode == 200 { success = true } else { errorMessage = "Неверный текущий пароль" } isLoading = false } } } }