@@ -9,6 +9,7 @@ import androidx.compose.runtime.setValue
99import com.ninecraft.booket.core.common.constants.ErrorScope
1010import com.ninecraft.booket.core.common.utils.postErrorDialog
1111import com.ninecraft.booket.core.data.api.repository.AuthRepository
12+ import com.ninecraft.booket.core.data.api.repository.RemoteConfigRepository
1213import com.ninecraft.booket.core.data.api.repository.UserRepository
1314import com.ninecraft.booket.core.model.AutoLoginState
1415import com.ninecraft.booket.core.model.OnboardingState
@@ -17,7 +18,7 @@ import com.ninecraft.booket.feature.screens.HomeScreen
1718import com.ninecraft.booket.feature.screens.LoginScreen
1819import com.ninecraft.booket.feature.screens.OnboardingScreen
1920import com.ninecraft.booket.feature.screens.SplashScreen
20- import com.skydoves.compose.effects.RememberedEffect
21+ import com.orhanobut.logger.Logger
2122import com.slack.circuit.codegen.annotations.CircuitInject
2223import com.slack.circuit.retained.collectAsRetainedState
2324import com.slack.circuit.retained.rememberRetained
@@ -34,14 +35,16 @@ class SplashPresenter @AssistedInject constructor(
3435 @Assisted private val navigator : Navigator ,
3536 private val userRepository : UserRepository ,
3637 private val authRepository : AuthRepository ,
38+ private val remoteConfigRepository : RemoteConfigRepository ,
3739) : Presenter<SplashUiState> {
3840
3941 @Composable
4042 override fun present (): SplashUiState {
4143 val scope = rememberCoroutineScope()
4244 val onboardingState by userRepository.onboardingState.collectAsRetainedState(initial = OnboardingState .IDLE )
4345 val autoLoginState by authRepository.autoLoginState.collectAsRetainedState(initial = AutoLoginState .IDLE )
44- var isSplashTimeCompleted by rememberRetained { mutableStateOf(false ) }
46+ var isForceUpdateDialogVisible by rememberRetained { mutableStateOf(false ) }
47+ var sideEffect by rememberRetained { mutableStateOf<SplashSideEffect ?>(null ) }
4548
4649 fun checkTermsAgreement () {
4750 scope.launch {
@@ -64,42 +67,67 @@ class SplashPresenter @AssistedInject constructor(
6467 }
6568 }
6669
67- LaunchedEffect (Unit ) {
68- delay(1000L )
69- isSplashTimeCompleted = true
70- }
71-
72- RememberedEffect (onboardingState, autoLoginState, isSplashTimeCompleted) {
73- if (! isSplashTimeCompleted) return @RememberedEffect
74-
70+ fun proceedToNextScreen () {
7571 when (onboardingState) {
7672 OnboardingState .NOT_COMPLETED -> {
7773 navigator.resetRoot(OnboardingScreen )
7874 }
79-
8075 OnboardingState .COMPLETED -> {
8176 when (autoLoginState) {
8277 AutoLoginState .LOGGED_IN -> {
8378 checkTermsAgreement()
8479 }
85-
8680 AutoLoginState .NOT_LOGGED_IN -> {
8781 navigator.resetRoot(LoginScreen )
8882 }
89-
9083 AutoLoginState .IDLE -> {
9184 // 자동 로그인 상태를 기다리는 중
9285 }
9386 }
9487 }
95-
9688 OnboardingState .IDLE -> {
9789 // 온보딩 상태를 기다리는 중
9890 }
9991 }
10092 }
10193
102- return SplashUiState
94+ fun handleEvent (event : SplashUiEvent ) {
95+ when (event) {
96+ SplashUiEvent .OnUpdateButtonClick -> {
97+ sideEffect = SplashSideEffect .NavigateToPlayStore
98+ }
99+ SplashUiEvent .InitSideEffect -> {
100+ sideEffect = null
101+ }
102+ }
103+ }
104+
105+ LaunchedEffect (onboardingState, autoLoginState) {
106+ delay(1000L )
107+
108+ if (onboardingState == OnboardingState .IDLE || autoLoginState == AutoLoginState .IDLE ) {
109+ return @LaunchedEffect
110+ }
111+
112+ remoteConfigRepository.shouldUpdate()
113+ .onSuccess { shouldUpdate ->
114+ if (shouldUpdate) {
115+ isForceUpdateDialogVisible = true
116+ } else {
117+ proceedToNextScreen()
118+ }
119+ }
120+ .onFailure { exception ->
121+ Logger .e(" ${exception.message} " )
122+ proceedToNextScreen()
123+ }
124+ }
125+
126+ return SplashUiState (
127+ isForceUpdateDialogVisible = isForceUpdateDialogVisible,
128+ sideEffect = sideEffect,
129+ eventSink = ::handleEvent
130+ )
103131 }
104132
105133 @CircuitInject(SplashScreen ::class , ActivityRetainedComponent ::class )
0 commit comments