import Combine import Martin import SwiftUI struct AddAccountScreen: View { @EnvironmentObject var store: AppStore enum Field { case userJid case password } @FocusState private var focus: Field? @State private var errorMsg: String = "" @State private var isShowingAlert = false @State private var isShowingLoader = false #if DEBUG @State private var jidStr: String = "test1@test.anal.company" @State private var pass: String = "12345" #else @State private var jidStr: String = "" @State private var pass: String = "" #endif public var body: some View { ZStack { // background Color.Main.backgroundLight .ignoresSafeArea() // content VStack(spacing: 32) { // icon Image.logo .resizable() .aspectRatio(contentMode: .fit) .frame(width: 120, height: 120) // texts VStack(spacing: 10) { Text(L10n.Login.title) .font(.head1l) .foregroundColor(.Material.tortoiseDark500) .fixedSize(horizontal: true, vertical: false) Text(L10n.Login.subtitle) .font(.body2) .foregroundColor(.Material.tortoiseDark300) .multilineTextAlignment(.center) .fixedSize(horizontal: false, vertical: true) } VStack(spacing: 16) { UniversalInputCollection.TextField( prompt: L10n.Login.Hint.jid, text: $jidStr, focus: $focus, fieldType: .userJid, contentType: .emailAddress, keyboardType: .emailAddress, submitLabel: .next, action: { focus = .password } ) UniversalInputCollection.SecureField( prompt: L10n.Login.Hint.password, text: $pass, focus: $focus, fieldType: .password, submitLabel: .go, action: { focus = nil } ) Button { isShowingLoader = true store.dispatch(.accountsAction(.tryAddAccountWithCredentials(login: jidStr, password: pass))) } label: { Text(L10n.Login.btn) } .buttonStyle(PrimaryButtonStyle()) .disabled(!loginInputValid) Button { store.dispatch(.startAction(.goTo(.welcomeScreen))) store.dispatch(.changeFlow(.start)) } label: { Text("\(Image(systemName: "chevron.left")) \(L10n.Global.back)") .foregroundColor(.Material.tortoiseDark300) .font(.body2) } } } .padding(.horizontal, 32) } .loadingIndicator(isShowingLoader) .alert(isPresented: $isShowingAlert) { Alert( title: Text(L10n.Global.Error.title), message: Text(errorMsg), dismissButton: .default(Text(L10n.Global.ok)) { store.dispatch(.accountsAction(.addAccountError(jid: jidStr, reason: nil))) } ) } .onChange(of: store.state.accountsState.addAccountError) { err in if let err { isShowingLoader = false isShowingAlert = true errorMsg = err } } } private var loginInputValid: Bool { !jidStr.isEmpty && !pass.isEmpty && UniversalInputCollection.Validators.isEmail(jidStr) } }