From 55db6f25eee871348a0b8db481010155528c3b0e Mon Sep 17 00:00:00 2001 From: Sangwook123 Date: Fri, 3 May 2024 18:27:45 +0900 Subject: [PATCH] [refactor] #7 login --- .../java/org/sopt/main/login/LoginActivity.kt | 18 ++++-- .../java/org/sopt/main/login/LoginContract.kt | 17 +----- .../org/sopt/main/login/LoginViewModel.kt | 56 +++++++------------ 3 files changed, 34 insertions(+), 57 deletions(-) diff --git a/feature/main/src/main/java/org/sopt/main/login/LoginActivity.kt b/feature/main/src/main/java/org/sopt/main/login/LoginActivity.kt index ff8418b..987af8a 100644 --- a/feature/main/src/main/java/org/sopt/main/login/LoginActivity.kt +++ b/feature/main/src/main/java/org/sopt/main/login/LoginActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.core.widget.doAfterTextChanged import dagger.hilt.android.AndroidEntryPoint import org.orbitmvi.orbit.viewmodel.observe import org.sopt.designsystem.R @@ -26,6 +27,17 @@ class LoginActivity : AppCompatActivity() { initSignupButtonClickListener() initLoginButtonClickListener() collectState() + initValueChangedListener() + } + + private fun initValueChangedListener() { + binding.etLoginId.doAfterTextChanged { + viewModel.updateId(it.toString()) + } + + binding.etLoginPw.doAfterTextChanged { + viewModel.updatePw(it.toString()) + } } private fun initSignupButtonClickListener() { @@ -36,7 +48,7 @@ class LoginActivity : AppCompatActivity() { private fun initLoginButtonClickListener() { binding.btnLoginLogin.setOnClickListener { - viewModel.login(binding.etLoginId.text.toString(), binding.etLoginPw.text.toString()) + viewModel.login() } } @@ -47,9 +59,7 @@ class LoginActivity : AppCompatActivity() { private fun handleSideEffect(sideEffect: LoginSideEffect) { when (sideEffect) { LoginSideEffect.NavigateToSignUp -> { - Intent(this, SignupActivity::class.java).let { - startActivity(it) - } + startActivity(Intent(this, SignupActivity::class.java)) } LoginSideEffect.LoginSuccess -> { diff --git a/feature/main/src/main/java/org/sopt/main/login/LoginContract.kt b/feature/main/src/main/java/org/sopt/main/login/LoginContract.kt index 05c2bae..3caf0b9 100644 --- a/feature/main/src/main/java/org/sopt/main/login/LoginContract.kt +++ b/feature/main/src/main/java/org/sopt/main/login/LoginContract.kt @@ -1,24 +1,9 @@ package org.sopt.main.login -import org.sopt.main.model.UserModel - data class LoginState( val id: String = "", val password: String = "", - val registeredId: String = "", - val registeredPassword: String = "", - val registeredName: String = "", - val registeredHobby: String = "", - val isAutoLogin: Boolean = false, -) { - fun checkRegister() = registeredId.isBlank() || registeredPassword.isBlank() - - fun matchesUserInfo(id: String, password: String) = - registeredId == id && registeredPassword == password - - fun createUser() = UserModel(registeredId, registeredPassword, registeredName, registeredHobby) -} - +) sealed interface LoginSideEffect { data class showSnackbar(val message: String) : LoginSideEffect data object LoginSuccess : LoginSideEffect diff --git a/feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt b/feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt index 9b789db..44649be 100644 --- a/feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt +++ b/feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt @@ -1,5 +1,7 @@ package org.sopt.main.login +import android.util.Log +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -11,58 +13,38 @@ import org.orbitmvi.orbit.syntax.simple.postSideEffect import org.orbitmvi.orbit.syntax.simple.reduce import org.orbitmvi.orbit.viewmodel.container import org.sopt.designsystem.R +import org.sopt.domain.repo.AuthRepository import org.sopt.domain.repo.UserDataRepository import org.sopt.ui.context.ResourceProvider +import org.sopt.ui.orbit.updateState import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( - private val resourceProvider: ResourceProvider, - private val userDataRepository: UserDataRepository, + private val authRepository: AuthRepository, ) : ContainerHost, ViewModel() { override val container: Container = container(LoginState()) - init { - getUserData() - intent { - container.stateFlow.collect { - if (it.isAutoLogin) { - postSideEffect(LoginSideEffect.LoginSuccess) - } - } - } - } - - fun getUserData() = intent { - userDataRepository.getUserData().collect { - reduce { - state.copy( - registeredId = it.id, - registeredPassword = it.pw, - registeredHobby = it.hobby, - registeredName = it.name, - isAutoLogin = it.autoLogin, - ) - } - } - } - fun signup() = intent { postSideEffect(LoginSideEffect.NavigateToSignUp) } - fun login(id: String, password: String) = intent { - with(state) { - when { - checkRegister() -> postSideEffect(LoginSideEffect.showSnackbar(getString(R.string.login_not_registered))) - matchesUserInfo(id, password) -> { - userDataRepository.setAutoLogin(true) - } - - else -> postSideEffect(LoginSideEffect.showSnackbar(getString(R.string.login_login_fail))) + fun login() = intent { + authRepository.postSignin( + id = state.id, + pw = state.password + ).onSuccess { + if (it.code !in 200..299) { + postSideEffect(LoginSideEffect.showSnackbar(it.message)) + } else { + postSideEffect(LoginSideEffect.LoginSuccess) } + }.onFailure { + Log.e("throwable", it.toString()) } } - private fun getString(resId: Int) = resourceProvider.getString(resId) + + fun updateId(id: String) = updateState { copy(id = id) } + fun updatePw(pw: String) = updateState { copy(password = pw) } } \ No newline at end of file