Skip to content

Commit

Permalink
[refactor] #7 login refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook123 committed May 3, 2024
1 parent b37109b commit 3de54e3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 48 deletions.
13 changes: 1 addition & 12 deletions feature/main/src/main/java/org/sopt/main/login/LoginContract.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,7 @@ package org.sopt.main.login
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

}
)

sealed interface LoginSideEffect {
data class showSnackbar(val message: String) : LoginSideEffect
Expand Down
54 changes: 22 additions & 32 deletions feature/main/src/main/java/org/sopt/main/login/LoginViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,44 +1,33 @@
package org.sopt.main.login

import android.util.Log
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import org.orbitmvi.orbit.Container
import org.orbitmvi.orbit.ContainerHost
import org.orbitmvi.orbit.syntax.simple.intent
import org.orbitmvi.orbit.syntax.simple.postSideEffect
import org.orbitmvi.orbit.syntax.simple.reduce
import org.orbitmvi.orbit.viewmodel.container
import org.sopt.domain.repo.UserDataRepository
import org.sopt.domain.repo.AuthRepository
import org.sopt.main.login.navigation.LoginRoute
import org.sopt.ui.orbit.updateState
import javax.inject.Inject

@HiltViewModel
class LoginViewModel @Inject constructor(
private val userDataRepository: UserDataRepository,
private val authRepository: AuthRepository,
savedStateHandle: SavedStateHandle,
) : ContainerHost<LoginState, LoginSideEffect>, ViewModel() {
override val container: Container<LoginState, LoginSideEffect> = container(LoginState())

private val isSignupSuccess: Boolean =
savedStateHandle.get<String>(LoginRoute.IS_SIGNUP_SUCESS).toBoolean()

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,
)
if (isSignupSuccess) {
postSideEffect(LoginSideEffect.SignupSuccess)
}
}
}
Expand All @@ -48,20 +37,21 @@ class LoginViewModel @Inject constructor(
}

fun login() = intent {
with(state) {
when {
checkRegister() -> {
postSideEffect(LoginSideEffect.showSnackbar("회원가입 먼저하셈"))
}
matchesUserInfo(state.id, state.password) -> {
userDataRepository.setAutoLogin(true)
}

else -> postSideEffect(LoginSideEffect.showSnackbar("로그인 실패"))
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())
}
}


fun updateId(id: String) = updateState { copy(id = id) }
fun updatePw(pw: String) = updateState { copy(password = pw) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ package org.sopt.main.login.navigation
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import org.sopt.main.login.LoginRoute
import org.sopt.main.login.navigation.LoginRoute.IS_SIGNUP_SUCESS
import org.sopt.main.login.navigation.LoginRoute.loginRoute

fun NavController.navigateLogin() {
navigate(LoginRoute.route) {
fun NavController.navigateLogin(isSignupSuccess: Boolean) {
navigate(loginRoute(isSignupSuccess.toString())) {
popUpTo(this@navigateLogin.graph.startDestinationId) {
inclusive = true
}
Expand All @@ -20,14 +24,23 @@ fun NavGraphBuilder.loginNavGraph(
navigateSignup: () -> Unit = {},
navigateHome: () -> Unit = {},
) {
composable(route = LoginRoute.route) {
composable(
route = loginRoute("{${IS_SIGNUP_SUCESS}}"),
arguments = listOf(
navArgument(IS_SIGNUP_SUCESS) {
type = NavType.StringType
},
),
) {
LoginRoute(
navigateHome = navigateHome,
navigateSignup = navigateSignup
navigateSignup = navigateSignup,
)
}
}

object LoginRoute {
const val route = "login"
const val IS_SIGNUP_SUCESS = "isSignupSuccess"
fun loginRoute(isSignupSuccess: String) = "login/$isSignupSuccess"
}

0 comments on commit 3de54e3

Please sign in to comment.