another.im-ios/ConversationsClassic/View/Entering/LoginScreen.swift

126 lines
3.9 KiB
Swift
Raw Normal View History

2024-06-19 15:15:27 +00:00
import Combine
import Martin
import SwiftUI
2024-08-11 00:28:01 +00:00
struct LoginScreen: View {
2024-08-11 15:04:42 +00:00
@Environment(\.router) var router
2024-08-11 00:28:01 +00:00
@EnvironmentObject var clientsStore: ClientsStore
2024-06-19 15:15:27 +00:00
enum Field {
case userJid
case password
}
@FocusState private var focus: Field?
2024-08-11 00:28:01 +00:00
2024-06-19 15:15:27 +00:00
#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 {
2024-08-11 00:28:01 +00:00
Task {
await tryLogin()
}
2024-06-19 15:15:27 +00:00
} label: {
Text(L10n.Login.btn)
}
.buttonStyle(PrimaryButtonStyle())
.disabled(!loginInputValid)
Button {
2024-08-11 15:04:42 +00:00
router.dismissScreen()
2024-06-19 15:15:27 +00:00
} 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)
}
}
private var loginInputValid: Bool {
!jidStr.isEmpty && !pass.isEmpty && UniversalInputCollection.Validators.isEmail(jidStr)
}
2024-08-11 00:28:01 +00:00
private func tryLogin() async {
2024-08-11 15:47:54 +00:00
router.showModal {
LoadingScreen()
}
2024-08-11 00:28:01 +00:00
2024-08-11 20:33:04 +00:00
defer {
2024-08-11 15:47:54 +00:00
router.dismissModal()
2024-08-11 20:33:04 +00:00
}
2024-08-11 00:28:01 +00:00
2024-08-11 20:33:04 +00:00
do {
try await clientsStore.tryLogin(jidStr, pass)
} catch {
2024-08-11 15:47:54 +00:00
router.showAlert(
.alert,
title: L10n.Global.Error.title,
subtitle: L10n.Login.error
) {
Button(L10n.Global.ok, role: .cancel) {}
}
2024-08-11 00:28:01 +00:00
}
}
2024-06-19 15:15:27 +00:00
}