Skip to content

Commit 42923f5

Browse files
authored
Merge pull request #97 from YAPP-Github/BOOK-197-feature/#86
feat: 자동 로그인 구현
2 parents adb8e0b + 554f9f3 commit 42923f5

File tree

6 files changed

+56
-17
lines changed

6 files changed

+56
-17
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.ninecraft.booket.core.data.api.repository
22

3+
import com.ninecraft.booket.core.model.AutoLoginState
4+
import kotlinx.coroutines.flow.Flow
5+
36
interface AuthRepository {
47
suspend fun login(accessToken: String): Result<Unit>
58

69
suspend fun logout(): Result<Unit>
710

811
suspend fun agreeTerms(termsAgreed: Boolean): Result<Unit>
12+
13+
val autoLoginState: Flow<AutoLoginState>
914
}

core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ package com.ninecraft.booket.core.data.impl.repository
33
import com.ninecraft.booket.core.common.utils.runSuspendCatching
44
import com.ninecraft.booket.core.data.api.repository.AuthRepository
55
import com.ninecraft.booket.core.datastore.api.datasource.TokenDataSource
6+
import com.ninecraft.booket.core.model.AutoLoginState
67
import com.ninecraft.booket.core.network.request.LoginRequest
78
import com.ninecraft.booket.core.network.request.TermsAgreementRequest
89
import com.ninecraft.booket.core.network.service.ReedService
10+
import kotlinx.coroutines.flow.map
911
import javax.inject.Inject
1012

1113
private const val KAKAO_PROVIDER_TYPE = "KAKAO"
1214

1315
internal class DefaultAuthRepository @Inject constructor(
1416
private val service: ReedService,
15-
private val tokenDatasource: TokenDataSource,
17+
private val tokenDataSource: TokenDataSource,
1618
) : AuthRepository {
1719
override suspend fun login(accessToken: String) = runSuspendCatching {
1820
val response = service.login(
@@ -35,13 +37,21 @@ internal class DefaultAuthRepository @Inject constructor(
3537
}
3638

3739
private suspend fun saveTokens(accessToken: String, refreshToken: String) {
38-
tokenDatasource.apply {
40+
tokenDataSource.apply {
3941
setAccessToken(accessToken)
4042
setRefreshToken(refreshToken)
4143
}
4244
}
4345

4446
private suspend fun clearTokens() {
45-
tokenDatasource.clearTokens()
47+
tokenDataSource.clearTokens()
4648
}
49+
50+
override val autoLoginState = tokenDataSource.accessToken
51+
.map { accessToken ->
52+
when {
53+
accessToken.isBlank() -> AutoLoginState.NOT_LOGGED_IN
54+
else -> AutoLoginState.LOGGED_IN
55+
}
56+
}
4757
}

core/designsystem/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<resources>
2-
<string name="app_name">Booket</string>
2+
<string name="app_name">Reed</string>
33
<string name="network_error_message">네트워크 연결이 불안해요.\n잠시후 다시 이용해주세요.</string>
44
<string name="server_error_message">이용에 불편을 드려 죄송합니다.\n잠시후 다시 이용해주세요.</string>
55
<string name="unknown_error_message">알 수 없는 오류가 발생하였습니다.</string>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.ninecraft.booket.core.model
2+
3+
enum class AutoLoginState {
4+
IDLE,
5+
LOGGED_IN,
6+
NOT_LOGGED_IN,
7+
}

feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package com.ninecraft.booket.feature.main.splash
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.getValue
5+
import com.ninecraft.booket.core.data.api.repository.AuthRepository
56
import com.ninecraft.booket.core.data.api.repository.UserRepository
7+
import com.ninecraft.booket.core.model.AutoLoginState
68
import com.ninecraft.booket.core.model.OnboardingState
9+
import com.ninecraft.booket.feature.screens.BottomNavigationScreen
710
import com.ninecraft.booket.feature.screens.LoginScreen
811
import com.ninecraft.booket.feature.screens.OnboardingScreen
912
import com.ninecraft.booket.feature.screens.SplashScreen
@@ -20,35 +23,46 @@ import dagger.hilt.android.components.ActivityRetainedComponent
2023
class SplashPresenter @AssistedInject constructor(
2124
@Assisted private val navigator: Navigator,
2225
private val userRepository: UserRepository,
26+
private val authRepository: AuthRepository,
2327
) : Presenter<SplashUiState> {
2428

2529
@Composable
2630
override fun present(): SplashUiState {
2731
val onboardingState by userRepository.onboardingState.collectAsRetainedState(initial = OnboardingState.IDLE)
32+
val autoLoginState by authRepository.autoLoginState.collectAsRetainedState(initial = AutoLoginState.IDLE)
2833

29-
RememberedEffect(onboardingState) {
34+
RememberedEffect(onboardingState, autoLoginState) {
3035
when (onboardingState) {
31-
OnboardingState.IDLE -> {
32-
// 초기 진입 상태
33-
}
34-
3536
OnboardingState.NOT_COMPLETED -> {
3637
navigator.resetRoot(OnboardingScreen)
3738
}
3839

3940
OnboardingState.COMPLETED -> {
40-
navigator.resetRoot(LoginScreen)
41+
when (autoLoginState) {
42+
AutoLoginState.LOGGED_IN -> {
43+
navigator.resetRoot(BottomNavigationScreen)
44+
}
45+
46+
AutoLoginState.NOT_LOGGED_IN -> {
47+
navigator.resetRoot(LoginScreen)
48+
}
49+
50+
AutoLoginState.IDLE -> {
51+
// 자동 로그인 상태를 기다리는 중
52+
}
53+
}
54+
}
55+
56+
OnboardingState.IDLE -> {
57+
// 온보딩 상태를 기다리는 중
4158
}
4259
}
4360
}
4461

4562
return SplashUiState(
46-
idle = onboardingState == OnboardingState.IDLE,
47-
isOnboardingCompleted = when (onboardingState) {
48-
OnboardingState.IDLE -> null
49-
OnboardingState.NOT_COMPLETED -> false
50-
OnboardingState.COMPLETED -> true
51-
},
63+
idle = onboardingState == OnboardingState.IDLE || autoLoginState == AutoLoginState.IDLE,
64+
onboardingState = onboardingState,
65+
autoLoginState = autoLoginState,
5266
)
5367
}
5468

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.ninecraft.booket.feature.main.splash
22

3+
import com.ninecraft.booket.core.model.AutoLoginState
4+
import com.ninecraft.booket.core.model.OnboardingState
35
import com.slack.circuit.runtime.CircuitUiState
46

57
data class SplashUiState(
68
val idle: Boolean = true,
7-
val isOnboardingCompleted: Boolean? = null,
9+
val onboardingState: OnboardingState = OnboardingState.IDLE,
10+
val autoLoginState: AutoLoginState = AutoLoginState.IDLE,
811
) : CircuitUiState

0 commit comments

Comments
 (0)