Skip to content

Commit ab32265

Browse files
committed
#38 [FEAT] 카카오, 구글 로그인 실패 시 다이얼로그 구현
1 parent 7b25a45 commit ab32265

File tree

3 files changed

+32
-21
lines changed

3 files changed

+32
-21
lines changed

presentation/src/main/java/com/sopt/presentation/auth/login/LogInRoute.kt

+21-10
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import androidx.compose.ui.tooling.preview.Preview
2424
import androidx.compose.ui.unit.dp
2525
import androidx.hilt.navigation.compose.hiltViewModel
2626
import androidx.lifecycle.compose.collectAsStateWithLifecycle
27+
import com.sopt.core.designsystem.component.dialog.NoostakDialog
2728
import com.sopt.core.designsystem.theme.NoostakAndroidTheme
2829
import com.sopt.core.designsystem.theme.NoostakTheme
2930
import com.sopt.core.extension.toast
31+
import com.sopt.core.type.DialogType
3032
import com.sopt.presentation.R
3133
import com.sopt.presentation.auth.component.LoginButton
3234

@@ -37,28 +39,37 @@ fun LoginRoute(
3739
loginViewModel: LoginViewModel = hiltViewModel()
3840
) {
3941
val context = LocalContext.current
40-
4142
val showDialog by loginViewModel.showDialog.collectAsStateWithLifecycle()
42-
val dialogDescription by loginViewModel.dialogDescription.collectAsStateWithLifecycle()
4343

4444
LaunchedEffect(loginViewModel.sideEffects) {
4545
loginViewModel.sideEffects.collect { sideEffect ->
4646
when (sideEffect) {
4747
is LoginSideEffect.NavigateToHome -> navigateToHome()
4848
is LoginSideEffect.NavigateSignUp -> navigateToSignUp(sideEffect.authId)
4949
is LoginSideEffect.ShowToast -> context.toast(sideEffect.message)
50+
is LoginSideEffect.ShowDialog -> loginViewModel.showDialog(
51+
sideEffect.dialogType,
52+
true
53+
)
5054
}
5155
}
5256
}
5357

54-
if (showDialog) {
55-
LoginFailureDialog(
56-
onRetryRequest = { loginViewModel.googleLogin(context) },
57-
onDismissRequest = { loginViewModel.showFailLoginDialog(false) },
58-
description = stringResource(R.string.dialog_login_description, dialogDescription),
59-
retryText = stringResource(R.string.dialog_login_retry),
60-
dismissText = stringResource(R.string.dialog_login_dismiss)
61-
)
58+
showDialog.let { (dialogType, isVisible) ->
59+
if (isVisible) {
60+
NoostakDialog(
61+
dialogType = dialogType,
62+
onClick = {
63+
loginViewModel.showDialog(dialogType, false)
64+
when (dialogType) {
65+
DialogType.LOGIN_KAKAO -> loginViewModel.kakaoLogin(context)
66+
DialogType.LOGIN_GOOGLE -> loginViewModel.googleLogin(context)
67+
else -> Unit
68+
}
69+
},
70+
onDismissRequest = { loginViewModel.showDialog(dialogType, false) }
71+
)
72+
}
6273
}
6374

6475
LoginScreen(

presentation/src/main/java/com/sopt/presentation/auth/login/LoginSideEffect.kt

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sopt.presentation.auth.login
22

33
import androidx.annotation.StringRes
4+
import com.sopt.core.type.DialogType
45

56
sealed class LoginSideEffect {
67
data object NavigateToHome : LoginSideEffect()
@@ -9,4 +10,6 @@ sealed class LoginSideEffect {
910
@StringRes val message: Int,
1011
val args: String? = null
1112
) : LoginSideEffect()
13+
14+
data class ShowDialog(val dialogType: DialogType) : LoginSideEffect()
1215
}

presentation/src/main/java/com/sopt/presentation/auth/login/LoginViewModel.kt

+8-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.kakao.sdk.auth.model.OAuthToken
1212
import com.kakao.sdk.common.model.ClientError
1313
import com.kakao.sdk.common.model.ClientErrorCause
1414
import com.kakao.sdk.user.UserApiClient
15+
import com.sopt.core.type.DialogType
1516
import com.sopt.core.type.SocialType
1617
import com.sopt.core.util.BaseViewModel
1718
import com.sopt.domain.entity.UserEntity
@@ -32,15 +33,11 @@ class LoginViewModel @Inject constructor(
3233
private val userInfoRepository: UserInfoRepository
3334
) : BaseViewModel<LoginSideEffect>() {
3435

35-
private val _showDialog = MutableStateFlow(false)
36-
val showDialog: StateFlow<Boolean> get() = _showDialog
36+
private val _showDialog = MutableStateFlow(Pair(DialogType.LOGIN_GOOGLE, false))
37+
val showDialog: StateFlow<Pair<DialogType, Boolean>> get() = _showDialog
3738

38-
private val _dialogDescription = MutableStateFlow("")
39-
val dialogDescription: StateFlow<String> get() = _dialogDescription
40-
41-
fun showFailLoginDialog(show: Boolean, description: String = "") {
42-
_showDialog.update { show }
43-
_dialogDescription.update { description }
39+
fun showDialog(dialogType: DialogType, isVisible: Boolean) {
40+
_showDialog.update { it.copy(first = dialogType, second = isVisible) }
4441
}
4542

4643
// Kakao Login
@@ -65,7 +62,7 @@ class LoginViewModel @Inject constructor(
6562

6663
error != null -> {
6764
handleError(error, R.string.toast_kakao_login_failed)
68-
showFailLoginDialog(true, description = KAKAO)
65+
showDialog(DialogType.LOGIN_KAKAO, true)
6966
}
7067
}
7168
}
@@ -91,7 +88,7 @@ class LoginViewModel @Inject constructor(
9188
handleGoogleLoginResult(result.credential)
9289
}.onFailure { exception ->
9390
handleError(exception, R.string.toast_google_login_failed)
94-
showFailLoginDialog(true, description = GOOGLE)
91+
showDialog(DialogType.LOGIN_GOOGLE, true)
9592
}
9693
}
9794
}
@@ -105,7 +102,7 @@ class LoginViewModel @Inject constructor(
105102
R.string.toast_google_login_success
106103
)
107104
} else {
108-
showFailLoginDialog(true, description = GOOGLE)
105+
showDialog(DialogType.LOGIN_GOOGLE, true)
109106
}
110107
}
111108

0 commit comments

Comments
 (0)