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 6654aa8..f65aac4 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 @@ -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 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 c01cd1b..90c3653 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,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, ViewModel() { override val container: Container = container(LoginState()) + private val isSignupSuccess: Boolean = + savedStateHandle.get(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) } } } @@ -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) } } \ No newline at end of file diff --git a/feature/main/src/main/java/org/sopt/main/login/navigation/LoginNavigation.kt b/feature/main/src/main/java/org/sopt/main/login/navigation/LoginNavigation.kt index 38fa2b3..4858974 100644 --- a/feature/main/src/main/java/org/sopt/main/login/navigation/LoginNavigation.kt +++ b/feature/main/src/main/java/org/sopt/main/login/navigation/LoginNavigation.kt @@ -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 } @@ -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" } \ No newline at end of file