diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginActivity.kt index 19b014f..5924803 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginActivity.kt @@ -4,6 +4,8 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.ActivityLoginBinding import org.sopt.dosopttemplate.presentation.auth.signUp.SignUpActivity import org.sopt.dosopttemplate.presentation.main.HomeActivity @@ -31,21 +33,31 @@ class LoginActivity : AppCompatActivity() { } private fun observeLoginResult() { - loginViewModel.loginSuccess.observe(this) { - if (it) { - val userId = loginViewModel.loginResult.value?.id - val userName = loginViewModel.loginResult.value?.username - val userNickname = loginViewModel.loginResult.value?.nickname - binding.root.makeToast("로그인 성공! userId: {$userId}") + lifecycleScope.launch { + loginViewModel.loginState.collect { loginState -> + when (loginState) { + is LoginState.Success -> { + val userId = loginState.data.id + val userName = loginState.data.username + val userNickname = loginState.data.nickname + binding.root.makeToast("로그인 성공! userId: {$userId}") - val intent = Intent(this, HomeActivity::class.java).apply { - putExtra("UserId", userId) - putExtra("UserName", userName) - putExtra("UserNickname", userNickname) + val intent = Intent(this@LoginActivity, HomeActivity::class.java).apply { + putExtra("UserId", userId) + putExtra("UserName", userName) + putExtra("UserNickname", userNickname) + } + startActivity(intent) + } + + is LoginState.Error -> { + binding.root.makeToast("로그인 실패") + } + + is LoginState.Loading -> { + binding.root.makeToast("로그인 중") + } } - startActivity(intent) - } else { - binding.root.makeToast("로그인 실패") } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginState.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginState.kt new file mode 100644 index 0000000..dfb6fd5 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginState.kt @@ -0,0 +1,9 @@ +package org.sopt.dosopttemplate.presentation.auth.login + +import org.sopt.dosopttemplate.server.auth.response.ResponseLoginDto + +sealed class LoginState { + object Loading : LoginState() + data class Success(val data: ResponseLoginDto) : LoginState() + object Error : LoginState() +} diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginViewModel.kt index 3504acf..172853e 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/login/LoginViewModel.kt @@ -1,33 +1,29 @@ package org.sopt.dosopttemplate.presentation.auth.login -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.server.ServicePool.authService import org.sopt.dosopttemplate.server.auth.request.RequestLoginDto import org.sopt.dosopttemplate.server.auth.response.ResponseLoginDto class LoginViewModel : ViewModel() { - private val _loginResult: MutableLiveData = MutableLiveData() - val loginResult: MutableLiveData = _loginResult - - private val _loginSuccess: MutableLiveData = MutableLiveData() - val loginSuccess: MutableLiveData = _loginSuccess + private val _loginState = MutableStateFlow(LoginState.Loading) + val loginState: StateFlow = _loginState.asStateFlow() fun login(id: String, password: String) { viewModelScope.launch { kotlin.runCatching { authService.login(RequestLoginDto(id, password)) }.onSuccess { - if (it.isSuccessful) { - _loginResult.value = it.body() - loginSuccess.value = true - } else { - loginSuccess.value = false + if (it.body() != null) { + _loginState.value = LoginState.Success(it.body()!!) } }.onFailure { - // 에러 처리 로직 + _loginState.value = LoginState.Error } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpActivity.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpActivity.kt index 89030db..bbd6046 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpActivity.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpActivity.kt @@ -6,6 +6,8 @@ import android.text.Editable import android.text.TextWatcher import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch import org.sopt.dosopttemplate.databinding.ActivitySignUpBinding import org.sopt.dosopttemplate.presentation.auth.login.LoginActivity import org.sopt.dosopttemplate.util.makeToast @@ -35,17 +37,27 @@ class SignUpActivity : AppCompatActivity() { } private fun observeSignUpResult() { - signUpViewModel.signUpSuccess.observe(this) { - if (it) { - binding.root.makeToast("회원가입 성공!") - startActivity( - Intent( - this@SignUpActivity, - LoginActivity::class.java - ) - ) - } else { - binding.root.makeToast("회원가입 실패") + lifecycleScope.launch { + signUpViewModel.signUpState.collect { signUpState -> + when (signUpState) { + is SignUpState.Success -> { + binding.root.makeToast("회원가입 성공!") + startActivity( + Intent( + this@SignUpActivity, + LoginActivity::class.java + ) + ) + } + + is SignUpState.Error -> { + binding.root.makeToast("회원가입 실패") + } + + is SignUpState.Loading -> { + binding.root.makeToast("회원가입 중") + } + } } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpState.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpState.kt new file mode 100644 index 0000000..c20f9c3 --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpState.kt @@ -0,0 +1,7 @@ +package org.sopt.dosopttemplate.presentation.auth.signUp + +sealed class SignUpState { + object Loading : SignUpState() + data class Success(val data: Unit) : SignUpState() + object Error : SignUpState() +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpViewModel.kt index 231f5de..fa5a484 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/auth/signUp/SignUpViewModel.kt @@ -1,25 +1,27 @@ package org.sopt.dosopttemplate.presentation.auth.signUp -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.server.ServicePool.authService import org.sopt.dosopttemplate.server.auth.request.RequestSignUpDto import java.util.regex.Pattern class SignUpViewModel : ViewModel() { - private val _signUpSuccess: MutableLiveData = MutableLiveData() - val signUpSuccess: MutableLiveData = _signUpSuccess + private val _signUpState = MutableStateFlow(SignUpState.Loading) + val signUpState: StateFlow = _signUpState.asStateFlow() fun signUp(id: String, name: String, password: String) { viewModelScope.launch { kotlin.runCatching { authService.signUp(RequestSignUpDto(id, name, password)) }.onSuccess { - signUpSuccess.value = it.isSuccessful + _signUpState.value = SignUpState.Success(it.body()!!) }.onFailure { - // 에러 처리 로직 + _signUpState.value = SignUpState.Error } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/HomeFragment.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/HomeFragment.kt index ad94ae4..073ff8d 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/HomeFragment.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/HomeFragment.kt @@ -7,6 +7,8 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.launch import org.sopt.dosopttemplate.data.adaptor.UserAdaptor import org.sopt.dosopttemplate.databinding.FragmentHomeBinding import org.sopt.dosopttemplate.util.makeToast @@ -49,16 +51,21 @@ class HomeFragment : Fragment() { private fun getUserList() { userViewModel.getUserList(2) - userViewModel.userSuccess.observe(viewLifecycleOwner) { - if (it) { - val userList = userViewModel.userResult.value?.data - if (userList != null) { - Log.e("서버 통신", "성공") - - userAdapter.setUserList(userList) + lifecycleScope.launch { + userViewModel.userState.collect { userState -> + when (userState) { + is UserState.Success -> { + val userList = userState.data.data + userAdapter.setUserList(userList) + binding.root.makeToast("유저 서버 통신 성공") + } + is UserState.Error -> { + binding.root.makeToast("유저 받아오기 실패") + } + is UserState.Loading -> { + binding.root.makeToast("유저 받아오는 중") + } } - } else { - binding.root.makeToast("유저 받아오기 실패") } } } diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserState.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserState.kt new file mode 100644 index 0000000..2f6181c --- /dev/null +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserState.kt @@ -0,0 +1,9 @@ +package org.sopt.dosopttemplate.presentation.main.home + +import org.sopt.dosopttemplate.server.auth.response.ResponseUserListDto + +sealed class UserState { + object Loading : UserState() + data class Success(val data: ResponseUserListDto) : UserState() + object Error : UserState() +} \ No newline at end of file diff --git a/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserViewModel.kt b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserViewModel.kt index bb98f3d..7458f41 100644 --- a/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserViewModel.kt +++ b/app/src/main/java/org/sopt/dosopttemplate/presentation/main/home/UserViewModel.kt @@ -1,32 +1,27 @@ package org.sopt.dosopttemplate.presentation.main.home -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.sopt.dosopttemplate.server.ServicePool.userService -import org.sopt.dosopttemplate.server.auth.response.ResponseUserListDto class UserViewModel : ViewModel() { - private val _userResult: MutableLiveData = MutableLiveData() - val userResult: MutableLiveData = _userResult - - private val _userSuccess: MutableLiveData = MutableLiveData() - val userSuccess: MutableLiveData = _userSuccess + private val _userState = MutableStateFlow(UserState.Loading) + val userState: StateFlow = _userState.asStateFlow() fun getUserList(page: Int) { viewModelScope.launch { kotlin.runCatching { userService.getUserList(page) }.onSuccess { - if (it.isSuccessful) { - userResult.value = it.body() - userSuccess.value = true - } else { - userSuccess.value = false + if (it.body() != null) { + _userState.value = UserState.Success(it.body()!!) } }.onFailure { - // 에러 처리 로직 + _userState.value = UserState.Error } } }