Skip to content

Commit

Permalink
[refactor] #7 login
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook123 committed May 3, 2024
1 parent 47e6962 commit 55db6f2
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 57 deletions.
18 changes: 14 additions & 4 deletions feature/main/src/main/java/org/sopt/main/login/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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() {
Expand All @@ -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()
}
}

Expand All @@ -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 -> {
Expand Down
17 changes: 1 addition & 16 deletions feature/main/src/main/java/org/sopt/main/login/LoginContract.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down
56 changes: 19 additions & 37 deletions feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<LoginState, LoginSideEffect>, ViewModel() {
override val container: Container<LoginState, LoginSideEffect> = 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) }
}

0 comments on commit 55db6f2

Please sign in to comment.