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 6def4ea..ec86b61 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 @@ -1,7 +1,6 @@ package org.sopt.dosopttemplate.presentation.auth - import android.content.Context import android.content.Intent import android.os.Bundle @@ -10,6 +9,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import org.sopt.dosopttemplate.databinding.ActivityLoginBinding import org.sopt.dosopttemplate.di.UserSharedPreferences import org.sopt.dosopttemplate.presentation.BnvActivity @@ -17,6 +17,7 @@ import org.sopt.dosopttemplate.server.auth.LoginResp import org.sopt.dosopttemplate.util.showShortSnackBar class LoginActivity : AppCompatActivity() { + private lateinit var binding: ActivityLoginBinding private var inputMethodManager: InputMethodManager? = null private lateinit var loginViewModel: LoginViewModel @@ -42,17 +43,32 @@ class LoginActivity : AppCompatActivity() { val userId = binding.etSignupId.text.toString() val userPw = binding.etSignupPw.text.toString() - loginViewModel.performLogin( - userId, - userPw, - { loginResp -> handleLoginSuccess(loginResp) }, - { showShortSnackBar(binding.root, "로그인 실패") }, - { showShortSnackBar(binding.root, "네트워크 오류") } - ) + loginViewModel.performLogin(userId, userPw) } inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? + + observeLoginResult() + } + + private fun observeLoginResult() { + lifecycleScope.launchWhenStarted { + loginViewModel.loginResult.collect { result -> + when (result) { + is Result.Success -> { + result.data.let { handleLoginSuccess(it) } + } + + is Result.Error -> { + showShortSnackBar(binding.root, "에러 발생: ${result.exception.message}") + } + + else -> {} + } + } + } } + private fun handleLoginSuccess(loginResp: LoginResp) { UserSharedPreferences.setLoggedIn(this, true) UserSharedPreferences.setUserID(this, loginResp.id.toString()) @@ -62,7 +78,6 @@ class LoginActivity : AppCompatActivity() { val toastMessage = "로그인에 성공했어요! USER의 ID는 $userId 입니둥." Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show() - val intent = Intent(this, BnvActivity::class.java) intent.putExtra("ID", userId) intent.putExtra("Nickname", loginResp.nickname) @@ -70,7 +85,15 @@ class LoginActivity : AppCompatActivity() { finish() } + private fun handleEmptyLoginSuccess() { + val toastMessage = "로그인에 성공했어요!" + Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT).show() + val intent = Intent(this, BnvActivity::class.java) + startActivity(intent) + finish() + } + fun hideKeyboard(v: View) { inputMethodManager?.hideSoftInputFromWindow(v.windowToken, 0) } -} +} \ No newline at end of file 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 1f35bcc..65b5526 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 @@ -2,55 +2,31 @@ package org.sopt.dosopttemplate.presentation.auth import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.server.ServicePool import org.sopt.dosopttemplate.server.auth.LoginReq import org.sopt.dosopttemplate.server.auth.LoginResp - class LoginViewModel : ViewModel() { - /* - fun login(id: String, password: String) { - viewModelScope.launch { - try { - val response = authService.login(RequestLoginDto(id, password)) - if (response.isSuccessful) { - loginResult.value = response.body() - loginSuccess.value = true - } else { - loginSuccess.value = false - } - } catch (e: Exception) { - // TODO: 에러 처리 로직 - } - } -}*/ + private val _loginResult = MutableStateFlow>(Result.Idle) + val loginResult = _loginResult.asStateFlow() fun performLogin( userId: String, - userPw: String, - onSuccess: (LoginResp) -> Unit, - onFailure: () -> Unit, - onNetworkError: () -> Unit + userPw: String ) { viewModelScope.launch { try { val loginReq = LoginReq(userId, userPw) - val response = ServicePool.authService.login(loginReq) - if (response.isSuccessful) { - val loginResp = response.body() - if (loginResp != null) { - onSuccess(loginResp) - } else { - onFailure() - } - } else { - onFailure() - } - + _loginResult.value = Result.Success( + ServicePool.authService.login(loginReq).body() + ?: throw Exception("값을 입력해주세요.") + ) } catch (e: Exception) { - onNetworkError() + _loginResult.value = Result.Error(e) } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/Result.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/Result.kt new file mode 100644 index 0000000..939a276 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/Result.kt @@ -0,0 +1,7 @@ +package org.sopt.dosopttemplate.presentation.auth + +sealed class Result { + object Idle : Result() + data class Success(val data: T) : Result() + data class Error(val exception: Exception) : Result() +} \ No newline at end of file