From a94249a8283b2b970ebf6234a15cfeeaab896a7d Mon Sep 17 00:00:00 2001 From: JSPark <48265129+pknujsp@users.noreply.github.com> Date: Mon, 11 Mar 2024 20:47:57 +0900 Subject: [PATCH] =?UTF-8?q?#219=20SignDataSource=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mediproject/core/data/RepositoryModule.kt | 6 +- .../core/data/sign/SignRepository.kt | 3 +- .../core/data/sign/SignRepositoryImpl.kt | 12 ++-- .../datasource/sign/AWSAccountManager.kt | 7 -- .../datasource/sign/LoginDataSource.kt | 19 ++++++ ...SignInOutAWS.kt => LoginDataSourceImpl.kt} | 35 ++++------ .../network/datasource/sign/SignDataSource.kt | 11 ---- .../datasource/sign/SignDataSourceImpl.kt | 37 ----------- .../datasource/sign/SignupDataSource.kt | 30 +++++++++ .../{SignUpAWS.kt => SignupDataSourceImpl.kt} | 65 ++++++------------- .../network/datasource/sign/VerifyEmailAWS.kt | 28 -------- .../core/network/module/ServerNetwork.kt | 31 +++++---- .../feature/intro/LoginFragment.kt | 8 ++- .../feature/intro/SignUpFragment.kt | 22 +++---- .../feature/intro/SignUpViewModel.kt | 38 ++++------- ....kt => EmailVerificationDialogFragment.kt} | 2 +- feature/intro/src/main/res/values/strings.xml | 2 +- 17 files changed, 139 insertions(+), 217 deletions(-) delete mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt create mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSource.kt rename core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/{SignInOutAWS.kt => LoginDataSourceImpl.kt} (74%) delete mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt delete mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt create mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSource.kt rename core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/{SignUpAWS.kt => SignupDataSourceImpl.kt} (68%) delete mode 100644 core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt rename feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/{EmailVerificationDialog.kt => EmailVerificationDialogFragment.kt} (95%) diff --git a/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt b/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt index e3203fa19..224f47035 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/RepositoryModule.kt @@ -44,7 +44,7 @@ import com.android.mediproject.core.network.datasource.news.adminaction.AdminAct import com.android.mediproject.core.network.datasource.news.recallsuspension.RecallSaleSuspensionDataSource import com.android.mediproject.core.network.datasource.news.recallsuspension.RecallSaleSuspensionListDataSourceImpl import com.android.mediproject.core.network.datasource.news.safetynotification.SafetyNotificationDataSource -import com.android.mediproject.core.network.datasource.sign.SignDataSource +import com.android.mediproject.core.network.datasource.sign.LoginDataSource import com.android.mediproject.core.network.datasource.user.UserDataSource import dagger.Module import dagger.Provides @@ -113,10 +113,10 @@ object RepositoryModule { @Provides @Singleton internal fun providesSignRepositoryImpl( - signDataSource: SignDataSource, + loginDataSource: LoginDataSource, appDataStore: AppDataStore, accountSessionRepository: AccountSessionRepository, - ): SignRepository = SignRepositoryImpl(signDataSource, accountSessionRepository, appDataStore) + ): SignRepository = SignRepositoryImpl(loginDataSource, accountSessionRepository, appDataStore) @Provides diff --git a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt index 61a3a6b91..9312463bd 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepository.kt @@ -7,7 +7,8 @@ import com.android.mediproject.core.model.sign.SignUpParameter interface SignRepository { suspend fun login(loginParameter: LoginParameter): LoginState suspend fun signUp(signUpParameter: SignUpParameter): Result - suspend fun signOut() + suspend fun isValidEmail(email: String): Boolean + suspend fun signOut() suspend fun verifyEmail(email: String, code: String): Result } diff --git a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt index 83ee16502..224f86dca 100644 --- a/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt +++ b/core/data/src/main/java/com/android/mediproject/core/data/sign/SignRepositoryImpl.kt @@ -5,15 +5,15 @@ import com.android.mediproject.core.data.session.AccountSessionRepository import com.android.mediproject.core.datastore.AppDataStore import com.android.mediproject.core.model.sign.LoginParameter import com.android.mediproject.core.model.sign.SignUpParameter -import com.android.mediproject.core.network.datasource.sign.SignDataSource +import com.android.mediproject.core.network.datasource.sign.LoginDataSource internal class SignRepositoryImpl( - private val signDataSource: SignDataSource, + private val loginDataSource: LoginDataSource, private val accountSessionRepository: AccountSessionRepository, private val appDataStore: AppDataStore, ) : SignRepository { - override suspend fun login(loginParameter: LoginParameter) = signDataSource.logIn(loginParameter).fold( + override suspend fun login(loginParameter: LoginParameter) = loginDataSource.logIn(loginParameter).fold( onSuccess = { accountSessionRepository.updateSession(it.userSession) accountSessionRepository.updateAccount(loginParameter.email, it.userSession.username) @@ -30,7 +30,7 @@ internal class SignRepositoryImpl( ) override suspend fun signUp(signUpParameter: SignUpParameter): Result { - signDataSource.signUp(signUpParameter).onSuccess { + loginDataSource.signUp(signUpParameter).onSuccess { appDataStore.saveSkipIntro(true) } return Result.success(true) @@ -38,11 +38,11 @@ internal class SignRepositoryImpl( override suspend fun signOut() { accountSessionRepository.updateSession(null) - signDataSource.signOut() + loginDataSource.logout() } override suspend fun verifyEmail(email: String, code: String): Result { - return signDataSource.vertifyEmail(email, code) + return loginDataSource.vertifyEmail(email, code) } } diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt deleted file mode 100644 index 5b651cf6a..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/AWSAccountManager.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.mediproject.core.network.datasource.sign - -import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool - -open class AWSAccountManager( - protected val userPool: CognitoUserPool, -) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSource.kt new file mode 100644 index 000000000..a2c3ecf33 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSource.kt @@ -0,0 +1,19 @@ +package com.android.mediproject.core.network.datasource.sign + +import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoDevice +import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserSession + +interface LoginDataSource { + suspend fun login(request: LoginRequest): Result + suspend fun logout() +} + +class LoginRequest( + val email: String, + val password: ByteArray, +) + +class LoginResponse( + val userSession: CognitoUserSession, + val newDevice: CognitoDevice?, +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSourceImpl.kt similarity index 74% rename from core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt rename to core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSourceImpl.kt index 1b4b4b7d1..690df52ca 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignInOutAWS.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/LoginDataSourceImpl.kt @@ -12,18 +12,22 @@ import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine -internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), SignInOutAWS { - override suspend fun signIn(request: SignInRequest) = suspendCoroutine { continuation -> +class LoginDataSourceImpl( + private val userPool: CognitoUserPool, +) : LoginDataSource { + + override suspend fun login(request: LoginRequest) = suspendCoroutine { continuation -> userPool.getUser(request.email).getSession( object : AuthenticationHandler { override fun onSuccess(userSession: CognitoUserSession, newDevice: CognitoDevice?) { - continuation.resume(Result.success(SignInResponse(userSession, newDevice))) + continuation.resume(Result.success(LoginResponse(userSession, newDevice))) } override fun onFailure(exception: Exception) { continuation.resumeWithException(exception) // UserNotConfirmedException : 이메일 인증을 하지 않았을 때 발생 + // UserExistsException : 이미 가입된 이메일일 때 발생 } override fun authenticationChallenge(continuation: ChallengeContinuation?) { @@ -32,7 +36,11 @@ internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(u override fun getAuthenticationDetails(authenticationContinuation: AuthenticationContinuation, userId: String) { authenticationContinuation.run { - val authDetails = AuthenticationDetails(userId, request.password.decodeToString(), null) + val authDetails = AuthenticationDetails( + userId, + request.password.decodeToString(), + null, + ) setAuthenticationDetails(authDetails) continueTask() } @@ -45,22 +53,5 @@ internal class SignInOutAWSImpl(userPool: CognitoUserPool) : AWSAccountManager(u ) } - override suspend fun signOut() = userPool.currentUser.signOut() + override suspend fun logout() = userPool.currentUser.signOut() } - - -interface SignInOutAWS { - suspend fun signIn(request: SignInRequest): Result - - suspend fun signOut() -} - -class SignInRequest( - val email: String, - val password: ByteArray, -) - -class SignInResponse( - val userSession: CognitoUserSession, - val newDevice: CognitoDevice?, -) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt deleted file mode 100644 index 717c2efb2..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSource.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.android.mediproject.core.network.datasource.sign - -import com.android.mediproject.core.model.sign.LoginParameter -import com.android.mediproject.core.model.sign.SignUpParameter - -interface SignDataSource { - suspend fun logIn(loginParameter: LoginParameter): Result - suspend fun signUp(signUpParameter: SignUpParameter): Result - suspend fun vertifyEmail(email: String, code: String): Result - suspend fun signOut() -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt deleted file mode 100644 index 01e8a14aa..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignDataSourceImpl.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.android.mediproject.core.network.datasource.sign - -import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserAttributes -import com.android.mediproject.core.model.sign.LoginParameter -import com.android.mediproject.core.model.sign.SignUpParameter - -private const val USER_NAME = "user_name" - -class SignDataSourceImpl( - private val signInOutAWS: SignInOutAWS, - private val signUpAWS: SignUpAWS, - private val verifyEmailAWS: VerifyEmailAWS, -) : SignDataSource { - - override suspend fun logIn(loginParameter: LoginParameter) = signInOutAWS.signIn( - SignInRequest( - loginParameter.email, - loginParameter.password, - ), - ) - - override suspend fun signUp(signUpParameter: SignUpParameter): Result = signUpAWS.signUp( - SignUpRequest( - signUpParameter.email, - signUpParameter.password, - CognitoUserAttributes().apply { - addAttribute(USER_NAME, signUpParameter.nickName) - }, - ), - ) - - override suspend fun vertifyEmail(email: String, code: String): Result = verifyEmailAWS.verifyEmail(email, code) - - override suspend fun signOut() { - signInOutAWS.signOut() - } -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSource.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSource.kt new file mode 100644 index 000000000..09eb2e6c4 --- /dev/null +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSource.kt @@ -0,0 +1,30 @@ +package com.android.mediproject.core.network.datasource.sign + +import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser +import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserAttributes +import com.amazonaws.services.cognitoidentityprovider.model.SignUpResult + +interface SignupDataSource { + suspend fun signUp(signUpParameter: SignUpRequest): Result + suspend fun confirmEmail(email: String, code: String): Result + suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result +} + +class SignUpRequest( + val email: String, + private val password: ByteArray, + val cognitoUserAttributes: CognitoUserAttributes, +) { + val passwordString: String get() = password.decodeToString() +} + +data class SignUpResponse( + val cognitoUser: CognitoUser, + val signUpResult: SignUpResult, +) + +data class ConfirmationCodeDeliveryDetails( + val destination: String, + val deliveryMedium: String, + val attributeName: String, +) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSourceImpl.kt similarity index 68% rename from core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt rename to core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSourceImpl.kt index dd85d8a14..b97088ec4 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignUpAWS.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/SignupDataSourceImpl.kt @@ -1,7 +1,6 @@ package com.android.mediproject.core.network.datasource.sign import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUser -import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserAttributes import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserCodeDeliveryDetails import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.GenericHandler @@ -12,9 +11,11 @@ import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine -internal class SignUpAWSImpl( - userPool: CognitoUserPool, -) : AWSAccountManager(userPool), SignUpAWS { +private const val USER_NAME = "user_name" + +class SignupDataSourceImpl( + private val userPool: CognitoUserPool, +) : SignupDataSource { override suspend fun signUp(request: SignUpRequest) = suspendCoroutine { continuation -> userPool.signUp( @@ -32,21 +33,6 @@ internal class SignUpAWSImpl( ) } - override suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String) = suspendCoroutine { continuation -> - cognitoUser.confirmSignUpInBackground( - confirmationCode, false, - object : GenericHandler { - override fun onSuccess() { - continuation.resume(Result.success(Unit)) - } - - override fun onFailure(exception: Exception) { - continuation.resumeWithException(exception) - } - }, - ) - } - override suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result = suspendCoroutine { continuation -> cognitoUser.resendConfirmationCode( @@ -70,32 +56,19 @@ internal class SignUpAWSImpl( ) } -} - -interface SignUpAWS { - - suspend fun signUp(request: SignUpRequest): Result - - suspend fun confirmSignUp(cognitoUser: CognitoUser, confirmationCode: String): Result - - suspend fun resendConfirmationCode(cognitoUser: CognitoUser): Result -} + override suspend fun confirmEmail(email: String, code: String) = suspendCoroutine { + userPool.getUser(email).confirmSignUp( + code, true, + object : GenericHandler { + override fun onSuccess() { + it.resume(Result.success(Unit)) + } -class SignUpRequest( - val email: String, - private val password: ByteArray, - val cognitoUserAttributes: CognitoUserAttributes, -) { - val passwordString: String get() = password.decodeToString() + override fun onFailure(exception: Exception) { + it.resumeWithException(exception) + } + }, + ) + } + } - -data class SignUpResponse( - val cognitoUser: CognitoUser, - val signUpResult: SignUpResult, -) - -data class ConfirmationCodeDeliveryDetails( - val destination: String, - val deliveryMedium: String, - val attributeName: String, -) diff --git a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt b/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt deleted file mode 100644 index 607dca033..000000000 --- a/core/network/src/main/java/com/android/mediproject/core/network/datasource/sign/VerifyEmailAWS.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.android.mediproject.core.network.datasource.sign - -import com.amazonaws.mobileconnectors.cognitoidentityprovider.CognitoUserPool -import com.amazonaws.mobileconnectors.cognitoidentityprovider.handlers.GenericHandler -import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException -import kotlin.coroutines.suspendCoroutine - -class VerifyEmailImpl(userPool: CognitoUserPool) : AWSAccountManager(userPool), VerifyEmailAWS { - override suspend fun verifyEmail(email: String, code: String) = suspendCoroutine { - userPool.getUser(email).confirmSignUp( - code, true, - object : GenericHandler { - override fun onSuccess() { - it.resume(Result.success(true)) - } - - override fun onFailure(exception: Exception) { - it.resumeWithException(exception) - } - }, - ) - } -} - -interface VerifyEmailAWS { - suspend fun verifyEmail(email: String, code: String): Result -} diff --git a/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt b/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt index 4cec5b1e0..9063baef2 100644 --- a/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt +++ b/core/network/src/main/java/com/android/mediproject/core/network/module/ServerNetwork.kt @@ -30,11 +30,10 @@ import com.android.mediproject.core.network.datasource.favoritemedicine.Favorite import com.android.mediproject.core.network.datasource.favoritemedicine.FavoriteMedicineDataSourceImpl import com.android.mediproject.core.network.datasource.medicineid.MedicineIdDataSource import com.android.mediproject.core.network.datasource.medicineid.MedicineIdDataSourceImpl -import com.android.mediproject.core.network.datasource.sign.SignDataSource -import com.android.mediproject.core.network.datasource.sign.SignDataSourceImpl -import com.android.mediproject.core.network.datasource.sign.SignInOutAWSImpl -import com.android.mediproject.core.network.datasource.sign.SignUpAWSImpl -import com.android.mediproject.core.network.datasource.sign.VerifyEmailImpl +import com.android.mediproject.core.network.datasource.sign.LoginDataSource +import com.android.mediproject.core.network.datasource.sign.LoginDataSourceImpl +import com.android.mediproject.core.network.datasource.sign.SignupDataSource +import com.android.mediproject.core.network.datasource.sign.SignupDataSourceImpl import com.android.mediproject.core.network.datasource.user.UserDataSource import com.android.mediproject.core.network.datasource.user.UserDataSourceImpl import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory @@ -68,6 +67,13 @@ object ServerNetwork { coerceInputValues = true } + @Provides + @Singleton + fun providesUserPool(@ApplicationContext context: Context) = CognitoUserPool( + context, BuildConfig.AWS_USER_POOL, BuildConfig.AWS_USER_CLIENT_ID, BuildConfig.AWS_USER_CLIENT_SECRET, + Regions.US_EAST_2, + ) + @Provides @Singleton fun providesAwsNetworkApi( @@ -88,14 +94,13 @@ object ServerNetwork { @Provides fun providesSignDataSource( - @ApplicationContext context: Context, - ): SignDataSource { - val userPool = CognitoUserPool( - context, BuildConfig.AWS_USER_POOL, BuildConfig.AWS_USER_CLIENT_ID, BuildConfig.AWS_USER_CLIENT_SECRET, - Regions.US_EAST_2, - ) - return SignDataSourceImpl(SignInOutAWSImpl(userPool), SignUpAWSImpl(userPool), VerifyEmailImpl(userPool)) - } + userPool: CognitoUserPool, + ): LoginDataSource = LoginDataSourceImpl(userPool) + + @Provides + fun providesSignupDataSource( + userPool: CognitoUserPool, + ): SignupDataSource = SignupDataSourceImpl(userPool) @Provides @Singleton diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt index 56392a629..3a96bfe2f 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/LoginFragment.kt @@ -16,6 +16,7 @@ import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.model.navargs.TOMYPAGE import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.intro.databinding.FragmentLoginBinding +import com.android.mediproject.feature.intro.verification.EmailVerficationDialogFragment import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.MainScope @@ -86,8 +87,8 @@ class LoginFragment : BaseFragment(Fragmen is LoginViewModel.LoginUiState.LoginSuccess -> loginSuccess() is LoginViewModel.LoginUiState.LoginFailed -> loginFailed() is LoginViewModel.LoginUiState.RegexError -> regexError() - is LoginViewModel.LoginUiState.Initial -> initial() - is LoginViewModel.LoginUiState.NotVerified -> initial() + is LoginViewModel.LoginUiState.Initial -> notVerified() + is LoginViewModel.LoginUiState.NotVerified -> notVerified() } } @@ -138,7 +139,8 @@ class LoginFragment : BaseFragment(Fragmen toast(getString(R.string.signInRegexError)) } - private fun initial() { + private fun notVerified() { + EmailVerficationDialogFragment().show(childFragmentManager, "EmailVerificationDialogFragment") } private fun callSavedEmail(savedEmail: String) { diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt index cfd16e6c9..5ec55e70d 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpFragment.kt @@ -10,10 +10,12 @@ import com.android.mediproject.core.common.network.Dispatcher import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.util.SystemBarStyler import com.android.mediproject.core.common.util.delayTextChangedCallback +import com.android.mediproject.core.common.viewmodel.repeatOnStarted import com.android.mediproject.core.model.navargs.TOHOME import com.android.mediproject.core.model.navargs.TOMYPAGE import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.feature.intro.databinding.FragmentSignUpBinding +import com.android.mediproject.feature.intro.verification.EmailVerficationDialogFragment import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Job @@ -24,21 +26,16 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import com.android.mediproject.core.common.viewmodel.repeatOnStarted import javax.inject.Inject @AndroidEntryPoint -class SignUpFragment : - BaseFragment(FragmentSignUpBinding::inflate) { +class SignUpFragment : BaseFragment(FragmentSignUpBinding::inflate) { override val fragmentViewModel: SignUpViewModel by viewModels() - @Inject - @Dispatcher(MediDispatchers.Default) - lateinit var defaultDispatcher: CoroutineDispatcher + @Inject @Dispatcher(MediDispatchers.Default) lateinit var defaultDispatcher: CoroutineDispatcher - @Inject - lateinit var systemBarStyler: SystemBarStyler + @Inject lateinit var systemBarStyler: SystemBarStyler private val mainScope = MainScope() @@ -99,7 +96,8 @@ class SignUpFragment : private fun signUpSuccess() { LoadingDialog.dismiss() toast(getString(R.string.signUpSuccess)) - handleCallBackMoveFlag() + EmailVerficationDialogFragment().show(childFragmentManager, "EmailVerificationDialogFragment") + //handleCallBackMoveFlag() } private fun handleCallBackMoveFlag() { @@ -116,16 +114,14 @@ class SignUpFragment : private fun navigateToHome() { navigateWithUriNavOptions( "medilens://main/home_nav", - NavOptions.Builder().setPopUpTo(R.id.loginFragment, true) - .build(), + NavOptions.Builder().setPopUpTo(R.id.loginFragment, true).build(), ) } private fun navigateToMyPage() { navigateWithUriNavOptions( "medilens://main/mypage_nav", - NavOptions.Builder().setPopUpTo(R.id.loginFragment, true) - .build(), + NavOptions.Builder().setPopUpTo(R.id.loginFragment, true).build(), ) } diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt index 08a20dab3..71b487079 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/SignUpViewModel.kt @@ -9,17 +9,19 @@ import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.data.sign.SignRepository import com.android.mediproject.core.model.navargs.TOHOME +import com.android.mediproject.core.model.sign.SignUpParameter import com.android.mediproject.core.ui.base.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject @HiltViewModel class SignUpViewModel @Inject constructor( - private val signUseCase: SignRepository, @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, + private val signUpRepository: SignRepository, @Dispatcher(MediDispatchers.IO) private val ioDispatcher: CoroutineDispatcher, ) : BaseViewModel() { @@ -91,32 +93,18 @@ class SignUpViewModel @Inject constructor( password: String, nickName: String, ) { - val pair = initEmailPassword(email, password) - val (emailCharArray, passwordCharArray) = pair.first to pair.second - - setSignUpState(SignUpState.SigningUp) viewModelScope.launch { - /* signUseCase.signUp(SignUpParameter(emailCharArray, passwordCharArray, nickName)).collect { result -> - result.fold( - onSuccess = { setSignUpState(SignUpState.SignUpSuccess) }, - onFailure = { setSignUpState(SignUpState.SignUpFailed(it.message ?: "가입 실패")) }, - ) - }*//* withContext(ioDispatcher) { - signUpAWS.signUp( - SignUpAWS.SignUpRequest( - email, password.encodeToByteArray(), - CognitoUserAttributes().apply { - addAttribute("custom:user_name", nickName) - }, - ), - ) - }.onSuccess { - setSignUpState(SignUpState.SignUpSuccess) - }.onFailure { - setSignUpState(SignUpState.SignUpFailed(it.message ?: "가입 실패")) - }*/ + val pair = initEmailPassword(email, password) + setSignUpState(SignUpState.SigningUp) + + withContext(ioDispatcher) { + signUpRepository.signUp(SignUpParameter(pair.first.concatToString(), password.toByteArray(), nickName)) + }.onSuccess { + setSignUpState(SignUpState.SignUpSuccess) + }.onFailure { + setSignUpState(SignUpState.SignUpFailed(it.message ?: "")) + } } - //fillEmailPassword(emailCharArray, passwordCharArray) } private fun isNotEqualPasswordCheck() { diff --git a/feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialog.kt b/feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialogFragment.kt similarity index 95% rename from feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialog.kt rename to feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialogFragment.kt index 581211d58..cdbfeb9f2 100644 --- a/feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialog.kt +++ b/feature/intro/src/main/java/com/android/mediproject/feature/intro/verification/EmailVerificationDialogFragment.kt @@ -65,7 +65,7 @@ class EmailVerficationDialogFragment : DialogFragment() { Toast.makeText(requireContext(), getString(R.string.verificationCodeHint), Toast.LENGTH_SHORT).show() return@setOnClickListener } - viewModel.onClickWithText(dialogSubtitle1.inputData.text.toString()) + this@EmailVerficationDialogFragment.viewModel.onClickWithText(dialogSubtitle1.inputData.text.toString()) } negativeButton.setOnClickListener { dismiss() diff --git a/feature/intro/src/main/res/values/strings.xml b/feature/intro/src/main/res/values/strings.xml index bf1af44b2..b146b138d 100644 --- a/feature/intro/src/main/res/values/strings.xml +++ b/feature/intro/src/main/res/values/strings.xml @@ -19,6 +19,6 @@ 완료 로그인 하려면 이메일 인증이 필요합니다 다음 이메일로 인증 코드가 전송되었습니다 - 인증 코드가 틀렸습니다 + 인증 실패 인증 완료