Skip to content

Commit

Permalink
[mod] #102 닉네임 수정 성공한 경우에만 메인 피드로 넘어가도록 state 관찰하기
Browse files Browse the repository at this point in the history
  • Loading branch information
leeeha committed Aug 16, 2023
1 parent dacc435 commit f25175b
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,18 @@ import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
import androidx.activity.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.android.go.sopt.winey.R
import com.android.go.sopt.winey.databinding.ActivityNicknameBinding
import com.android.go.sopt.winey.presentation.main.MainActivity
import com.android.go.sopt.winey.util.binding.BindingActivity
import com.android.go.sopt.winey.util.context.hideKeyboard
import com.android.go.sopt.winey.util.context.snackBar
import com.android.go.sopt.winey.util.view.UiState
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

@AndroidEntryPoint
class NicknameActivity : BindingActivity<ActivityNicknameBinding>(R.layout.activity_nickname) {
Expand All @@ -24,7 +30,23 @@ class NicknameActivity : BindingActivity<ActivityNicknameBinding>(R.layout.activ
initRootLayoutClickListener()
initEditTextWatcher()
initDuplicateCheckButtonClickListener()
initCompleteButtonClickListener()
initPatchNicknameStateObserver()
}

private fun initPatchNicknameStateObserver() {
viewModel.patchNicknameState.flowWithLifecycle(lifecycle)
.onEach { state ->
when (state) {
is UiState.Loading -> preventContinuousButtonClick()
is UiState.Success -> navigateTo<MainActivity>()
is UiState.Failure -> snackBar(binding.root) { state.msg }
is UiState.Empty -> {}
}
}.launchIn(lifecycleScope)
}

private fun preventContinuousButtonClick() {
binding.btnNicknameComplete.isClickable = false
}

private fun initEditTextWatcher() {
Expand All @@ -51,13 +73,6 @@ class NicknameActivity : BindingActivity<ActivityNicknameBinding>(R.layout.activ
}
}

private fun initCompleteButtonClickListener() {
binding.btnNicknameComplete.setOnClickListener {
viewModel.patchNickname()
navigateTo<MainActivity>()
}
}

private fun initRootLayoutClickListener() {
binding.root.setOnClickListener {
hideKeyboard(binding.root)
Expand All @@ -66,7 +81,7 @@ class NicknameActivity : BindingActivity<ActivityNicknameBinding>(R.layout.activ
}

private inline fun <reified T : Activity> navigateTo() {
Intent(this@NicknameActivity, T::class.java).apply {
Intent(this, T::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(this)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.android.go.sopt.winey.data.model.remote.request.RequestPatchNicknameDto
import com.android.go.sopt.winey.domain.repository.AuthRepository
import com.android.go.sopt.winey.util.code.NicknameErrorCode
import com.android.go.sopt.winey.util.code.NicknameErrorCode.CODE_DUPLICATE
import com.android.go.sopt.winey.util.code.NicknameErrorCode.CODE_INVALID_LENGTH
import com.android.go.sopt.winey.util.code.NicknameErrorCode.CODE_SPACE_SPECIAL_CHAR
import com.android.go.sopt.winey.util.code.NicknameErrorCode.CODE_UNCHECKED_DUPLICATION
import com.android.go.sopt.winey.util.view.InputUiState
import com.android.go.sopt.winey.util.view.UiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
Expand Down Expand Up @@ -47,8 +47,6 @@ class NicknameViewModel @Inject constructor(
started = SharingStarted.WhileSubscribed(PRODUCE_STOP_TIMEOUT)
)

private fun validateNickname(state: InputUiState) = state == InputUiState.Success

private val _isTextChanged = MutableStateFlow(false)
val isTextChanged: StateFlow<Boolean> = _isTextChanged.asStateFlow()

Expand All @@ -57,18 +55,27 @@ class NicknameViewModel @Inject constructor(

private var prevCheckResult: Pair<String, Boolean>? = null

private val _patchNicknameState = MutableStateFlow<UiState<Unit>>(UiState.Empty)
val patchNicknameState: StateFlow<UiState<Unit>> = _patchNicknameState.asStateFlow()

private fun validateNickname(state: InputUiState) = state == InputUiState.Success

fun patchNickname() {
viewModelScope.launch {
_patchNicknameState.value = UiState.Loading

authRepository.patchNickname(RequestPatchNicknameDto(nickname))
.onSuccess {
.onSuccess { response ->
Timber.d("SUCCESS PATCH NICKNAME")
_patchNicknameState.value = UiState.Success(response)
}
.onFailure { t ->
if (t is HttpException) {
Timber.e("HTTP FAIL PATCH NICKNAME: ${t.code()} ${t.message}")
return@onFailure
}
Timber.e("FAIL PATCH NICKNAME: ${t.message}")
_patchNicknameState.value = UiState.Failure(t.message.toString())
}
}
}
Expand All @@ -93,7 +100,7 @@ class NicknameViewModel @Inject constructor(

private fun updateDuplicateCheckState(isDuplicated: Boolean) {
_inputUiState.value = if (isDuplicated) {
InputUiState.Failure(NicknameErrorCode.CODE_DUPLICATE)
InputUiState.Failure(CODE_DUPLICATE)
} else {
InputUiState.Success
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/layout/activity_nickname.xml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@
android:layout_marginBottom="14dp"
android:background="@drawable/sel_upload_nickname_btn_color"
android:enabled="@{vm.isValidNickname, default=false}"
android:onClick="@{()->vm.patchNickname()}"
android:insetTop="0dp"
android:insetBottom="0dp"
android:stateListAnimator="@null"
Expand Down

0 comments on commit f25175b

Please sign in to comment.