feat: 手机号 + 验证码登录
This commit is contained in:
65
IosClientKit/Sources/FeatureAuth/AuthViewModel.swift
Normal file
65
IosClientKit/Sources/FeatureAuth/AuthViewModel.swift
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user