feat: 手机号 + 验证码登录

This commit is contained in:
AndyChen1024
2026-09-15 14:35:52 +08:00
parent 7f6cbb3190
commit affe326e90
2 changed files with 158 additions and 3 deletions

View File

@@ -0,0 +1,65 @@
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<Void, Never>?
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
}
}
}
}