Skip to content

Commit d3b4c1d

Browse files
committed
Refactor: TermsAgreement MviViewModel 제거
1 parent 63ac757 commit d3b4c1d

5 files changed

Lines changed: 99 additions & 164 deletions

File tree

presentation/src/main/java/com/threegap/bitnagil/presentation/terms/TermsAgreementScreen.kt

Lines changed: 25 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.threegap.bitnagil.presentation.terms
22

3-
import androidx.compose.foundation.background
43
import androidx.compose.foundation.layout.Column
54
import androidx.compose.foundation.layout.Spacer
65
import androidx.compose.foundation.layout.fillMaxSize
@@ -15,83 +14,55 @@ import androidx.compose.ui.Modifier
1514
import androidx.compose.ui.tooling.preview.Preview
1615
import androidx.compose.ui.unit.dp
1716
import androidx.hilt.navigation.compose.hiltViewModel
18-
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1917
import com.threegap.bitnagil.designsystem.BitnagilTheme
2018
import com.threegap.bitnagil.designsystem.component.atom.BitnagilTextButton
2119
import com.threegap.bitnagil.designsystem.component.block.BitnagilTopBar
2220
import com.threegap.bitnagil.presentation.terms.component.TermsAgreementItem
2321
import com.threegap.bitnagil.presentation.terms.component.ToggleAllAgreementsItem
24-
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementIntent
2522
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementSideEffect
2623
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementState
24+
import org.orbitmvi.orbit.compose.collectAsState
2725
import org.orbitmvi.orbit.compose.collectSideEffect
2826

2927
@Composable
3028
fun TermsAgreementScreenContainer(
29+
viewModel: TermsAgreementViewModel = hiltViewModel(),
3130
navigateToTermsOfService: () -> Unit,
3231
navigateToPrivacyPolicy: () -> Unit,
3332
navigateToOnBoarding: () -> Unit,
3433
navigateToBack: () -> Unit,
35-
viewmodel: TermsAgreementViewModel = hiltViewModel(),
3634
) {
37-
val uiState by viewmodel.stateFlow.collectAsStateWithLifecycle()
35+
val uiState by viewModel.collectAsState()
3836

39-
viewmodel.collectSideEffect { sideEffect ->
37+
viewModel.collectSideEffect { sideEffect ->
4038
when (sideEffect) {
41-
is TermsAgreementSideEffect.NavigateToPrivacyPolicy -> {
42-
navigateToPrivacyPolicy()
43-
}
44-
45-
is TermsAgreementSideEffect.NavigateToTermsOfService -> {
46-
navigateToTermsOfService()
47-
}
48-
49-
is TermsAgreementSideEffect.NavigateToOnBoarding -> {
50-
navigateToOnBoarding()
51-
}
52-
53-
is TermsAgreementSideEffect.NavigateToBack -> {
54-
navigateToBack()
55-
}
39+
is TermsAgreementSideEffect.NavigateToPrivacyPolicy -> navigateToPrivacyPolicy()
40+
is TermsAgreementSideEffect.NavigateToTermsOfService -> navigateToTermsOfService()
41+
is TermsAgreementSideEffect.NavigateToOnBoarding -> navigateToOnBoarding()
42+
is TermsAgreementSideEffect.NavigateToBack -> navigateToBack()
5643
}
5744
}
5845

5946
TermsAgreementScreen(
6047
uiState = uiState,
61-
onToggleAllAgreements = {
62-
viewmodel.sendIntent(TermsAgreementIntent.ToggleAllAgreements(it))
63-
},
64-
onToggleTermsOfService = {
65-
viewmodel.sendIntent(TermsAgreementIntent.ToggleTermsOfService(it))
66-
},
67-
onTogglePrivacyPolicy = {
68-
viewmodel.sendIntent(TermsAgreementIntent.TogglePrivacyPolicy(it))
69-
},
70-
onToggleOverFourteen = {
71-
viewmodel.sendIntent(TermsAgreementIntent.ToggleOverFourteen(it))
72-
},
73-
onShowTermsOfService = {
74-
viewmodel.sendIntent(TermsAgreementIntent.ShowTermsOfService)
75-
},
76-
onShowPrivacyPolicy = {
77-
viewmodel.sendIntent(TermsAgreementIntent.ShowPrivacyPolicy)
78-
},
79-
onStartButtonClick = {
80-
viewmodel.submitTermsAgreement()
81-
},
82-
onBackButtonClick = {
83-
viewmodel.sendIntent(TermsAgreementIntent.BackButtonClick)
84-
},
48+
onToggleAllAgreements = viewModel::updateAllAgreements,
49+
onToggleTermsOfService = viewModel::updateTermsOfService,
50+
onTogglePrivacyPolicy = viewModel::updatePrivacyPolicy,
51+
onToggleOverFourteen = viewModel::updateOverFourteen,
52+
onShowTermsOfService = viewModel::navigateToTermsOfService,
53+
onShowPrivacyPolicy = viewModel::navigateToPrivacyPolicy,
54+
onStartButtonClick = viewModel::submitTermsAgreement,
55+
onBackButtonClick = viewModel::navigateToBack,
8556
)
8657
}
8758

8859
@Composable
8960
private fun TermsAgreementScreen(
9061
uiState: TermsAgreementState,
9162
onToggleAllAgreements: (Boolean) -> Unit,
92-
onToggleTermsOfService: (Boolean) -> Unit,
93-
onTogglePrivacyPolicy: (Boolean) -> Unit,
94-
onToggleOverFourteen: (Boolean) -> Unit,
63+
onToggleTermsOfService: () -> Unit,
64+
onTogglePrivacyPolicy: () -> Unit,
65+
onToggleOverFourteen: () -> Unit,
9566
onShowTermsOfService: () -> Unit,
9667
onShowPrivacyPolicy: () -> Unit,
9768
onStartButtonClick: () -> Unit,
@@ -101,7 +72,6 @@ private fun TermsAgreementScreen(
10172
Column(
10273
modifier = modifier
10374
.fillMaxSize()
104-
.background(BitnagilTheme.colors.white)
10575
.statusBarsPadding(),
10676
) {
10777
BitnagilTopBar(
@@ -117,7 +87,7 @@ private fun TermsAgreementScreen(
11787
) {
11888
Text(
11989
text = "빛나길 이용을 위해\n필수 약관에 동의해 주세요.",
120-
color = BitnagilTheme.colors.navy500,
90+
color = BitnagilTheme.colors.coolGray10,
12191
style = BitnagilTheme.typography.title2Bold,
12292
)
12393

@@ -132,23 +102,23 @@ private fun TermsAgreementScreen(
132102

133103
TermsAgreementItem(
134104
title = "(필수) 서비스 이용약관 동의",
135-
onCheckedChange = { onToggleTermsOfService(!uiState.agreedTermsOfService) },
105+
onCheckedChange = { onToggleTermsOfService() },
136106
isChecked = uiState.agreedTermsOfService,
137107
showMore = true,
138108
onClickShowMore = onShowTermsOfService,
139109
)
140110

141111
TermsAgreementItem(
142112
title = "(필수) 개인정보 수집·이용 동의",
143-
onCheckedChange = { onTogglePrivacyPolicy(!uiState.agreedPrivacyPolicy) },
113+
onCheckedChange = { onTogglePrivacyPolicy() },
144114
isChecked = uiState.agreedPrivacyPolicy,
145115
showMore = true,
146116
onClickShowMore = onShowPrivacyPolicy,
147117
)
148118

149119
TermsAgreementItem(
150120
title = "(필수) 만 14세 이상입니다.",
151-
onCheckedChange = { onToggleOverFourteen(!uiState.agreedOverFourteen) },
121+
onCheckedChange = { onToggleOverFourteen() },
152122
isChecked = uiState.agreedOverFourteen,
153123
)
154124
}
@@ -167,11 +137,11 @@ private fun TermsAgreementScreen(
167137
}
168138
}
169139

170-
@Preview
140+
@Preview(showBackground = true)
171141
@Composable
172142
private fun TermsAgreementScreenPreview() {
173143
TermsAgreementScreen(
174-
uiState = TermsAgreementState(),
144+
uiState = TermsAgreementState.INIT,
175145
onToggleAllAgreements = {},
176146
onToggleTermsOfService = {},
177147
onTogglePrivacyPolicy = {},
Lines changed: 59 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,94 @@
11
package com.threegap.bitnagil.presentation.terms
22

33
import android.util.Log
4-
import androidx.lifecycle.SavedStateHandle
5-
import androidx.lifecycle.viewModelScope
4+
import androidx.lifecycle.ViewModel
65
import com.threegap.bitnagil.domain.auth.model.TermsAgreement
76
import com.threegap.bitnagil.domain.auth.usecase.SubmitTermsAgreementUseCase
8-
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviViewModel
9-
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementIntent
107
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementSideEffect
118
import com.threegap.bitnagil.presentation.terms.model.TermsAgreementState
129
import dagger.hilt.android.lifecycle.HiltViewModel
13-
import kotlinx.coroutines.launch
14-
import org.orbitmvi.orbit.syntax.Syntax
10+
import org.orbitmvi.orbit.Container
11+
import org.orbitmvi.orbit.ContainerHost
12+
import org.orbitmvi.orbit.viewmodel.container
1513
import javax.inject.Inject
1614

1715
@HiltViewModel
1816
class TermsAgreementViewModel @Inject constructor(
19-
private val savedStateHandle: SavedStateHandle,
2017
private val submitTermsAgreementUseCase: SubmitTermsAgreementUseCase,
21-
) : MviViewModel<TermsAgreementState, TermsAgreementSideEffect, TermsAgreementIntent>(
22-
initState = TermsAgreementState(),
23-
savedStateHandle = savedStateHandle,
24-
) {
25-
override suspend fun Syntax<TermsAgreementState, TermsAgreementSideEffect>.reduceState(
26-
intent: TermsAgreementIntent,
27-
state: TermsAgreementState,
28-
): TermsAgreementState? = when (intent) {
29-
is TermsAgreementIntent.SetLoading -> {
30-
state.copy(isLoading = intent.isLoading)
31-
}
18+
) : ContainerHost<TermsAgreementState, TermsAgreementSideEffect>, ViewModel() {
19+
20+
override val container: Container<TermsAgreementState, TermsAgreementSideEffect> = container(initialState = TermsAgreementState.INIT)
3221

33-
is TermsAgreementIntent.ToggleAllAgreements -> {
34-
if (state.isLoading) {
35-
null
36-
} else {
22+
fun updateAllAgreements(agreed: Boolean) {
23+
intent {
24+
if (state.isLoading) return@intent
25+
reduce {
3726
state.copy(
38-
agreedTermsOfService = intent.agreed,
39-
agreedPrivacyPolicy = intent.agreed,
40-
agreedOverFourteen = intent.agreed,
27+
agreedTermsOfService = agreed,
28+
agreedPrivacyPolicy = agreed,
29+
agreedOverFourteen = agreed,
4130
)
4231
}
4332
}
33+
}
4434

45-
is TermsAgreementIntent.ToggleTermsOfService -> {
46-
if (state.isLoading) {
47-
null
48-
} else {
49-
state.copy(agreedTermsOfService = intent.agreed)
50-
}
51-
}
52-
53-
is TermsAgreementIntent.TogglePrivacyPolicy -> {
54-
if (state.isLoading) {
55-
null
56-
} else {
57-
state.copy(agreedPrivacyPolicy = intent.agreed)
58-
}
59-
}
60-
61-
is TermsAgreementIntent.ToggleOverFourteen -> {
62-
if (state.isLoading) {
63-
null
64-
} else {
65-
state.copy(agreedOverFourteen = intent.agreed)
66-
}
35+
fun updateTermsOfService() {
36+
intent {
37+
if (state.isLoading) return@intent
38+
reduce { state.copy(agreedTermsOfService = !state.agreedTermsOfService) }
6739
}
40+
}
6841

69-
is TermsAgreementIntent.ShowTermsOfService -> {
70-
sendSideEffect(TermsAgreementSideEffect.NavigateToTermsOfService)
71-
null
42+
fun updatePrivacyPolicy() {
43+
intent {
44+
if (state.isLoading) return@intent
45+
reduce { state.copy(agreedPrivacyPolicy = !state.agreedPrivacyPolicy) }
7246
}
47+
}
7348

74-
is TermsAgreementIntent.ShowPrivacyPolicy -> {
75-
sendSideEffect(TermsAgreementSideEffect.NavigateToPrivacyPolicy)
76-
null
49+
fun updateOverFourteen() {
50+
intent {
51+
if (state.isLoading) return@intent
52+
reduce { state.copy(agreedOverFourteen = !state.agreedOverFourteen) }
7753
}
54+
}
7855

79-
is TermsAgreementIntent.SubmitSuccess -> {
80-
sendSideEffect(TermsAgreementSideEffect.NavigateToOnBoarding)
81-
state.copy(isLoading = false)
56+
fun submitTermsAgreement() {
57+
intent {
58+
reduce { state.copy(isLoading = true) }
59+
val agreement = TermsAgreement(
60+
agreedToTermsOfService = state.agreedTermsOfService,
61+
agreedToPrivacyPolicy = state.agreedPrivacyPolicy,
62+
isOverFourteen = state.agreedOverFourteen,
63+
)
64+
submitTermsAgreementUseCase(agreement).fold(
65+
onSuccess = {
66+
reduce { state.copy(isLoading = false) }
67+
postSideEffect(TermsAgreementSideEffect.NavigateToOnBoarding)
68+
},
69+
onFailure = { error ->
70+
Log.e("TermsAgreement", "Submit failed: ${error.message}")
71+
reduce { state.copy(isLoading = false) }
72+
},
73+
)
8274
}
75+
}
8376

84-
is TermsAgreementIntent.SubmitFailure -> {
85-
state.copy(isLoading = false)
77+
fun navigateToTermsOfService() {
78+
intent {
79+
postSideEffect(TermsAgreementSideEffect.NavigateToTermsOfService)
8680
}
81+
}
8782

88-
is TermsAgreementIntent.BackButtonClick -> {
89-
sendSideEffect(TermsAgreementSideEffect.NavigateToBack)
90-
null
83+
fun navigateToPrivacyPolicy() {
84+
intent {
85+
postSideEffect(TermsAgreementSideEffect.NavigateToPrivacyPolicy)
9186
}
9287
}
9388

94-
fun submitTermsAgreement() {
95-
sendIntent(TermsAgreementIntent.SetLoading(true))
96-
viewModelScope.launch {
97-
val currentState = container.stateFlow.value
98-
val agreement = TermsAgreement(
99-
agreedToTermsOfService = currentState.agreedTermsOfService,
100-
agreedToPrivacyPolicy = currentState.agreedPrivacyPolicy,
101-
isOverFourteen = currentState.agreedOverFourteen,
102-
)
103-
104-
submitTermsAgreementUseCase(agreement)
105-
.fold(
106-
onSuccess = {
107-
sendIntent(TermsAgreementIntent.SubmitSuccess)
108-
},
109-
onFailure = { error ->
110-
Log.e("TermsAgreement", "Submit failed: ${error.message}")
111-
sendIntent(TermsAgreementIntent.SubmitFailure)
112-
},
113-
)
89+
fun navigateToBack() {
90+
intent {
91+
postSideEffect(TermsAgreementSideEffect.NavigateToBack)
11492
}
11593
}
11694
}

presentation/src/main/java/com/threegap/bitnagil/presentation/terms/model/TermsAgreementIntent.kt

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

presentation/src/main/java/com/threegap/bitnagil/presentation/terms/model/TermsAgreementSideEffect.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.terms.model
22

3-
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect
4-
5-
sealed interface TermsAgreementSideEffect : MviSideEffect {
3+
sealed interface TermsAgreementSideEffect {
64
data object NavigateToTermsOfService : TermsAgreementSideEffect
75
data object NavigateToPrivacyPolicy : TermsAgreementSideEffect
86
data object NavigateToOnBoarding : TermsAgreementSideEffect

0 commit comments

Comments
 (0)