-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[feat] 회원가입 뷰 구현 #16
[feat] 회원가입 뷰 구현 #16
Changes from 38 commits
9a003a4
30e48b7
07e02f7
af4a56a
e75028e
55dae8c
9030315
b8aa361
95b4545
88c1c4d
7f161c6
fc3ad79
c93e5bd
a80fa3e
ccda175
8eea2bc
751a6ac
0af1079
710aa3d
2b7aaa7
e7f8776
0e9598e
6477d7d
24e0101
feb80b6
e0adf6b
8921cb0
9a55011
356589e
4f24740
d32711e
299fd4d
393dbc4
f19ef2a
f032a27
6940b24
9ae09c1
42592b6
8d92b5f
e3eb8cb
885460b
45968d5
73c17fc
d634f14
ff9f6a8
4e878d1
b726a43
c06e195
0f5485e
e45bbbb
adbe6fc
45a6d8c
3d21e29
2655456
83ced83
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package com.sopt.geonppang.presentation.signup.view | ||
|
||
import android.content.Intent | ||
import android.os.Bundle | ||
import androidx.activity.viewModels | ||
import com.sopt.geonppang.R | ||
import com.sopt.geonppang.databinding.ActivitySignupEmailBinding | ||
import com.sopt.geonppang.presentation.signup.viewmodel.SignUpViewModel | ||
import com.sopt.geonppang.util.binding.BindingActivity | ||
import com.sopt.geonppang.util.extension.hideKeyboard | ||
import dagger.hilt.android.AndroidEntryPoint | ||
|
||
@AndroidEntryPoint | ||
class SignUpEmailActivity : | ||
BindingActivity<ActivitySignupEmailBinding>(R.layout.activity_signup_email) { | ||
private val viewModel: SignUpViewModel by viewModels() | ||
|
||
override fun onCreate(savedInstanceState: Bundle?) { | ||
super.onCreate(savedInstanceState) | ||
binding.viewModel = viewModel | ||
binding.lifecycleOwner = this | ||
|
||
addListeners() | ||
} | ||
|
||
private fun addListeners() { | ||
binding.root.setOnClickListener { | ||
hideKeyboard(it) | ||
} | ||
binding.btnNext.setOnClickListener { | ||
moveToPassword() | ||
} | ||
binding.btnDoubleCheck.setOnClickListener { | ||
val bottomSheetDialog = SignUpEmailBottomSheetDialog() | ||
bottomSheetDialog.show(supportFragmentManager, bottomSheetDialog.tag) | ||
} | ||
} | ||
|
||
private fun moveToPassword() { | ||
startActivity(Intent(this, SignUpPasswordActivity::class.java)) | ||
finish() | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package com.sopt.geonppang.presentation.signup.view | ||
|
||
import android.os.Bundle | ||
import android.view.View | ||
import androidx.fragment.app.viewModels | ||
import com.sopt.geonppang.R | ||
import com.sopt.geonppang.databinding.DialogBottomSignupEmailBinding | ||
import com.sopt.geonppang.presentation.signup.viewmodel.SignUpViewModel | ||
import com.sopt.geonppang.util.binding.BindingBottomSheetDialogFragment | ||
|
||
class SignUpEmailBottomSheetDialog : | ||
BindingBottomSheetDialogFragment<DialogBottomSignupEmailBinding>( | ||
R.layout.dialog_bottom_signup_email | ||
) { | ||
private val viewModel: SignUpViewModel by viewModels() | ||
|
||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||
super.onViewCreated(view, savedInstanceState) | ||
binding.viewModel = viewModel | ||
binding.lifecycleOwner = this | ||
|
||
addListener() | ||
} | ||
|
||
private fun addListener() { | ||
binding.btnCheck.setOnClickListener { dismiss() } | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package com.sopt.geonppang.presentation.signup.view | ||
|
||
import android.os.Bundle | ||
import androidx.activity.viewModels | ||
import com.sopt.geonppang.R | ||
import com.sopt.geonppang.databinding.ActivitySignupNicknameBinding | ||
import com.sopt.geonppang.presentation.signup.viewmodel.SignUpViewModel | ||
import com.sopt.geonppang.util.binding.BindingActivity | ||
import com.sopt.geonppang.util.extension.hideKeyboard | ||
import dagger.hilt.android.AndroidEntryPoint | ||
|
||
@AndroidEntryPoint | ||
class SignUpNicknameActivity : | ||
BindingActivity<ActivitySignupNicknameBinding>(R.layout.activity_signup_nickname) { | ||
private val viewModel: SignUpViewModel by viewModels() | ||
|
||
override fun onCreate(savedInstanceState: Bundle?) { | ||
super.onCreate(savedInstanceState) | ||
binding.viewModel = viewModel | ||
binding.lifecycleOwner = this | ||
|
||
addListeners() | ||
} | ||
|
||
private fun addListeners() { | ||
binding.root.setOnClickListener { | ||
hideKeyboard(it) | ||
} | ||
|
||
binding.btnDoubleCheck.setOnClickListener { | ||
val bottomSheetDialog = SignUpNicknameBottomSheetDialog() | ||
bottomSheetDialog.show(supportFragmentManager, bottomSheetDialog.tag) | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package com.sopt.geonppang.presentation.signup.view | ||
|
||
import android.os.Bundle | ||
import android.view.View | ||
import androidx.fragment.app.viewModels | ||
import com.sopt.geonppang.R | ||
import com.sopt.geonppang.databinding.DialogBottomSignupNicknameBinding | ||
import com.sopt.geonppang.presentation.signup.viewmodel.SignUpViewModel | ||
import com.sopt.geonppang.util.binding.BindingBottomSheetDialogFragment | ||
|
||
class SignUpNicknameBottomSheetDialog : | ||
BindingBottomSheetDialogFragment<DialogBottomSignupNicknameBinding>( | ||
R.layout.dialog_bottom_signup_nickname | ||
) { | ||
private val viewModel: SignUpViewModel by viewModels() | ||
|
||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||
super.onViewCreated(view, savedInstanceState) | ||
binding.viewModel = viewModel | ||
binding.lifecycleOwner = this | ||
|
||
addListener() | ||
} | ||
|
||
private fun addListener() { | ||
binding.btnCheck.setOnClickListener { dismiss() } | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package com.sopt.geonppang.presentation.signup.view | ||
|
||
import android.content.Intent | ||
import android.os.Bundle | ||
import androidx.activity.viewModels | ||
import com.sopt.geonppang.R | ||
import com.sopt.geonppang.databinding.ActivitySignupPasswordBinding | ||
import com.sopt.geonppang.presentation.signup.viewmodel.SignUpViewModel | ||
import com.sopt.geonppang.util.binding.BindingActivity | ||
import com.sopt.geonppang.util.extension.hideKeyboard | ||
import dagger.hilt.android.AndroidEntryPoint | ||
|
||
@AndroidEntryPoint | ||
class SignUpPasswordActivity : | ||
BindingActivity<ActivitySignupPasswordBinding>(R.layout.activity_signup_password) { | ||
private val viewModel: SignUpViewModel by viewModels() | ||
|
||
override fun onCreate(savedInstanceState: Bundle?) { | ||
super.onCreate(savedInstanceState) | ||
binding.viewModel = viewModel | ||
binding.lifecycleOwner = this | ||
|
||
addListeners() | ||
} | ||
private fun addListeners() { | ||
binding.root.setOnClickListener { | ||
hideKeyboard(it) | ||
} | ||
binding.btnNext.setOnClickListener { | ||
moveToNickname() | ||
} | ||
} | ||
|
||
private fun moveToNickname() { | ||
startActivity(Intent(this, SignUpNicknameActivity::class.java)) | ||
finish() | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,75 @@ | ||||||||
package com.sopt.geonppang.presentation.signup.viewmodel | ||||||||
|
||||||||
import androidx.lifecycle.LiveData | ||||||||
import androidx.lifecycle.MediatorLiveData | ||||||||
import androidx.lifecycle.MutableLiveData | ||||||||
import androidx.lifecycle.ViewModel | ||||||||
import androidx.lifecycle.map | ||||||||
import dagger.hilt.android.lifecycle.HiltViewModel | ||||||||
import javax.inject.Inject | ||||||||
|
||||||||
@HiltViewModel | ||||||||
class SignUpViewModel @Inject constructor() : ViewModel() { | ||||||||
val email = MutableLiveData("") | ||||||||
val password = MutableLiveData("") | ||||||||
val password_check = MutableLiveData("") | ||||||||
val nickname = MutableLiveData("") | ||||||||
|
||||||||
val isValidEmail: LiveData<Boolean> = email.map { email -> | ||||||||
email.matches(Regex(EMAIL_PATTERN)) | ||||||||
/*조건에 만족하는 이메일인지 확인*/ | ||||||||
} | ||||||||
|
||||||||
val isValidNickname: LiveData<Boolean> = nickname.map { nickname -> | ||||||||
nickname.matches(Regex(NICKNAME_PATTERN)) | ||||||||
/*조건에 맞는 닉네임인지 확인*/ | ||||||||
} | ||||||||
|
||||||||
val isValidPassword: LiveData<Boolean> = password.map { password -> | ||||||||
password.matches(Regex(PASSWORD_PATTERN)) | ||||||||
/*조건에 맞는 비밀번호인지 확인*/ | ||||||||
} | ||||||||
|
||||||||
// TODO 이메일 중복확인 구현 예정 | ||||||||
/*val doubleCheckEmail: LiveData<Boolean> = email.map { | ||||||||
|
||||||||
}*/ | ||||||||
val doubleCheckNickname = MediatorLiveData<Boolean>().apply { | ||||||||
// Todo 닉네임 중복 확인 구현 예정 | ||||||||
} | ||||||||
|
||||||||
/*다음 버튼 활성화 -> 중복확인이 true 이면 활성화 되어야 함*/ | ||||||||
val completeEmail = MediatorLiveData<Boolean>().apply { | ||||||||
addSource(email) { value = checkEmailCondition() } | ||||||||
} | ||||||||
|
||||||||
/*비밀번호 다음 버튼 활성화*/ | ||||||||
val completePassword = MediatorLiveData<Boolean>().apply { | ||||||||
addSource(password) { value = isPasswordDoubleCheck() } | ||||||||
addSource(password_check) { value = isPasswordDoubleCheck() } | ||||||||
} | ||||||||
|
||||||||
/*다음 버튼 활성화 -> 중복 확인이 되면 활성화 되어야 함*/ | ||||||||
val completeNickname = MediatorLiveData<Boolean>().apply { | ||||||||
addSource(nickname) { value = checkNicknameCondition() } | ||||||||
} | ||||||||
|
||||||||
private fun isPasswordDoubleCheck(): Boolean { | ||||||||
return password.value.toString() == password_check.value.toString() && !password.value.isNullOrBlank() && !password_check.value.isNullOrBlank() | ||||||||
} | ||||||||
|
||||||||
private fun checkEmailCondition(): Boolean { | ||||||||
return isValidEmail.value == true | ||||||||
} | ||||||||
|
||||||||
private fun checkNicknameCondition(): Boolean { | ||||||||
return isValidNickname.value == true | ||||||||
} | ||||||||
|
||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이거 있어야 되는 거였낭?! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아 메니페스트 추가했는지도 확인부탁! |
||||||||
companion object { | ||||||||
const val EMAIL_PATTERN = "^[a-zA-Z0-9+-\\_.]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+\$" | ||||||||
const val NICKNAME_PATTERN = "[가-힣]*[A-Za-z[0-9]]{2,10}\$" | ||||||||
const val PASSWORD_PATTERN = | ||||||||
"^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[\$@\$!%*#?&.])[A-Za-z[0-9]\$@\$!%*#?&.]{6,12}\$" | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 정규식 옳은 정규식인지 꼭 확인해주셍ㅇ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 나머지 리뷰는 내일 달겠습니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 파업이슈 |
||||||||
} | ||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item android:state_pressed="true"> | ||
<shape> | ||
<stroke android:width="1dp" android:color="#1C6739" /> | ||
<corners android:radius="12dp" /> | ||
</shape> | ||
</item> | ||
|
||
<item android:state_pressed="false"> | ||
<shape> | ||
<stroke android:width="1dp" android:color="#CBC8C5"/> | ||
<corners android:radius="12dp" /> | ||
</shape> | ||
</item> | ||
</selector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> | ||
|
||
<stroke | ||
android:width="1dp" | ||
android:color="@color/gray_300" /> | ||
<corners android:radius="12dp" /> | ||
</shape> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<stroke | ||
android:width="1dp" | ||
android:color="@color/main_2" /> | ||
<corners android:radius="12dp" /> | ||
</shape> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item | ||
android:state_enabled="true" | ||
android:drawable="@drawable/background_btn_double_check_enable"/> | ||
<item | ||
android:state_enabled="false" | ||
android:drawable="@drawable/background_btn_double_check_disable"/> | ||
</selector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item android:state_enabled="true"> | ||
<shape> | ||
<solid android:color="#1C6739" /> | ||
<corners android:radius="12dp" /> | ||
</shape> | ||
</item> | ||
|
||
<item android:state_enabled="false"> | ||
<shape> | ||
<solid android:color="#EBEBEB" /> | ||
<corners android:radius="12dp" /> | ||
</shape> | ||
</item> | ||
</selector> | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item | ||
android:bottom="1dp" | ||
android:left="1dp" | ||
android:right="1dp" | ||
android:top="1dp"> | ||
<shape android:shape="rectangle" > | ||
<stroke | ||
android:width="1dp" | ||
android:color="#FF2633" /> | ||
<solid android:color="#FAF7F2" /> | ||
<corners android:radius="10dp"/> | ||
</shape> | ||
</item> | ||
</layer-list> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item | ||
android:bottom="1dp" | ||
android:left="1dp" | ||
android:right="1dp" | ||
android:top="1dp"> | ||
<shape android:shape="rectangle" > | ||
<solid android:color="#FAF7F2" /> | ||
<corners android:radius="10dp"/> | ||
</shape> | ||
</item> | ||
</layer-list> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item android:state_enabled="true" | ||
android:color="@color/main_2" /> | ||
<item android:state_enabled="false" | ||
android:color="@color/gray_300" /> | ||
</selector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | ||
<item android:state_enabled="true" | ||
android:color="@color/gray_200" /> | ||
<item android:state_enabled="false" | ||
android:color="@color/gray_400" /> | ||
</selector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:width="36dp" | ||
android:height="14dp" | ||
android:viewportWidth="36" | ||
android:viewportHeight="14"> | ||
<path | ||
android:pathData="M10.787,0.816V13.285H9.023V0.816H10.787ZM0.738,6.121C0.731,3.407 2.119,1.691 4.033,1.691C5.906,1.691 7.301,3.407 7.301,6.121C7.301,8.855 5.906,10.564 4.033,10.564C2.119,10.564 0.731,8.855 0.738,6.121ZM2.42,6.121C2.413,7.974 3.063,8.985 4.033,8.979C4.977,8.985 5.612,7.974 5.619,6.121C5.612,4.275 4.977,3.264 4.033,3.264C3.063,3.264 2.413,4.275 2.42,6.121ZM17.773,2.102V5.342H19.018V0.994H20.658V12.684H19.018V6.736H17.773V10.127H12.824V2.102H17.773ZM14.451,8.76H16.146V3.482H14.451V8.76ZM21.588,13.258V0.816H23.256V13.258H21.588ZM28.109,1.186C30.003,1.179 31.425,2.368 31.432,4.029C31.425,5.677 30.003,6.853 28.109,6.859C26.188,6.853 24.76,5.677 24.76,4.029C24.76,2.368 26.188,1.179 28.109,1.186ZM26.455,4.029C26.441,4.918 27.146,5.444 28.109,5.451C29.053,5.444 29.743,4.918 29.75,4.029C29.743,3.134 29.053,2.607 28.109,2.607C27.152,2.607 26.441,3.134 26.455,4.029ZM26.633,8.91V7.57H34.986V10.947H28.369V11.754H35.328V13.121H26.66V9.676H33.25V8.91H26.633ZM33.236,7.051V0.816H34.986V7.051H33.236Z" | ||
android:fillColor="#878784"/> | ||
</vector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:width="24dp" | ||
android:height="24dp" | ||
android:viewportWidth="24" | ||
android:viewportHeight="24"> | ||
<path | ||
android:pathData="M9.803,14.753C10.428,15.176 11.189,15.432 11.999,15.432C14.145,15.432 15.892,13.67 15.892,11.504C15.892,10.686 15.638,9.919 15.219,9.289L14.155,10.362C14.331,10.696 14.428,11.09 14.428,11.504C14.428,12.852 13.335,13.955 11.999,13.955C11.589,13.955 11.199,13.857 10.867,13.679L9.803,14.753ZM18.429,6.05C19.844,7.349 21.044,9.101 21.941,11.208C22.02,11.395 22.02,11.612 21.941,11.789C19.853,16.692 16.136,19.626 11.999,19.626H11.989C10.106,19.626 8.301,19.006 6.71,17.874L4.817,19.783C4.671,19.931 4.485,20 4.3,20C4.115,20 3.92,19.931 3.783,19.783C3.539,19.537 3.5,19.143 3.695,18.858L3.724,18.819L18.156,4.258C18.175,4.238 18.195,4.218 18.204,4.199C18.224,4.179 18.243,4.159 18.253,4.14L19.17,3.214C19.463,2.929 19.922,2.929 20.205,3.214C20.497,3.5 20.497,3.972 20.205,4.258L18.429,6.05ZM8.098,11.507C8.098,11.764 8.128,12.019 8.167,12.256L4.556,15.898C3.581,14.756 2.732,13.378 2.059,11.793C1.98,11.616 1.98,11.399 2.059,11.212C4.147,6.309 7.864,3.385 11.992,3.385H12.001C13.397,3.385 14.753,3.72 16.002,4.35L12.743,7.638C12.509,7.599 12.255,7.569 12.001,7.569C9.845,7.569 8.098,9.332 8.098,11.507Z" | ||
android:fillColor="#CBC8C5" | ||
android:fillType="evenOdd"/> | ||
</vector> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<vector xmlns:android="http://schemas.android.com/apk/res/android" | ||
android:width="24dp" | ||
android:height="24dp" | ||
android:viewportWidth="24" | ||
android:viewportHeight="24"> | ||
<path | ||
android:pathData="M8.098,12C8.098,14.133 9.844,15.869 12,15.869C14.146,15.869 15.893,14.133 15.893,12C15.893,9.857 14.146,8.121 12,8.121C9.844,8.121 8.098,9.857 8.098,12ZM17.737,6.046C19.444,7.365 20.898,9.295 21.941,11.709C22.02,11.893 22.02,12.107 21.941,12.281C19.854,17.11 16.137,20 12,20H11.99C7.863,20 4.146,17.11 2.059,12.281C1.98,12.107 1.98,11.893 2.059,11.709C4.146,6.88 7.863,4 11.99,4H12C14.068,4 16.029,4.718 17.737,6.046ZM12.001,14.412C13.338,14.412 14.43,13.326 14.43,11.998C14.43,10.66 13.338,9.574 12.001,9.574C11.884,9.574 11.767,9.583 11.66,9.603C11.621,10.669 10.743,11.523 9.66,11.523H9.611C9.582,11.678 9.562,11.833 9.562,11.998C9.562,13.326 10.655,14.412 12.001,14.412Z" | ||
android:fillColor="#238448" | ||
android:fillType="evenOdd"/> | ||
</vector> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
변수명 passwordCheck camelcase 지켜주세요