Skip to content

Commit c89f031

Browse files
committed
Refactor: Splash MviviewModel 제거
1 parent d3b4c1d commit c89f031

5 files changed

Lines changed: 47 additions & 109 deletions

File tree

presentation/src/main/java/com/threegap/bitnagil/presentation/splash/SplashScreen.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.threegap.bitnagil.presentation.splash
33
import androidx.activity.ComponentActivity
44
import androidx.compose.animation.core.tween
55
import androidx.compose.animation.fadeIn
6-
import androidx.compose.foundation.background
76
import androidx.compose.foundation.layout.Arrangement
87
import androidx.compose.foundation.layout.Box
98
import androidx.compose.foundation.layout.Column
@@ -21,28 +20,27 @@ import androidx.compose.ui.platform.LocalContext
2120
import androidx.compose.ui.tooling.preview.Preview
2221
import androidx.compose.ui.unit.dp
2322
import androidx.hilt.navigation.compose.hiltViewModel
24-
import androidx.lifecycle.compose.collectAsStateWithLifecycle
25-
import com.threegap.bitnagil.designsystem.BitnagilTheme
2623
import com.threegap.bitnagil.designsystem.R
2724
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2825
import com.threegap.bitnagil.presentation.splash.component.template.BitnagilLottieAnimation
2926
import com.threegap.bitnagil.presentation.splash.component.template.ForceUpdateDialog
3027
import com.threegap.bitnagil.presentation.splash.model.SplashSideEffect
3128
import com.threegap.bitnagil.presentation.splash.util.openAppInPlayStore
29+
import org.orbitmvi.orbit.compose.collectAsState
3230
import org.orbitmvi.orbit.compose.collectSideEffect
3331
import kotlin.system.exitProcess
3432

3533
@Composable
3634
fun SplashScreenContainer(
35+
viewModel: SplashViewModel = hiltViewModel(),
3736
navigateToLogin: () -> Unit,
3837
navigateToTermsAgreement: () -> Unit,
3938
navigateToOnboarding: () -> Unit,
4039
navigateToHome: () -> Unit,
41-
viewModel: SplashViewModel = hiltViewModel(),
4240
) {
4341
val context = LocalContext.current
4442
val activity = context as? ComponentActivity
45-
val uiState by viewModel.stateFlow.collectAsStateWithLifecycle()
43+
val uiState by viewModel.collectAsState()
4644

4745
viewModel.collectSideEffect { sideEffect ->
4846
when (sideEffect) {
@@ -71,14 +69,11 @@ fun SplashScreenContainer(
7169
@Composable
7270
private fun SplashScreen(
7371
onCompleted: () -> Unit,
74-
modifier: Modifier = Modifier,
7572
) {
7673
var showIcon by remember { mutableStateOf(false) }
7774

7875
Column(
79-
modifier = modifier
80-
.fillMaxSize()
81-
.background(BitnagilTheme.colors.white),
76+
modifier = Modifier.fillMaxSize(),
8277
verticalArrangement = Arrangement.Center,
8378
horizontalAlignment = Alignment.CenterHorizontally,
8479
) {
@@ -88,9 +83,7 @@ private fun SplashScreen(
8883
BitnagilLottieAnimation(
8984
lottieJson = R.raw.splash_lottie,
9085
onComplete = onCompleted,
91-
onStart = {
92-
showIcon = true
93-
},
86+
onStart = { showIcon = true },
9487
maxFrame = 120,
9588
modifier = Modifier
9689
.padding(bottom = 36.dp)
Lines changed: 27 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,74 @@
11
package com.threegap.bitnagil.presentation.splash
22

3-
import androidx.lifecycle.SavedStateHandle
3+
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
55
import com.threegap.bitnagil.domain.auth.model.UserRole
66
import com.threegap.bitnagil.domain.auth.usecase.AutoLoginUseCase
77
import com.threegap.bitnagil.domain.version.usecase.CheckUpdateRequirementUseCase
8-
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviViewModel
9-
import com.threegap.bitnagil.presentation.splash.model.SplashIntent
108
import com.threegap.bitnagil.presentation.splash.model.SplashSideEffect
119
import com.threegap.bitnagil.presentation.splash.model.SplashState
1210
import dagger.hilt.android.lifecycle.HiltViewModel
1311
import kotlinx.coroutines.delay
1412
import kotlinx.coroutines.launch
1513
import kotlinx.coroutines.withTimeoutOrNull
16-
import org.orbitmvi.orbit.syntax.Syntax
14+
import org.orbitmvi.orbit.Container
15+
import org.orbitmvi.orbit.ContainerHost
16+
import org.orbitmvi.orbit.viewmodel.container
1717
import javax.inject.Inject
1818

1919
@HiltViewModel
2020
class SplashViewModel @Inject constructor(
21-
savedStateHandle: SavedStateHandle,
2221
private val checkUpdateRequirementUseCase: CheckUpdateRequirementUseCase,
2322
private val autoLoginUseCase: AutoLoginUseCase,
24-
) : MviViewModel<SplashState, SplashSideEffect, SplashIntent>(
25-
initState = SplashState(),
26-
savedStateHandle = savedStateHandle,
27-
) {
23+
) : ContainerHost<SplashState, SplashSideEffect>, ViewModel() {
24+
25+
override val container: Container<SplashState, SplashSideEffect> = container(initialState = SplashState.INIT)
2826

2927
init {
3028
performForceUpdateCheck()
3129
}
3230

33-
override suspend fun Syntax<SplashState, SplashSideEffect>.reduceState(
34-
intent: SplashIntent,
35-
state: SplashState,
36-
): SplashState? =
37-
when (intent) {
38-
is SplashIntent.SetUserRole -> {
39-
state.copy(
40-
userRole = intent.userRole,
41-
isAutoLoginCompleted = true,
42-
)
43-
}
44-
45-
is SplashIntent.SetForceUpdateResult -> {
46-
state.copy(
47-
forceUpdateRequired = intent.isRequired,
48-
isForceUpdateCheckCompleted = true,
49-
)
50-
}
51-
52-
is SplashIntent.NavigateToLogin -> {
53-
sendSideEffect(SplashSideEffect.NavigateToLogin)
54-
null
55-
}
56-
57-
is SplashIntent.NavigateToHome -> {
58-
sendSideEffect(SplashSideEffect.NavigateToHome)
59-
null
60-
}
61-
62-
is SplashIntent.NavigateToTermsAgreement -> {
63-
sendSideEffect(SplashSideEffect.NavigateToTermsAgreement)
64-
null
65-
}
66-
67-
is SplashIntent.NavigateToOnboarding -> {
68-
sendSideEffect(SplashSideEffect.NavigateToOnboarding)
69-
null
70-
}
71-
}
72-
7331
private fun performForceUpdateCheck() {
74-
viewModelScope.launch {
32+
intent {
7533
val isUpdateRequired = withTimeoutOrNull(5000) {
7634
checkUpdateRequirementUseCase().getOrElse { false }
7735
} ?: false
36+
reduce { state.copy(forceUpdateRequired = isUpdateRequired, isForceUpdateCheckCompleted = true) }
7837

79-
sendIntent(SplashIntent.SetForceUpdateResult(isUpdateRequired))
80-
81-
if (!isUpdateRequired) {
82-
performAutoLogin()
83-
}
38+
if (!isUpdateRequired) { performAutoLogin() }
8439
}
8540
}
8641

8742
private fun performAutoLogin() {
88-
viewModelScope.launch {
43+
intent {
8944
try {
9045
val userRole = withTimeoutOrNull(5000) {
9146
autoLoginUseCase()
9247
}
93-
sendIntent(SplashIntent.SetUserRole(userRole))
48+
reduce { state.copy(userRole = userRole, isAutoLoginCompleted = true) }
9449
} catch (e: Exception) {
95-
sendIntent(SplashIntent.SetUserRole(null))
50+
reduce { state.copy(userRole = null, isAutoLoginCompleted = true) }
9651
}
9752
}
9853
}
9954

10055
fun onAnimationCompleted() {
101-
val splashState = container.stateFlow.value
102-
103-
if (splashState.forceUpdateRequired) return
104-
105-
if (!splashState.isAutoLoginCompleted) {
106-
viewModelScope.launch {
107-
delay(100)
108-
onAnimationCompleted()
56+
intent {
57+
if (state.forceUpdateRequired) return@intent
58+
if (!state.isAutoLoginCompleted) {
59+
viewModelScope.launch {
60+
delay(100)
61+
onAnimationCompleted()
62+
}
63+
return@intent
10964
}
110-
return
111-
}
11265

113-
when (splashState.userRole) {
114-
UserRole.GUEST -> sendIntent(SplashIntent.NavigateToTermsAgreement)
115-
UserRole.USER -> sendIntent(SplashIntent.NavigateToHome)
116-
UserRole.ONBOARDING -> sendIntent(SplashIntent.NavigateToOnboarding)
117-
else -> sendIntent(SplashIntent.NavigateToLogin)
66+
when (state.userRole) {
67+
UserRole.GUEST -> postSideEffect(SplashSideEffect.NavigateToTermsAgreement)
68+
UserRole.USER -> postSideEffect(SplashSideEffect.NavigateToHome)
69+
UserRole.ONBOARDING -> postSideEffect(SplashSideEffect.NavigateToOnboarding)
70+
else -> postSideEffect(SplashSideEffect.NavigateToLogin)
71+
}
11872
}
11973
}
12074
}

presentation/src/main/java/com/threegap/bitnagil/presentation/splash/model/SplashIntent.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

presentation/src/main/java/com/threegap/bitnagil/presentation/splash/model/SplashSideEffect.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.threegap.bitnagil.presentation.splash.model
22

3-
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect
4-
5-
sealed interface SplashSideEffect : MviSideEffect {
3+
sealed interface SplashSideEffect {
64
data object NavigateToLogin : SplashSideEffect
75
data object NavigateToHome : SplashSideEffect
86
data object NavigateToTermsAgreement : SplashSideEffect
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package com.threegap.bitnagil.presentation.splash.model
22

33
import com.threegap.bitnagil.domain.auth.model.UserRole
4-
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviState
5-
import kotlinx.parcelize.Parcelize
64

7-
@Parcelize
85
data class SplashState(
9-
val userRole: UserRole? = null,
10-
val isAutoLoginCompleted: Boolean = false,
11-
val isForceUpdateCheckCompleted: Boolean = false,
12-
val forceUpdateRequired: Boolean = false,
13-
) : MviState
6+
val userRole: UserRole?,
7+
val isAutoLoginCompleted: Boolean,
8+
val isForceUpdateCheckCompleted: Boolean,
9+
val forceUpdateRequired: Boolean,
10+
) {
11+
companion object {
12+
val INIT = SplashState(
13+
userRole = null,
14+
isAutoLoginCompleted = false,
15+
isForceUpdateCheckCompleted = false,
16+
forceUpdateRequired = false,
17+
)
18+
}
19+
}

0 commit comments

Comments
 (0)