Skip to content

Commit

Permalink
[refactor] #7 signup refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Sangwook123 committed May 3, 2024
1 parent 3de54e3 commit 3a1f81a
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ data class UserModel(
val pw: String = "",
val name: String = "",
val hobby: String = "",
val phone: String = "",
)

fun UserModel.toUser() = User(
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
}
17 changes: 8 additions & 9 deletions feature/main/src/main/java/org/sopt/main/signup/SignupScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import org.sopt.designsystem.ui.theme.NOWSOPTAndroidTheme
fun SignupRoute(
modifier: Modifier = Modifier,
viewModel: SignupViewModel = hiltViewModel(),
navigateLogin: () -> Unit,
navigateLogin: (Boolean) -> Unit,
) {
val state by viewModel.collectAsState()
val snackBarHostState = remember { SnackbarHostState() }
Expand All @@ -43,11 +43,12 @@ fun SignupRoute(
viewModel.collectSideEffect { sideEffect ->
when (sideEffect) {
SignupSideEffect.SignupSuccess -> {
navigateLogin()
navigateLogin(true)
}

is SignupSideEffect.showSnackbar -> {
is SignupSideEffect.ShowSnackbar -> {
scope.launch {
snackBarHostState.currentSnackbarData?.dismiss()
snackBarHostState.showSnackbar(
sideEffect.message,
duration = SnackbarDuration.Short
Expand All @@ -64,7 +65,7 @@ fun SignupRoute(
onClickSignupBtn = viewModel::signup,
onValueChangeId = viewModel::updateId,
onValueChangePw = viewModel::updatePw,
onValueChangeHobby = viewModel::updateHobby,
onValueChangeHobby = viewModel::updatePhone,
onValueChangeName = viewModel::updateName
)
}
Expand Down Expand Up @@ -146,10 +147,10 @@ fun SignupScreen(

RegularTextField(
modifier = Modifier.padding(end = 20.dp),
title = "취미",
title = "휴대폰",
textStyle = MaterialTheme.typography.headlineSmall,
value = state.hobby,
placeholder = "취미를 입력하세요",
value = state.phone,
placeholder = "휴대폰 번호를 입력하세요",
onValueChange = onValueChangeHobby
)

Expand All @@ -163,8 +164,6 @@ fun SignupScreen(
}
}
}


}

@Preview(showBackground = true)
Expand Down
83 changes: 44 additions & 39 deletions feature/main/src/main/java/org/sopt/main/signup/SignupViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,66 +1,71 @@
package org.sopt.main.signup

import android.util.Log
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
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.domain.repo.UserDataRepository
import org.sopt.main.model.UserModel
import org.sopt.main.model.toUser
import org.sopt.ui.orbit.updateState
import org.sopt.domain.repo.AuthRepository
import org.sopt.domain.usecase.ValidatePasswordUseCase
import org.sopt.domain.usecase.ValidatePhoneNumberUseCase
import org.sopt.model.Member
import org.sopt.model.ValidateResult
import javax.inject.Inject

@OptIn(OrbitExperimental::class)
@HiltViewModel
class SignupViewModel @Inject constructor(
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("아이디 6~10"))
}
val member = Member(
id = state.id,
nickname = state.name,
phone = state.phone
)

state.password.length !in 8..12 -> {
postSideEffect(SignupSideEffect.showSnackbar("비번 8~12"))
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("이름 써라"))
}
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("취미 써라"))
}
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) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ fun NavController.navigateSignup() {

fun NavGraphBuilder.signupNavGraph(
modifier: Modifier = Modifier,
navigateLogin: () -> Unit = {},
navigateLogin: (Boolean) -> Unit = {},
) {
composable(route = SignupRoute.route) { navBackStackEntry ->
SignupRoute(
Expand Down

0 comments on commit 3a1f81a

Please sign in to comment.