Skip to content

Commit

Permalink
[refactor] #7 signup
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook123 committed May 3, 2024
1 parent 55db6f2 commit 2850386
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SignupActivity : AppCompatActivity() {
etSignupId.doAfterTextChanged { viewModel.updateId(it.toString()) }
etSignupPw.doAfterTextChanged { viewModel.updatePw(it.toString()) }
etSignupName.doAfterTextChanged { viewModel.updateName(it.toString()) }
etSignupHobby.doAfterTextChanged { viewModel.updateHobby(it.toString()) }
etSignupHobby.doAfterTextChanged { viewModel.updatePhone(it.toString()) }
}
}

Expand All @@ -50,7 +50,7 @@ class SignupActivity : AppCompatActivity() {
finish()
}

is SignupSideEffect.showSnackbar -> {
is SignupSideEffect.ShowSnackbar -> {
snackBar(binding.root) { sideEffect.message }
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package org.sopt.main.signup

import org.sopt.model.ValidateResult

data class SignupState(
val id: String = "",
val password: String = "",
val name: String = "",
val hobby: String = "",
val phone: String = "",
val passwordValidation: ValidateResult = ValidateResult.EmptyError,
val idValidation: ValidateResult = ValidateResult.EmptyError,
val nameValidation: ValidateResult = ValidateResult.EmptyError,
val phoneValidation: ValidateResult = ValidateResult.EmptyError,
)

sealed interface SignupSideEffect {
data class showSnackbar(val message: String) : SignupSideEffect
data class ShowSnackbar(val message: String) : SignupSideEffect
data object SignupSuccess : SignupSideEffect
}
80 changes: 44 additions & 36 deletions feature/main/src/main/java/org/sopt/main/signup/SignupViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,71 +1,79 @@
package org.sopt.main.signup

import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import org.orbitmvi.orbit.Container
import org.orbitmvi.orbit.ContainerHost
import org.orbitmvi.orbit.annotation.OrbitExperimental
import org.orbitmvi.orbit.syntax.simple.blockingIntent
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.designsystem.R
import org.sopt.domain.repo.AuthRepository
import org.sopt.domain.repo.UserDataRepository
import org.sopt.domain.usecase.ValidatePasswordUseCase
import org.sopt.domain.usecase.ValidatePhoneNumberUseCase
import org.sopt.main.model.UserModel
import org.sopt.main.model.toUser
import org.sopt.model.Member
import org.sopt.model.ValidateResult
import org.sopt.ui.context.ResourceProvider
import org.sopt.ui.orbit.updateState
import javax.inject.Inject

@OptIn(OrbitExperimental::class)
@HiltViewModel
class SignupViewModel @Inject constructor(
private val resourceProvider: ResourceProvider,
private val userDataRepository: UserDataRepository,
private val authRepository: AuthRepository,
private val validatePasswordUseCase: ValidatePasswordUseCase,
private val validatePhoneNumberUseCase: ValidatePhoneNumberUseCase,
) : ContainerHost<SignupState, SignupSideEffect>, ViewModel() {
override val container: Container<SignupState, SignupSideEffect> = container(SignupState())

fun signup() = intent {
when {
state.id.length !in 6..10 -> {
postSideEffect(SignupSideEffect.showSnackbar(resourceProvider.getString(R.string.signup_validid)))
}
val member = Member(
id = state.id,
nickname = state.name,
phone = state.phone
)

state.password.length !in 8..12 -> {
postSideEffect(SignupSideEffect.showSnackbar(resourceProvider.getString(R.string.signup_validpw)))
authRepository.postSignup(member, state.password)
.onSuccess {
if (it.code !in 200..299) {
postSideEffect(SignupSideEffect.ShowSnackbar(it.message))
} else {
postSideEffect(SignupSideEffect.SignupSuccess)
}
}.onFailure {
Log.e("signup", it.message.toString())
}
}

state.name.isBlank() -> {
postSideEffect(SignupSideEffect.showSnackbar(resourceProvider.getString(R.string.signup_validname)))
}
fun updateId(id: String) = blockingIntent {
if (id.isBlank()) reduce { state.copy(id = id, idValidation = ValidateResult.EmptyError) }
else reduce { state.copy(id = id, idValidation = ValidateResult.Success) }
}

state.hobby.isBlank() -> {
postSideEffect(SignupSideEffect.showSnackbar(resourceProvider.getString(R.string.signup_validhobby)))
}
fun updatePw(pw: String) = blockingIntent {
reduce { state.copy(password = pw, passwordValidation = validatePasswordUseCase(pw)) }
}

else -> {
setUserData(
UserModel(
state.id,
state.password,
state.name,
state.hobby
)
)
}
fun updateName(name: String) = blockingIntent {
if (name.isBlank()) reduce {
state.copy(
name = name,
idValidation = ValidateResult.EmptyError
)
}
else reduce { state.copy(name = name, nameValidation = ValidateResult.Success) }
}

private fun setUserData(user: UserModel) = intent {
runCatching { userDataRepository.setUserData(user.toUser()) }
.onSuccess {
postSideEffect(
SignupSideEffect.SignupSuccess
)
}
fun updatePhone(phone: String) = blockingIntent {
reduce { state.copy(phone = phone, phoneValidation = validatePhoneNumberUseCase(phone)) }
}

fun updateId(id: String) = updateState { copy(id = id) }
fun updatePw(pw: String) = updateState { copy(password = pw) }
fun updateName(name: String) = updateState { copy(name = name) }
fun updateHobby(hobby: String) = updateState { copy(hobby = hobby) }
}

0 comments on commit 2850386

Please sign in to comment.