import SwiftUI struct AuthView: View { enum Field { case email case password } @ObservedObject var viewModel = AuthVM() @State private var login: String = "" @State private var password: String = "" @State private var showProgress: Bool = false @State private var alert: AlertMessage? = nil @FocusState private var focus: Field? var body: some View { ZStack { VStack(alignment: .center, spacing: 16) { Spacer() #if os(iOS) TextField("Login", text: $login) .focused($focus, equals: .email) .textContentType(.emailAddress) .keyboardType(.emailAddress) #else TextField("Login", text: $login) .focused($focus, equals: .email) #endif SecureField("Password", text: $password) .focused($focus, equals: .password) Button("Login") { Task.init { do { self.focus = nil self.showProgress = true try await self.viewModel.login(user: self.login, password: self.password) self.showProgress = false } catch { self.showProgress = false self.alert = .error(error: error) } } } .alert(item: $alert, content: Alert.init) Spacer() } .buttonStyle(.bordered) .controlSize(.large) .textFieldStyle(.roundedBorder) .padding(20) if self.showProgress { ACProgressView() } } } } struct AuthView_Previews: PreviewProvider { static var previews: some View { Group { AuthView() .previewDevice("iPhone 8") AuthView() .preferredColorScheme(.dark) .previewDevice("iPhone 8") } } }