Skip to content

Commit 0a9f585

Browse files
committed
[BOOK-197] feat: 자동 로그인 구현 WIP
1 parent 3914a18 commit 0a9f585

File tree

6 files changed

+61
-13
lines changed

6 files changed

+61
-13
lines changed

core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/UserRepository.kt

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

3+
import com.ninecraft.booket.core.model.AutoLoginState
34
import com.ninecraft.booket.core.model.OnboardingState
45
import com.ninecraft.booket.core.model.UserProfileModel
56
import kotlinx.coroutines.flow.Flow
@@ -10,4 +11,6 @@ interface UserRepository {
1011
val onboardingState: Flow<OnboardingState>
1112

1213
suspend fun setOnboardingCompleted(isCompleted: Boolean)
14+
15+
val autoLoginState: Flow<AutoLoginState>
1316
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,37 @@ import com.ninecraft.booket.core.common.utils.runSuspendCatching
44
import com.ninecraft.booket.core.data.api.repository.UserRepository
55
import com.ninecraft.booket.core.data.impl.mapper.toModel
66
import com.ninecraft.booket.core.datastore.api.datasource.OnboardingDataSource
7+
import com.ninecraft.booket.core.datastore.api.datasource.TokenDataSource
8+
import com.ninecraft.booket.core.model.AutoLoginState
9+
import com.ninecraft.booket.core.model.OnboardingState
710
import com.ninecraft.booket.core.network.service.ReedService
11+
import kotlinx.coroutines.flow.Flow
12+
import kotlinx.coroutines.flow.map
13+
import kotlinx.coroutines.flow.onStart
814
import javax.inject.Inject
915

1016
internal class DefaultUserRepository @Inject constructor(
1117
private val service: ReedService,
1218
private val onboardingDataSource: OnboardingDataSource,
19+
private val tokenDataSource: TokenDataSource,
1320
) : UserRepository {
1421
override suspend fun getUserProfile() = runSuspendCatching {
1522
service.getUserProfile().toModel()
1623
}
1724

1825
override val onboardingState = onboardingDataSource.onboardingState
26+
.onStart { emit(OnboardingState.IDLE) }
1927

2028
override suspend fun setOnboardingCompleted(isCompleted: Boolean) {
2129
onboardingDataSource.setOnboardingCompleted(isCompleted)
2230
}
31+
32+
override val autoLoginState: Flow<AutoLoginState> = tokenDataSource.accessToken
33+
.map { accessToken ->
34+
when {
35+
accessToken.isBlank() -> AutoLoginState.NOT_LOGGED_IN
36+
else -> AutoLoginState.LOGGED_IN
37+
}
38+
}
39+
.onStart { emit(AutoLoginState.IDLE) }
2340
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.ninecraft.booket.core.datastore.api.datasource
2+
3+
import com.ninecraft.booket.core.model.AutoLoginState
4+
import kotlinx.coroutines.flow.Flow
5+
6+
interface AutoLoginDataSource {
7+
val autoLoginState: Flow<AutoLoginState>
8+
}
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: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package com.ninecraft.booket.feature.main.splash
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.getValue
55
import com.ninecraft.booket.core.data.api.repository.UserRepository
6+
import com.ninecraft.booket.core.model.AutoLoginState
67
import com.ninecraft.booket.core.model.OnboardingState
8+
import com.ninecraft.booket.feature.screens.HomeScreen
79
import com.ninecraft.booket.feature.screens.LoginScreen
810
import com.ninecraft.booket.feature.screens.OnboardingScreen
911
import com.ninecraft.booket.feature.screens.SplashScreen
@@ -25,30 +27,38 @@ class SplashPresenter @AssistedInject constructor(
2527
@Composable
2628
override fun present(): SplashUiState {
2729
val onboardingState by userRepository.onboardingState.collectAsRetainedState(initial = OnboardingState.IDLE)
30+
val autoLoginState by userRepository.autoLoginState.collectAsRetainedState(initial = AutoLoginState.IDLE)
2831

29-
RememberedEffect(onboardingState) {
32+
RememberedEffect(onboardingState, autoLoginState) {
3033
when (onboardingState) {
31-
OnboardingState.IDLE -> {
32-
// 초기 진입 상태
33-
}
34-
3534
OnboardingState.NOT_COMPLETED -> {
3635
navigator.resetRoot(OnboardingScreen)
3736
}
3837

3938
OnboardingState.COMPLETED -> {
40-
navigator.resetRoot(LoginScreen)
39+
when (autoLoginState) {
40+
AutoLoginState.LOGGED_IN -> {
41+
navigator.resetRoot(HomeScreen)
42+
}
43+
AutoLoginState.NOT_LOGGED_IN -> {
44+
navigator.resetRoot(LoginScreen)
45+
}
46+
AutoLoginState.IDLE -> {
47+
// 자동 로그인 상태를 기다리는 중
48+
}
49+
}
50+
}
51+
52+
OnboardingState.IDLE -> {
53+
// 온보딩 상태를 기다리는 중
4154
}
4255
}
4356
}
4457

4558
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-
},
59+
idle = onboardingState == OnboardingState.IDLE || autoLoginState == AutoLoginState.IDLE,
60+
onboardingState = onboardingState,
61+
autoLoginState = autoLoginState,
5262
)
5363
}
5464

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)