115 lines
3.3 KiB
Swift
115 lines
3.3 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
final class AuthViewModel {
|
|
var email = ""
|
|
var password = ""
|
|
var confirmPassword = ""
|
|
var username = ""
|
|
var confirmationCode = ""
|
|
|
|
var isLoading = false
|
|
var errorMessage: String?
|
|
var showConfirmation = false
|
|
var registrationMessage: String?
|
|
|
|
var serverHost = Constants.defaultHost
|
|
var serverPort = String(Constants.defaultPort)
|
|
var useTLS = false
|
|
|
|
enum AuthMode {
|
|
case login, register, pairing
|
|
}
|
|
var mode: AuthMode = .login
|
|
|
|
func login(appState: AppState) async {
|
|
guard !email.isEmpty, !password.isEmpty else {
|
|
errorMessage = "Email and password are required"
|
|
return
|
|
}
|
|
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
do {
|
|
let port = UInt16(serverPort) ?? Constants.defaultPort
|
|
try await appState.chatClient.connect(host: serverHost, port: port, useTLS: useTLS)
|
|
} catch {
|
|
isLoading = false
|
|
errorMessage = "Connection failed: \(error.localizedDescription)"
|
|
return
|
|
}
|
|
|
|
let (success, message) = await appState.chatClient.login(email: email, password: password)
|
|
isLoading = false
|
|
|
|
if success {
|
|
appState.email = email
|
|
appState.isLoggedIn = true
|
|
appState.connectionStatus = .connected
|
|
if let userId = await appState.chatClient.userId {
|
|
appState.currentUser = User(id: userId, username: await appState.chatClient.username, email: email)
|
|
}
|
|
} else {
|
|
errorMessage = message
|
|
}
|
|
}
|
|
|
|
func register(appState: AppState) async {
|
|
guard !email.isEmpty, !password.isEmpty, !username.isEmpty else {
|
|
errorMessage = "All fields are required"
|
|
return
|
|
}
|
|
guard password == confirmPassword else {
|
|
errorMessage = "Passwords don't match"
|
|
return
|
|
}
|
|
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
do {
|
|
let port = UInt16(serverPort) ?? Constants.defaultPort
|
|
try await appState.chatClient.connect(host: serverHost, port: port, useTLS: useTLS)
|
|
} catch {
|
|
isLoading = false
|
|
errorMessage = "Connection failed: \(error.localizedDescription)"
|
|
return
|
|
}
|
|
|
|
let (success, message) = await appState.chatClient.register(username: username, password: password, email: email)
|
|
isLoading = false
|
|
|
|
if success {
|
|
registrationMessage = message
|
|
showConfirmation = true
|
|
} else {
|
|
errorMessage = message
|
|
}
|
|
}
|
|
|
|
func confirmRegistration(appState: AppState) async {
|
|
guard !confirmationCode.isEmpty else {
|
|
errorMessage = "Enter the confirmation code"
|
|
return
|
|
}
|
|
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
let (success, message) = await appState.chatClient.confirmRegistration(
|
|
email: email, username: username, code: confirmationCode
|
|
)
|
|
isLoading = false
|
|
|
|
if success {
|
|
registrationMessage = message
|
|
// Auto-login after registration
|
|
await login(appState: appState)
|
|
} else {
|
|
errorMessage = message
|
|
}
|
|
}
|
|
}
|