Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Unit>

suspend fun logout(): Result<Unit>

suspend fun agreeTerms(termsAgreed: Boolean): Result<Unit>

val autoLoginState: Flow<AutoLoginState>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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
}
}
}
2 changes: 1 addition & 1 deletion core/designsystem/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<resources>
<string name="app_name">Booket</string>
<string name="app_name">Reed</string>
<string name="network_error_message">네트워크 연결이 불안해요.\n잠시후 다시 이용해주세요.</string>
<string name="server_error_message">이용에 불편을 드려 죄송합니다.\n잠시후 다시 이용해주세요.</string>
<string name="unknown_error_message">알 수 없는 오류가 발생하였습니다.</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ninecraft.booket.core.model

enum class AutoLoginState {
IDLE,
LOGGED_IN,
NOT_LOGGED_IN,
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<SplashUiState> {

@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,
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Loading