feat: auth screen with auto-redirect, sync favorites/history with backend
This commit is contained in:
70
app/src/main/java/com/radiola/ui/auth/AuthViewModel.kt
Normal file
70
app/src/main/java/com/radiola/ui/auth/AuthViewModel.kt
Normal file
@@ -0,0 +1,70 @@
|
||||
package com.radiola.ui.auth
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.radiola.domain.usecase.auth.RequestMagicLinkUseCase
|
||||
import com.radiola.domain.usecase.auth.VerifyMagicLinkUseCase
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class AuthViewModel @Inject constructor(
|
||||
private val requestMagicLinkUseCase: RequestMagicLinkUseCase,
|
||||
private val verifyMagicLinkUseCase: VerifyMagicLinkUseCase
|
||||
) : ViewModel() {
|
||||
|
||||
sealed class AuthState {
|
||||
data object Idle : AuthState()
|
||||
data object Loading : AuthState()
|
||||
data object CodeSent : AuthState()
|
||||
data object Success : AuthState()
|
||||
data class Error(val message: String) : AuthState()
|
||||
}
|
||||
|
||||
private val _state = MutableStateFlow<AuthState>(AuthState.Idle)
|
||||
val state: StateFlow<AuthState> = _state
|
||||
|
||||
private val _email = MutableStateFlow("")
|
||||
val email: StateFlow<String> = _email
|
||||
|
||||
fun onEmailChange(value: String) {
|
||||
_email.value = value
|
||||
}
|
||||
|
||||
fun requestCode() {
|
||||
val email = _email.value.trim()
|
||||
if (email.isBlank() || !email.contains("@")) {
|
||||
_state.value = AuthState.Error("Введите корректный email")
|
||||
return
|
||||
}
|
||||
viewModelScope.launch {
|
||||
_state.value = AuthState.Loading
|
||||
requestMagicLinkUseCase(email)
|
||||
.onSuccess { _state.value = AuthState.CodeSent }
|
||||
.onFailure { _state.value = AuthState.Error(it.message ?: "Ошибка отправки") }
|
||||
}
|
||||
}
|
||||
|
||||
fun verifyCode(code: String) {
|
||||
val email = _email.value.trim()
|
||||
if (code.length != 6) {
|
||||
_state.value = AuthState.Error("Код должен содержать 6 символов")
|
||||
return
|
||||
}
|
||||
viewModelScope.launch {
|
||||
_state.value = AuthState.Loading
|
||||
verifyMagicLinkUseCase(email, code)
|
||||
.onSuccess { _state.value = AuthState.Success }
|
||||
.onFailure { _state.value = AuthState.Error(it.message ?: "Неверный код") }
|
||||
}
|
||||
}
|
||||
|
||||
fun dismissError() {
|
||||
if (_state.value is AuthState.Error) {
|
||||
_state.value = AuthState.Idle
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user