Skip to content

Commit 58bec16

Browse files
committed
[fix] #79 카카오 계정 관리 클래스 분리 및 인증 로직 수정
1 parent 227006b commit 58bec16

9 files changed

Lines changed: 84 additions & 42 deletions

File tree

core/common/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ android {
1010

1111
dependencies {
1212
api(libs.timber)
13+
api(libs.kakao.user)
1314
implementation(libs.androidx.security.crypto)
1415
implementation(libs.androidx.core.ktx)
15-
1616
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.neki.android.core.common.kakao
2+
3+
import android.content.Context
4+
import com.kakao.sdk.user.UserApiClient
5+
6+
class KakaoAuthHelper(
7+
private val context: Context,
8+
) {
9+
fun login(
10+
onSuccess: (String) -> Unit,
11+
onFailure: (String) -> Unit,
12+
) {
13+
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) {
14+
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
15+
if (error != null) {
16+
onFailure(error.message ?: "카카오 로그인에 실패했습니다.")
17+
} else if (token != null) {
18+
onSuccess(token.idToken!!)
19+
}
20+
}
21+
} else {
22+
UserApiClient.instance.loginWithKakaoAccount(context) { token, error ->
23+
if (error != null) {
24+
onFailure(error.message ?: "카카오 로그인에 실패했습니다.")
25+
} else if (token != null) {
26+
onSuccess(token.idToken!!)
27+
}
28+
}
29+
}
30+
}
31+
32+
fun logout(
33+
onSuccess: () -> Unit,
34+
onFailure: (String) -> Unit,
35+
) {
36+
UserApiClient.instance.logout { error ->
37+
if (error != null) {
38+
onFailure(error.message ?: "카카오 로그아웃에 실패했습니다.")
39+
} else {
40+
onSuccess()
41+
}
42+
}
43+
}
44+
45+
fun unlink(
46+
onSuccess: () -> Unit,
47+
onFailure: (String) -> Unit,
48+
) {
49+
UserApiClient.instance.unlink { error ->
50+
if (error != null) {
51+
onFailure(error.message ?: "카카오 연결 해제에 실패했습니다.")
52+
} else {
53+
onSuccess()
54+
}
55+
}
56+
}
57+
}

feature/auth/impl/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,4 @@ dependencies {
1010
implementation(libs.androidx.activity.compose)
1111

1212
implementation(projects.feature.auth.api)
13-
api(libs.kakao.user)
1413
}

feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/LoginScreen.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
1010
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1111
import com.neki.android.core.designsystem.ui.theme.NekiTheme
1212
import com.neki.android.core.ui.compose.collectWithLifecycle
13+
import com.neki.android.core.common.kakao.KakaoAuthHelper
1314
import com.neki.android.feature.auth.impl.component.LoginContent
14-
import com.neki.android.feature.auth.impl.util.KakaoLoginHelper
1515
import timber.log.Timber
1616

1717
@Composable
@@ -22,13 +22,13 @@ fun LoginRoute(
2222
val uiState by viewModel.store.uiState.collectAsStateWithLifecycle()
2323

2424
val context = LocalContext.current
25-
val kakaoLoginHelper = remember { KakaoLoginHelper(context) }
25+
val kakaoAuthHelper = remember { KakaoAuthHelper(context) }
2626

2727
viewModel.store.sideEffects.collectWithLifecycle { sideEffect ->
2828
when (sideEffect) {
2929
LoginSideEffect.NavigateToHome -> navigateToMain()
3030
LoginSideEffect.NavigateToKakaoRedirectingUri -> {
31-
kakaoLoginHelper.loginWithKakao(
31+
kakaoAuthHelper.login(
3232
onSuccess = { idToken ->
3333
Timber.d("로그인 성공 $idToken")
3434
viewModel.store.onIntent(LoginIntent.SuccessLogin(idToken))

feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/util/KakaoLoginHelper.kt

Lines changed: 0 additions & 34 deletions
This file was deleted.

feature/mypage/impl/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,4 @@ dependencies {
1212
implementation(libs.androidx.activity.compose)
1313
implementation(libs.androidx.appcompat)
1414
implementation(libs.oss.licenses)
15-
implementation(libs.kakao.user)
1615
}

feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageContract.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,6 @@ sealed interface MyPageEffect {
7070
data class MoveAppSettings(val permission: NekiPermission) : MyPageEffect
7171
data class RequestPermission(val permission: NekiPermission) : MyPageEffect
7272
data object OpenOssLicenses : MyPageEffect
73+
data object LogoutWithKakao : MyPageEffect
74+
data object UnlinkWithKakao : MyPageEffect
7375
}

feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageViewModel.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ internal class MyPageViewModel @Inject constructor(
177177

178178
private fun logout(postSideEffect: (MyPageEffect) -> Unit) = viewModelScope.launch {
179179
tokenRepository.clearTokens()
180-
postSideEffect(MyPageEffect.NavigateToLogin)
180+
postSideEffect(MyPageEffect.LogoutWithKakao)
181181
}
182182

183183
private fun withdrawAccount(
@@ -188,7 +188,8 @@ internal class MyPageViewModel @Inject constructor(
188188
authRepository.withdrawAccount()
189189
.onSuccess {
190190
tokenRepository.clearTokens()
191-
postSideEffect(MyPageEffect.NavigateToLogin)
191+
reduce { copy(isLoading = false) }
192+
postSideEffect(MyPageEffect.UnlinkWithKakao)
192193
}
193194
.onFailure {
194195
Timber.e(it)

feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/profile/ProfileSettingScreen.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import androidx.compose.foundation.layout.Column
44
import androidx.compose.foundation.layout.fillMaxSize
55
import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.remember
78
import androidx.compose.ui.Alignment
89
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.platform.LocalContext
911
import androidx.compose.ui.window.DialogProperties
1012
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
1113
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -22,6 +24,8 @@ import com.neki.android.feature.mypage.impl.main.MyPageState
2224
import com.neki.android.feature.mypage.impl.main.MyPageViewModel
2325
import com.neki.android.feature.mypage.impl.profile.component.ProfileSettingTopBar
2426
import com.neki.android.feature.mypage.impl.profile.component.SettingProfileImage
27+
import com.neki.android.core.common.kakao.KakaoAuthHelper
28+
import timber.log.Timber
2529

2630
@Composable
2731
internal fun ProfileSettingRoute(
@@ -30,13 +34,27 @@ internal fun ProfileSettingRoute(
3034
navigateToEditProfile: () -> Unit,
3135
navigateToLogin: () -> Unit,
3236
) {
37+
val context = LocalContext.current
3338
val uiState by viewModel.store.uiState.collectAsStateWithLifecycle()
39+
val kakaoAuthHelper = remember { KakaoAuthHelper(context) }
3440

3541
viewModel.store.sideEffects.collectWithLifecycle { sideEffect ->
3642
when (sideEffect) {
3743
MyPageEffect.NavigateBack -> navigateBack()
3844
MyPageEffect.NavigateToEditProfile -> navigateToEditProfile()
3945
MyPageEffect.NavigateToLogin -> navigateToLogin()
46+
MyPageEffect.LogoutWithKakao -> {
47+
kakaoAuthHelper.logout(
48+
onSuccess = { navigateToLogin() },
49+
onFailure = { Timber.e(it) },
50+
)
51+
}
52+
MyPageEffect.UnlinkWithKakao -> {
53+
kakaoAuthHelper.unlink(
54+
onSuccess = { navigateToLogin() },
55+
onFailure = { Timber.e(it) },
56+
)
57+
}
4058
else -> {}
4159
}
4260
}

0 commit comments

Comments
 (0)