Skip to content

Commit

Permalink
Merge pull request #11 from DO-SOPT-ANDROID/feat/#10_week7_basic
Browse files Browse the repository at this point in the history
[Feat/#10] 7주차 필수과제
  • Loading branch information
chanubc committed Jan 3, 2024
2 parents 520b785 + 1be6757 commit dc13bac
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,13 @@ object UserInfo {
nickName = "",
mbti = "",
)

fun updateUserInfo(
id: String = userInfoList.id,
pwd: String = userInfoList.pwd,
nickName: String = userInfoList.nickName,
mbti: String = userInfoList.mbti,
) {
userInfoList = userInfoList.copy(id = id, pwd = pwd, nickName = nickName, mbti = mbti)
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package org.sopt.dosopttemplate.network.login

import retrofit2.Call
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST

interface AuthService {
@POST("api/v1/members/sign-in")
suspend fun login(
suspend fun postLogin(
@Body request: RequestLoginDto,
): Response<ResponseLoginDto>

@POST("api/v1/members")
fun signUp(
suspend fun postSignUp(
@Body request: RequestSignUpDto,
): Call<Unit>
): Response<Unit>
}
31 changes: 16 additions & 15 deletions app/src/main/java/org/sopt/dosopttemplate/ui/login/AuthViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,17 @@ import androidx.lifecycle.LiveData
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.data.user.UserInfo
import org.sopt.dosopttemplate.network.ApiFactory.ServicePool.authService
import org.sopt.dosopttemplate.network.login.RequestLoginDto
import org.sopt.dosopttemplate.network.login.ResponseLoginDto

class AuthViewModel : ViewModel() {
private val _loginResult: MutableLiveData<ResponseLoginDto> = MutableLiveData()
val loginResult: LiveData<ResponseLoginDto>
get() = _loginResult

private val _loginSuccess: MutableLiveData<Boolean> = MutableLiveData()
val loginSuccess: LiveData<Boolean>
get() = _loginSuccess
private val _loginState = MutableStateFlow<LoginState>(LoginState.Loading)
val loginState: StateFlow<LoginState> = _loginState.asStateFlow()

private val _isLoginButtonClicked: MutableLiveData<Boolean> = MutableLiveData(false)
val isLoginButtonClicked: LiveData<Boolean>
Expand All @@ -27,16 +24,20 @@ class AuthViewModel : ViewModel() {
fun login(id: String, password: String) {
viewModelScope.launch {
kotlin.runCatching {
authService.login(RequestLoginDto(id, password))
authService.postLogin(RequestLoginDto(id, password))
}.onSuccess {
if (it.isSuccessful) {
_loginResult.value = it.body()
Log.d("server", _loginResult.value.toString())
UserInfo.userInfoList.nickName = it.body()?.username.toString()
UserInfo.userInfoList.id = it.body()?.id.toString()
_loginSuccess.value = true
val response = it.body()
if (response != null) {
_loginState.value = LoginState.Success(response)
Log.d("server", _loginState.value.toString())
UserInfo.updateUserInfo(
id = response.id.toString(),
nickName = response.nickname.toString(),
)
}
} else {
_loginSuccess.value = false
_loginState.value = LoginState.Error
Log.d("server", it.code().toString())
}
}.onFailure {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.ui.HomeActivity
import org.sopt.dosopttemplate.utils.toast
Expand Down Expand Up @@ -49,12 +51,17 @@ class LoginActivity : AppCompatActivity() {
}

private fun observeLoginResult() {
authViewModel.loginSuccess.observe(this) {
if (it) {
toast("로그인 성공")
startActivity(Intent(this, HomeActivity::class.java))
} else {
toast("로그인 실패")
lifecycleScope.launch {
authViewModel.loginState.collect { loginState ->
when (loginState) {
is LoginState.Success -> {
toast("로그인 성공")
startActivity(Intent(this@LoginActivity, HomeActivity::class.java))
}

is LoginState.Error -> toast("로그인 실패")
is LoginState.Loading -> toast("로그인 중")
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.sopt.dosopttemplate.ui.login

import org.sopt.dosopttemplate.network.login.ResponseLoginDto

sealed class LoginState {
object Loading : LoginState()
data class Success(val data: ResponseLoginDto) : LoginState()
object Error : LoginState()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,15 @@ package org.sopt.dosopttemplate.ui.login
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.inputmethod.InputMethodManager
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.data.login.User
import org.sopt.dosopttemplate.databinding.ActivitySignUpBinding
import org.sopt.dosopttemplate.network.ApiFactory.ServicePool.authService
import org.sopt.dosopttemplate.network.login.RequestSignUpDto
import org.sopt.dosopttemplate.utils.toast
import retrofit2.Call
import retrofit2.Response

class SignUpActivity : AppCompatActivity() {

Expand All @@ -36,35 +33,33 @@ class SignUpActivity : AppCompatActivity() {
binding.lifecycleOwner = this
}

private fun initSignUp() = with(binding) {
btnLogin.setOnClickListener {
private fun initSignUp() {
binding.btnLogin.setOnClickListener {
val userEntity = User(
id = editId.text.toString(),
pwd = editPwd.text.toString(),
nickName = editNickname.text.toString(),
mbti = editMbti.text.toString(),
id = binding.editId.text.toString(),
pwd = binding.editPwd.text.toString(),
nickName = binding.editNickname.text.toString(),
mbti = binding.editMbti.text.toString(),
)
signUpServer(userEntity)
viewModel.signUpServer(userEntity)
observeSignUpState(userEntity)
}
}

private fun signUpServer(userEntity: User) {
authService.signUp(RequestSignUpDto(userEntity.id, userEntity.pwd, userEntity.mbti))
.enqueue(object : retrofit2.Callback<Unit> {
override fun onResponse(call: Call<Unit>, response: Response<Unit>) {
if (response.isSuccessful) {
private fun observeSignUpState(userEntity: User) {
lifecycleScope.launch {
viewModel.signUpState.collect {
when (it) {
is SignUpState.Success -> {
sendUserData(userEntity)
toast(getString(R.string.toast_signUp_compeleted))
} else {
toast(getString(R.string.toast_signUp_fail))
}
}

override fun onFailure(call: Call<Unit>, t: Throwable) {
toast(getString(R.string.toast_sever_error))
Log.e("SignUpActivity", "Error: ${t.message}")
is SignUpState.Error -> toast(getString(R.string.toast_signUp_fail))
is SignUpState.Loading -> toast("회원가입 중")
}
})
}
}
}

private fun sendUserData(userEntity: User) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.sopt.dosopttemplate.ui.login

sealed class SignUpState {
object Loading : SignUpState()
object Success : SignUpState()
object Error : SignUpState()
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
package org.sopt.dosopttemplate.ui.login

import android.util.Log
import androidx.lifecycle.LiveData
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.data.login.User
import org.sopt.dosopttemplate.network.ApiFactory.ServicePool.authService
import org.sopt.dosopttemplate.network.login.RequestSignUpDto

class SignUpViewModel : ViewModel() {
private val _signUpState = MutableStateFlow<SignUpState>(SignUpState.Loading)
val signUpState: StateFlow<SignUpState> = _signUpState.asStateFlow()

private val id = MutableLiveData<String>()
private val password = MutableLiveData<String>()
private val nickname = MutableLiveData<String>()
Expand Down Expand Up @@ -90,4 +102,26 @@ class SignUpViewModel : ViewModel() {
private fun updateBtnValidity() {
_isBtnSelected.value = isIdValid && isPasswordValid && isNickNameValid && isMbtiValid
}

fun signUpServer(userEntity: User) {
viewModelScope.launch {
kotlin.runCatching {
authService.postSignUp(
RequestSignUpDto(
userEntity.id,
userEntity.pwd,
userEntity.nickName,
),
)
}.onSuccess {
if (it.isSuccessful) {
_signUpState.value = SignUpState.Success
} else {
_signUpState.value = SignUpState.Error
}
}.onFailure {
Log.e("SignUpActivity", "Error: ${it.message}")
}
}
}
}

0 comments on commit dc13bac

Please sign in to comment.