conversations-classic-ios/ConversationsClassic/View/Screens/Create/AddAccountScreen.swift

123 lines
4.2 KiB
Swift
Raw Normal View History

2024-06-19 15:15:27 +00:00
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
2024-07-22 12:02:33 +00:00
@State private var jidStr: String = "nartest1@conversations.im"
@State private var pass: String = "nartest12345"
// @State private var jidStr: String = "test1@test.anal.company"
// @State private var pass: String = "12345"
2024-06-19 15:15:27 +00:00
#else
@State private var jidStr: String = ""
@State private var pass: String = ""
#endif
public var body: some View {
ZStack {
// background
2024-07-04 08:21:12 +00:00
Color.Material.Background.light
2024-06-19 15:15:27 +00:00
.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)
2024-07-04 08:21:12 +00:00
.foregroundColor(.Material.Text.main)
2024-06-19 15:15:27 +00:00
.fixedSize(horizontal: true, vertical: false)
Text(L10n.Login.subtitle)
.font(.body2)
2024-07-04 08:21:12 +00:00
.foregroundColor(.Material.Text.sub)
2024-06-19 15:15:27 +00:00
.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)")
2024-07-04 08:21:12 +00:00
.foregroundColor(.Material.Elements.active)
2024-06-19 15:15:27 +00:00
.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)
}
}