Skip to content

Commit

Permalink
Merge pull request #128 from BCSDLab/feature/#112-signup
Browse files Browse the repository at this point in the history
Feature/#112 signup 구현
  • Loading branch information
wnehdals authored Jan 14, 2024
2 parents 2788461 + 82065e4 commit fac7e3d
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 78 deletions.
134 changes: 76 additions & 58 deletions app/src/main/java/com/jjbaksa/jjbaksa/ui/signup/SignUpFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@ package com.jjbaksa.jjbaksa.ui.signup
import android.annotation.SuppressLint
import android.text.Editable
import android.text.InputType
import android.util.Log
import android.view.View
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import com.google.android.material.internal.TextWatcherAdapter
import com.jjbaksa.domain.enums.SignUpAlertEnum
import com.jjbaksa.domain.enums.SignUpAlertEnum.EMAIL_NOT_FOUND
import com.jjbaksa.domain.enums.SignUpAlertEnum.ID_EXIST
import com.jjbaksa.domain.enums.SignUpAlertEnum.NEED_ID_CHECK
import com.jjbaksa.domain.enums.SignUpAlertEnum.PASSWORD_NOT_MATCH
import com.jjbaksa.domain.enums.SignUpAlertEnum.PASSWORD_RULE_NOT_MATCH
Expand All @@ -22,6 +19,7 @@ import com.jjbaksa.jjbaksa.dialog.ConfirmDialog
import com.jjbaksa.jjbaksa.ui.findpassword.FindPasswordResetFragment
import com.jjbaksa.jjbaksa.util.RegexUtil.isPasswordRuleMatch
import com.jjbaksa.jjbaksa.ui.signup.viewmodel.SignUpViewModel
import com.jjbaksa.jjbaksa.util.KeyboardProvider
import com.jjbaksa.jjbaksa.util.RegexUtil.checkEmailFormat
import dagger.hilt.android.AndroidEntryPoint

Expand All @@ -37,15 +35,28 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
private var isPasswordTyped = false
private var isPasswordConfirmedTyped = false
private var isPasswordConfirmed = false
private var passwordConfirmed = ""
private var isEmailRuleMatch = false
private var isPasswordRuleMatch = false
private var alertExist = false

private var id: String = ""
private var email: String = ""
override fun initView() {
}

override fun initEvent() {
binding.jEditTextSignUpId.setOnClickListener {
signUpViewModel.checkAccountAvailable(
signUpViewModel.id
)
binding.jEditTextSignUpId.setTailButtonOnClickListener {
signUpViewModel.id = id
signUpViewModel.checkAccountAvailable(id) { isAvailable ->
if (isAvailable) {
showSnackBar(getString(R.string.id_checked))
KeyboardProvider(requireContext()).hideKeyboard(binding.jEditTextSignUpId)
binding.jEditTextSignUpId.setEditTextAlertImg(false)
} else {
binding.jEditTextSignUpId.setEditTextAlertImg(true)
}
}
}

binding.jEditTextSignUpId.addTextChangedListener(
Expand All @@ -55,33 +66,23 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
isIdTyped = p0?.isNotEmpty() == true
binding.jEditTextSignUpId.setTailButtonEnable(isIdTyped)
if (isIdTyped) {
signUpViewModel.id = p0.toString()
// 중복확인 ui 변경
id = p0.toString()
}
// updateSignUpNextButton(isIdTyped)
signUpViewModel.updateIdCheckedState(false)
updateSignUpNextButton(isIdTyped && isEmailTyped && isPasswordTyped && isPasswordConfirmedTyped)
}
}
)

binding.jEditTextSignUpId.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// updateSignUpNextButton(isIdTyped)
}
}

binding.jEditTextSignUpEmail.addTextChangedListener(
@SuppressLint("RestrictedApi")
object : TextWatcherAdapter() {
override fun afterTextChanged(p0: Editable) {
val isEmailRuleMatch = checkEmailFormat(p0.toString())

isEmailRuleMatch = checkEmailFormat(p0.toString())
isEmailTyped = p0.toString().isNotEmpty()
isIdTyped = p0?.isNotEmpty() == true

if (isEmailTyped) {
signUpViewModel.email = p0.toString()
email = p0.toString()
}
if (isEmailRuleMatch) {
updateSignUpNextButton(isEmailTyped && isEmailRuleMatch)
Expand All @@ -97,12 +98,6 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
}
)

binding.jEditTextSignUpEmail.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// updateSignUpNextButton(isEmailTyped)
}
}

binding.jEditTextSignUpPassword.setTailImgOnClickListener {
if (signUpViewModel.password.isNotEmpty()) {
binding.jEditTextSignUpPassword.setTailImgSelected(!binding.jEditTextSignUpPassword.getTailImgSelected())
Expand All @@ -119,13 +114,14 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
@SuppressLint("RestrictedApi")
object : TextWatcherAdapter() {
override fun afterTextChanged(p0: Editable) {
val isPasswordRuleMatch = p0.toString().isPasswordRuleMatch()
isPasswordRuleMatch = p0.toString().isPasswordRuleMatch()
isPasswordTyped = p0.toString().isNotEmpty()

if (isPasswordTyped) {
signUpViewModel.password = p0.toString()
isPasswordConfirmed =
p0.toString() == passwordConfirmed
}

if (isPasswordRuleMatch) {
updateSignUpNextButton(isIdTyped && isEmailTyped && isPasswordTyped && isPasswordConfirmedTyped)

Expand All @@ -140,12 +136,6 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
}
)

binding.jEditTextSignUpPassword.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// updateSignUpNextButton(isPasswordTyped)
}
}

binding.jEditTextSignUpPasswordConfirm.setTailImgOnClickListener {
if (isPasswordConfirmedTyped) {
binding.jEditTextSignUpPasswordConfirm.setTailImgSelected(!binding.jEditTextSignUpPasswordConfirm.getTailImgSelected())
Expand All @@ -165,6 +155,7 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
isPasswordConfirmedTyped = p0.toString().isNotEmpty()
isPasswordConfirmed =
p0.toString() == signUpViewModel.password
passwordConfirmed = p0.toString()
if (!isPasswordConfirmed) {
signUpViewModel.updateAlertType(PASSWORD_NOT_MATCH)
signUpViewModel.updateAlertState(true)
Expand All @@ -176,24 +167,20 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
}
)

binding.jEditTextSignUpPasswordConfirm.setOnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
// updateSignUpNextButton(isPasswordConfirmed)
}
}

binding.buttonSignUpNext.setOnClickListener {
if (isPasswordConfirmed) {
checkInputsCorrect()
signUpViewModel.id = id
signUpViewModel.email = email
if (alertExist) {
if (signUpViewModel.uiState.value?.isIdChecked == true) {
Log.e("이메일", signUpViewModel.email)
signUpViewModel.postUserEmailId(signUpViewModel.email)

signUpViewModel.postUserEmailCheck(signUpViewModel.email)
ConfirmDialog(
getString(R.string.sign_up_title_text),
getString(R.string.sign_up_content_text),
getString(R.string.confirm),
{
// findNavController().navigate(R.id.action_nav_graph_move_to_welcome)
findNavController().navigate(R.id.action_nav_graph_move_to_welcome)
dismissDialog()
}
).show(parentFragmentManager, FindPasswordResetFragment.DIALOG_TAG)
Expand All @@ -206,8 +193,7 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
}

private fun dismissDialog() {
val dialogFragment =
parentFragmentManager.findFragmentByTag(FindPasswordResetFragment.DIALOG_TAG)
val dialogFragment = parentFragmentManager.findFragmentByTag(FindPasswordResetFragment.DIALOG_TAG)
if (dialogFragment is DialogFragment) {
dialogFragment.dismiss()
}
Expand All @@ -216,23 +202,20 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
signUpViewModel.uiState.observe(viewLifecycleOwner) {
binding.jEditTextSignUpId.setTailButtonEnable(!it.isIdChecked)
setAlert(it.alertType)
binding.textViewSignUpAlert.visibility =
if (it.isAlertShown) View.VISIBLE else View.INVISIBLE
binding.imageViewSignUpAlert.visibility =
if (it.isAlertShown) View.VISIBLE else View.INVISIBLE
}

signUpViewModel.userEmailIdState.observe(viewLifecycleOwner) {
signUpViewModel.userEmailCheckState.observe(viewLifecycleOwner) {
if (it) {
findNavController().navigate(R.id.action_nav_graph_move_to_welcome)
} else {
binding.buttonSignUpNext.isEnabled = false
/* binding.editTextFindIdToEmail.background = ContextCompat.getDrawable(
requireContext(),
R.drawable.shape_rectf6bf54_solid_radius_100_stroke_ff7f23
)*/
}
}

signUpViewModel.toastMsg.observe(viewLifecycleOwner) {
showSnackBar(it)
KeyboardProvider(requireContext()).hideKeyboard(binding.jEditTextSignUpId)
}
}

override fun onResume() {
Expand All @@ -254,13 +237,48 @@ class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
binding.buttonSignUpNext.isEnabled = isEnabled
}

private fun setAlert(alertType: SignUpAlertEnum) {
binding.textViewSignUpAlert.text = when (alertType) {
ID_EXIST -> context?.getString(R.string.id_already_exist)
private fun setAlert(alertType: SignUpAlertEnum): String? {
val alertMsg = when (alertType) {
EMAIL_NOT_FOUND -> context?.getString(R.string.email_not_found)
PASSWORD_RULE_NOT_MATCH -> context?.getString(R.string.password_rule_not_match)
PASSWORD_NOT_MATCH -> context?.getString(R.string.password_not_match)
NEED_ID_CHECK -> context?.getString(R.string.need_id_check)
}

return alertMsg
}
private fun checkInputsCorrect() {

val uiState = signUpViewModel.uiState.value
binding.jEditTextSignUpId.setEditTextAlertImg(false)
binding.jEditTextSignUpEmail.setEditTextAlertImg(false)
binding.jEditTextSignUpPassword.setEditTextAlertImg(false)
binding.jEditTextSignUpPasswordConfirm.setEditTextAlertImg(false)

alertExist = isPasswordConfirmed && isPasswordRuleMatch && isEmailRuleMatch

if (alertExist) {
binding.buttonSignUpNext.isEnabled = false
}

when {
uiState?.isIdChecked != true -> {
showSnackBar(setAlert(SignUpAlertEnum.NEED_ID_CHECK).toString())
binding.jEditTextSignUpId.setEditTextAlertImg(signUpViewModel.uiState.value?.isIdChecked != true)
}
!isEmailRuleMatch -> {
showSnackBar(setAlert(SignUpAlertEnum.EMAIL_NOT_FOUND).toString())
binding.jEditTextSignUpEmail.setEditTextAlertImg(!isEmailRuleMatch)
}
!isPasswordRuleMatch -> {
showSnackBar(setAlert(SignUpAlertEnum.PASSWORD_RULE_NOT_MATCH).toString())
binding.jEditTextSignUpPassword.setEditTextAlertImg(!isPasswordRuleMatch)
}
!isPasswordConfirmed ->
{
showSnackBar(setAlert(SignUpAlertEnum.PASSWORD_NOT_MATCH).toString())
binding.jEditTextSignUpPasswordConfirm.setEditTextAlertImg(!isPasswordConfirmed)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,19 @@ class SignUpViewModel @Inject constructor(
private val checkAccountAvailableUseCase: CheckAccountAvailableUseCase,
private val signUpUseCase: SignUpUseCase,
private val userUseCase: UserUseCase
) :
BaseViewModel() {
) : BaseViewModel() {

private val _isSignUpSuccess = MutableLiveData<Boolean>()
private val _userEmailIdState = SingleLiveEvent<Boolean>()

val userEmail = MutableLiveData<String>("")
val userEmailIdState: SingleLiveEvent<Boolean> get() = _userEmailIdState
private val _userEmailCheckState = SingleLiveEvent<Boolean>()
val userEmailCheckState: SingleLiveEvent<Boolean> get() = _userEmailCheckState

val isSignUpSuccess: LiveData<Boolean>
get() = _isSignUpSuccess

val userEmail = MutableLiveData<String>("")
private val _uiState = SingleLiveEvent<SignUpUIState>()
val uiState: SingleLiveEvent<SignUpUIState> get() = _uiState

private var availableId = ""

var id: String = ""
var email: String = ""
var password: String = ""
Expand All @@ -47,21 +43,21 @@ class SignUpViewModel @Inject constructor(
_uiState.value = SignUpUIState()
}

fun checkAccountAvailable(account: String) {

fun checkAccountAvailable(account: String, onComplete: (Boolean) -> Unit) {
viewModelScope.launch {
runCatching {
checkAccountAvailableUseCase(account)
}.onSuccess {
when (it) {
is RespResult.Error -> {
updateAlertType(SignUpAlertEnum.ID_EXIST)
updateAlertState(true)
toastMsg.postValue(it.errorType.errorMessage)
onComplete(false)
}
is RespResult.Success -> {
availableId = id
updateIdCheckedState(true)
updateAlertState(false)
onComplete(true)
}
}
}.onFailure {
Expand All @@ -70,10 +66,6 @@ class SignUpViewModel @Inject constructor(
}
}

fun isTypedIdChanged(): Boolean {
return availableId != id
}

fun updateIdCheckedState(newState: Boolean) {
_uiState.value = _uiState.value?.copy(isIdChecked = newState)
}
Expand All @@ -99,12 +91,12 @@ class SignUpViewModel @Inject constructor(
}
}

fun postUserEmailId(email: String) {
fun postUserEmailCheck(email: String) {
userEmail.value = email
viewModelScope.launch(ceh) {
userUseCase.postUserEmailCheck(email).collect {
it.onSuccess {
_userEmailIdState.value = it.isSuccess
_userEmailCheckState.value = it.isSuccess
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ import com.jjbaksa.domain.enums.SignUpAlertEnum
data class SignUpUIState(
val isIdChecked: Boolean = false,
val isAlertShown: Boolean = false,
val alertType: SignUpAlertEnum = SignUpAlertEnum.ID_EXIST
var alertType: SignUpAlertEnum = SignUpAlertEnum.EMAIL_NOT_FOUND
)
15 changes: 15 additions & 0 deletions app/src/main/java/com/jjbaksa/jjbaksa/view/JEditText.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,21 @@ class JEditText @JvmOverloads constructor(
recycle()
}
}

fun setEditTextAlertImg(AlertExist: Boolean) {
if (AlertExist) {
binding.clJ.background = ContextCompat.getDrawable(
context,
R.drawable.shape_rectf6bf54_solid_radius_100_stroke_ff7f23
)
} else {
binding.clJ.background = ContextCompat.getDrawable(
context,
R.drawable.shape_rect_eeeeee_solid_radius_100
)
}
}

fun setTailImageDrawable(@DrawableRes drawableRes: Int) {
if (drawableRes != 0) {
binding.ivJ.setImageDrawable(ContextCompat.getDrawable(context, drawableRes))
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<string name="not_correct_verification_code">인증번호가 올바르지 않습니다.</string>
<string name="input_verification_code">인증번호 입력</string>

<string name="id_checked">사용 가능한 아이디입니다.</string>
<string name="id_already_exist">이미 존재하는 아이디입니다.</string>
<string name="fail_id">아이디가 존재하지 않아요.</string>
<string name="fail_email">올바르지 않은 이메일이에요.</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.jjbaksa.domain.enums

enum class SignUpAlertEnum {
ID_EXIST, EMAIL_NOT_FOUND, PASSWORD_RULE_NOT_MATCH, PASSWORD_NOT_MATCH, NEED_ID_CHECK
EMAIL_NOT_FOUND, PASSWORD_RULE_NOT_MATCH, PASSWORD_NOT_MATCH, NEED_ID_CHECK
}

0 comments on commit fac7e3d

Please sign in to comment.