diff --git a/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt b/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt index 2689f5d0..91476806 100644 --- a/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt +++ b/core/data/api/src/main/kotlin/com/ninecraft/booket/core/data/api/repository/AuthRepository.kt @@ -1,9 +1,14 @@ package com.ninecraft.booket.core.data.api.repository +import com.ninecraft.booket.core.model.AutoLoginState +import kotlinx.coroutines.flow.Flow + interface AuthRepository { suspend fun login(accessToken: String): Result suspend fun logout(): Result suspend fun agreeTerms(termsAgreed: Boolean): Result + + val autoLoginState: Flow } diff --git a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt index 85f70cd3..5ecda13b 100644 --- a/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt +++ b/core/data/impl/src/main/kotlin/com/ninecraft/booket/core/data/impl/repository/DefaultAuthRepository.kt @@ -3,16 +3,18 @@ package com.ninecraft.booket.core.data.impl.repository import com.ninecraft.booket.core.common.utils.runSuspendCatching import com.ninecraft.booket.core.data.api.repository.AuthRepository import com.ninecraft.booket.core.datastore.api.datasource.TokenDataSource +import com.ninecraft.booket.core.model.AutoLoginState import com.ninecraft.booket.core.network.request.LoginRequest import com.ninecraft.booket.core.network.request.TermsAgreementRequest import com.ninecraft.booket.core.network.service.ReedService +import kotlinx.coroutines.flow.map import javax.inject.Inject private const val KAKAO_PROVIDER_TYPE = "KAKAO" internal class DefaultAuthRepository @Inject constructor( private val service: ReedService, - private val tokenDatasource: TokenDataSource, + private val tokenDataSource: TokenDataSource, ) : AuthRepository { override suspend fun login(accessToken: String) = runSuspendCatching { val response = service.login( @@ -35,13 +37,21 @@ internal class DefaultAuthRepository @Inject constructor( } private suspend fun saveTokens(accessToken: String, refreshToken: String) { - tokenDatasource.apply { + tokenDataSource.apply { setAccessToken(accessToken) setRefreshToken(refreshToken) } } private suspend fun clearTokens() { - tokenDatasource.clearTokens() + tokenDataSource.clearTokens() } + + override val autoLoginState = tokenDataSource.accessToken + .map { accessToken -> + when { + accessToken.isBlank() -> AutoLoginState.NOT_LOGGED_IN + else -> AutoLoginState.LOGGED_IN + } + } } diff --git a/core/designsystem/src/main/res/values/strings.xml b/core/designsystem/src/main/res/values/strings.xml index e5e106d9..514c5ee6 100644 --- a/core/designsystem/src/main/res/values/strings.xml +++ b/core/designsystem/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - Booket + Reed 네트워크 연결이 불안해요.\n잠시후 다시 이용해주세요. 이용에 불편을 드려 죄송합니다.\n잠시후 다시 이용해주세요. 알 수 없는 오류가 발생하였습니다. diff --git a/core/model/src/main/kotlin/com/ninecraft/booket/core/model/AutoLoginState.kt b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/AutoLoginState.kt new file mode 100644 index 00000000..fead4e57 --- /dev/null +++ b/core/model/src/main/kotlin/com/ninecraft/booket/core/model/AutoLoginState.kt @@ -0,0 +1,7 @@ +package com.ninecraft.booket.core.model + +enum class AutoLoginState { + IDLE, + LOGGED_IN, + NOT_LOGGED_IN, +} diff --git a/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt b/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt index 45967aef..1e1c200c 100644 --- a/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt +++ b/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashPresenter.kt @@ -2,8 +2,11 @@ package com.ninecraft.booket.feature.main.splash import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import com.ninecraft.booket.core.data.api.repository.AuthRepository import com.ninecraft.booket.core.data.api.repository.UserRepository +import com.ninecraft.booket.core.model.AutoLoginState import com.ninecraft.booket.core.model.OnboardingState +import com.ninecraft.booket.feature.screens.BottomNavigationScreen import com.ninecraft.booket.feature.screens.LoginScreen import com.ninecraft.booket.feature.screens.OnboardingScreen import com.ninecraft.booket.feature.screens.SplashScreen @@ -20,35 +23,46 @@ import dagger.hilt.android.components.ActivityRetainedComponent class SplashPresenter @AssistedInject constructor( @Assisted private val navigator: Navigator, private val userRepository: UserRepository, + private val authRepository: AuthRepository, ) : Presenter { @Composable override fun present(): SplashUiState { val onboardingState by userRepository.onboardingState.collectAsRetainedState(initial = OnboardingState.IDLE) + val autoLoginState by authRepository.autoLoginState.collectAsRetainedState(initial = AutoLoginState.IDLE) - RememberedEffect(onboardingState) { + RememberedEffect(onboardingState, autoLoginState) { when (onboardingState) { - OnboardingState.IDLE -> { - // 초기 진입 상태 - } - OnboardingState.NOT_COMPLETED -> { navigator.resetRoot(OnboardingScreen) } OnboardingState.COMPLETED -> { - navigator.resetRoot(LoginScreen) + when (autoLoginState) { + AutoLoginState.LOGGED_IN -> { + navigator.resetRoot(BottomNavigationScreen) + } + + AutoLoginState.NOT_LOGGED_IN -> { + navigator.resetRoot(LoginScreen) + } + + AutoLoginState.IDLE -> { + // 자동 로그인 상태를 기다리는 중 + } + } + } + + OnboardingState.IDLE -> { + // 온보딩 상태를 기다리는 중 } } } return SplashUiState( - idle = onboardingState == OnboardingState.IDLE, - isOnboardingCompleted = when (onboardingState) { - OnboardingState.IDLE -> null - OnboardingState.NOT_COMPLETED -> false - OnboardingState.COMPLETED -> true - }, + idle = onboardingState == OnboardingState.IDLE || autoLoginState == AutoLoginState.IDLE, + onboardingState = onboardingState, + autoLoginState = autoLoginState, ) } diff --git a/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashUiState.kt b/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashUiState.kt index e56c46fb..94c8c158 100644 --- a/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashUiState.kt +++ b/feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/splash/SplashUiState.kt @@ -1,8 +1,11 @@ package com.ninecraft.booket.feature.main.splash +import com.ninecraft.booket.core.model.AutoLoginState +import com.ninecraft.booket.core.model.OnboardingState import com.slack.circuit.runtime.CircuitUiState data class SplashUiState( val idle: Boolean = true, - val isOnboardingCompleted: Boolean? = null, + val onboardingState: OnboardingState = OnboardingState.IDLE, + val autoLoginState: AutoLoginState = AutoLoginState.IDLE, ) : CircuitUiState