diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginActivity.kt index 32db049..d7e0689 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginActivity.kt @@ -8,7 +8,11 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.sopt.dosopttemplate.R import org.sopt.dosopttemplate.data.datasource.local.DoSoptStorage import org.sopt.dosopttemplate.data.entity.auth.AuthInfo @@ -73,7 +77,7 @@ class LoginActivity : BindingActivity(R.layout.activity_lo } private fun observeLogin() { - loginViewModel.signInResult.observe(this) { uiState -> + loginViewModel.signInState.flowWithLifecycle(lifecycle).onEach { uiState -> when (uiState) { is UiState.Success -> { setAutoLogin(uiState.data) @@ -86,7 +90,7 @@ class LoginActivity : BindingActivity(R.layout.activity_lo else -> {} } - } + }.launchIn(lifecycleScope) } private fun setAutoLogin(signData: AuthInfo) { diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginViewModel.kt index 6988c8b..bdd3aa5 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/LoginViewModel.kt @@ -1,14 +1,15 @@ package org.sopt.dosopttemplate.presentation.auth -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.data.entity.auth.AuthInfo import org.sopt.dosopttemplate.data.repository.auth.AuthRepository import org.sopt.dosopttemplate.util.UiState +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -16,8 +17,8 @@ class LoginViewModel @Inject constructor( private val authRepository: AuthRepository, ) : ViewModel() { - private val _signInResult = MutableLiveData>() - val signInResult: LiveData> = _signInResult + private val _signInState = MutableStateFlow>(UiState.Loading) + val signInState get() = _signInState.asStateFlow() fun signIn(username: String, password: String) { viewModelScope.launch { @@ -25,9 +26,9 @@ class LoginViewModel @Inject constructor( username = username, password = password, ).onSuccess { authInfo -> - _signInResult.value = UiState.Success(authInfo) + _signInState.value = UiState.Success(authInfo) }.onFailure { throwable -> - _signInResult.value = throwable.message?.let { UiState.Failure(it) } + Timber.e(throwable.message) } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpActivity.kt index 6ef9897..52a39ea 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpActivity.kt @@ -6,7 +6,11 @@ import android.view.View.INVISIBLE import android.view.View.VISIBLE import androidx.activity.viewModels import androidx.core.content.ContextCompat +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import org.sopt.dosopttemplate.R import org.sopt.dosopttemplate.data.datasource.local.DoSoptStorage import org.sopt.dosopttemplate.databinding.ActivitySignupBinding @@ -76,7 +80,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ } private fun observeSignUp() { - signUpViewModel.signUpResult.observe(this) { uiState -> + signUpViewModel.signUpState.flowWithLifecycle(lifecycle).onEach { uiState -> when (uiState) { is UiState.Success -> { val intent = Intent(this, LoginActivity::class.java) @@ -91,7 +95,7 @@ class SignUpActivity : BindingActivity(R.layout.activity_ else -> {} } - } + }.launchIn(lifecycleScope) } private fun getSignUpInfo() { diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpViewModel.kt index 8e807b0..4d27479 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/SignUpViewModel.kt @@ -1,16 +1,18 @@ package org.sopt.dosopttemplate.presentation.auth -import androidx.lifecycle.LiveData import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.map import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.data.repository.auth.AuthRepository import org.sopt.dosopttemplate.util.UiState import org.sopt.dosopttemplate.util.extension.addSourceList +import timber.log.Timber import java.util.regex.Pattern import javax.inject.Inject @@ -19,8 +21,8 @@ class SignUpViewModel @Inject constructor( private val authRepository: AuthRepository, ) : ViewModel() { - private val _signUpResult = MutableLiveData>() - val signUpResult: LiveData> = _signUpResult + private val _signUpState = MutableStateFlow>(UiState.Loading) + val signUpState get() = _signUpState.asStateFlow() val id = MutableLiveData("") val pw = MutableLiveData("") @@ -41,10 +43,10 @@ class SignUpViewModel @Inject constructor( username = id.value.toString(), password = pw.value.toString(), nickname = nickname.value.toString() - ).onSuccess { _signUpResult.value = UiState.Success(true) } + ).onSuccess { _signUpState.value = UiState.Success(true) } .onFailure { throwable -> - _signUpResult.value = throwable.message?.let { UiState.Failure(it) } + Timber.e(throwable.message) } } }