import CoreDomain import Foundation import Observation @MainActor @Observable public final class AuthViewModel { public var isSendingCode = false public var countdownSeconds = 0 public var isSubmitting = false public var errorMessage: String? public var didLogin = false private let sessionUseCase: SessionUseCase private var countdownTask: Task? public init(sessionUseCase: SessionUseCase) { self.sessionUseCase = sessionUseCase } public func requestSmsCode(phone: String) { guard !isSendingCode, countdownSeconds == 0 else { return } isSendingCode = true errorMessage = nil Task { [weak self] in guard let self else { return } do { try await self.sessionUseCase.requestSmsCode(phone: phone) self.startCountdown() } catch { self.errorMessage = (error as? LocalizedError)?.errorDescription ?? error.localizedDescription } self.isSendingCode = false } } public func login(phone: String, code: String) { guard !isSubmitting else { return } isSubmitting = true errorMessage = nil Task { [weak self] in guard let self else { return } do { try await self.sessionUseCase.login(phone: phone, code: code) self.didLogin = true } catch { self.errorMessage = (error as? LocalizedError)?.errorDescription ?? error.localizedDescription } self.isSubmitting = false } } private func startCountdown() { countdownTask?.cancel() countdownSeconds = 60 countdownTask = Task { [weak self] in guard let self else { return } while self.countdownSeconds > 0 { try? await Task.sleep(for: .seconds(1)) guard !Task.isCancelled else { return } self.countdownSeconds -= 1 } } } }