@@ -6,6 +6,7 @@ import com.threegap.bitnagil.domain.onboarding.usecase.GetOnBoardingAbstractUseC
66import com.threegap.bitnagil.domain.onboarding.usecase.GetOnBoardingsUseCase
77import com.threegap.bitnagil.domain.onboarding.usecase.GetRecommendOnBoardingRoutinesUseCase
88import com.threegap.bitnagil.domain.onboarding.usecase.RegisterRecommendOnBoardingRoutinesUseCase
9+ import com.threegap.bitnagil.domain.user.usecase.FetchUserProfileUseCase
910import com.threegap.bitnagil.presentation.common.mviviewmodel.MviViewModel
1011import com.threegap.bitnagil.presentation.onboarding.model.OnBoardingAbstractTextItem
1112import com.threegap.bitnagil.presentation.onboarding.model.OnBoardingItem
@@ -21,7 +22,6 @@ import dagger.assisted.AssistedInject
2122import dagger.hilt.android.lifecycle.HiltViewModel
2223import kotlinx.coroutines.Job
2324import kotlinx.coroutines.async
24- import kotlinx.coroutines.delay
2525import kotlinx.coroutines.isActive
2626import kotlinx.coroutines.launch
2727import org.orbitmvi.orbit.syntax.simple.SimpleSyntax
@@ -33,6 +33,7 @@ class OnBoardingViewModel @AssistedInject constructor(
3333 private val getRecommendOnBoardingRoutinesUseCase : GetRecommendOnBoardingRoutinesUseCase ,
3434 private val getOnBoardingAbstractUseCase : GetOnBoardingAbstractUseCase ,
3535 private val registerRecommendOnBoardingRoutinesUseCase : RegisterRecommendOnBoardingRoutinesUseCase ,
36+ private val fetchUserProfileUseCase : FetchUserProfileUseCase ,
3637 @Assisted private val onBoardingArg : OnBoardingScreenArg ,
3738) : MviViewModel<OnBoardingState, OnBoardingSideEffect, OnBoardingIntent>(
3839 initState = OnBoardingState .Loading ,
@@ -43,7 +44,7 @@ class OnBoardingViewModel @AssistedInject constructor(
4344 }
4445
4546 // 내부에 전체 온보딩 항목 저장
46- private val onBoardingPageInfos = mutableListOf<OnBoardingPageInfo .SelectOnBoarding >()
47+ private val selectOnBoardingPageInfos = mutableListOf<OnBoardingPageInfo .SelectOnBoarding >()
4748
4849 private var loadRecommendRoutinesJob: Job ? = null
4950
@@ -54,12 +55,21 @@ class OnBoardingViewModel @AssistedInject constructor(
5455 private fun loadOnBoardingItems () {
5556 viewModelScope.launch {
5657 val onBoardings = getOnBoardingsUseCase()
57-
5858 val onBoardingPages = onBoardings.map { onBoarding ->
5959 OnBoardingPageInfo .SelectOnBoarding .fromOnBoarding(onBoarding = onBoarding)
6060 }
6161
62- sendIntent(intent = OnBoardingIntent .LoadOnBoardingSuccess (onBoardingPageInfos = onBoardingPages))
62+ val userProfile = fetchUserProfileUseCase()
63+ val userName = userProfile.fold(
64+ onSuccess = {
65+ return @fold it.nickname
66+ },
67+ onFailure = {
68+ return @fold " -"
69+ },
70+ )
71+
72+ sendIntent(intent = OnBoardingIntent .LoadOnBoardingSuccess (onBoardingPageInfos = onBoardingPages, userName = userName))
6373 }
6474 }
6575
@@ -69,15 +79,22 @@ class OnBoardingViewModel @AssistedInject constructor(
6979 ): OnBoardingState ? {
7080 when (intent) {
7181 is OnBoardingIntent .LoadOnBoardingSuccess -> {
72- onBoardingPageInfos.clear()
73- onBoardingPageInfos.addAll(intent.onBoardingPageInfos)
82+ selectOnBoardingPageInfos.clear()
83+ selectOnBoardingPageInfos.addAll(intent.onBoardingPageInfos)
84+
85+ val onBoardingSetType = OnBoardingSetType .fromOnBoardingScreenArg(onBoardingArg)
86+ val firstPage = when (onBoardingSetType) {
87+ OnBoardingSetType .NEW -> OnBoardingPageInfo .Intro
88+ OnBoardingSetType .RESET -> OnBoardingPageInfo .Intro
89+ }
7490
7591 return OnBoardingState .Idle (
76- nextButtonEnable = false ,
77- currentOnBoardingPageInfo = onBoardingPageInfos.first(),
78- totalStep = onBoardingPageInfos.size + 2 ,
79- currentStep = 1 ,
80- onBoardingSetType = OnBoardingSetType .fromOnBoardingScreenArg(onBoardingArg),
92+ nextButtonEnable = true ,
93+ currentOnBoardingPageInfo = firstPage,
94+ totalStep = selectOnBoardingPageInfos.size + 2 ,
95+ currentStep = 0 ,
96+ onBoardingSetType = onBoardingSetType,
97+ userName = intent.userName
8198 )
8299 }
83100
@@ -89,7 +106,7 @@ class OnBoardingViewModel @AssistedInject constructor(
89106 if (currentPageInfo !is OnBoardingPageInfo .SelectOnBoarding ) return null
90107
91108 val selectChangedCurrentPageInfo = currentPageInfo.selectItem(itemId = intent.itemId)
92- onBoardingPageInfos [currentState.currentStep - 1 ] = selectChangedCurrentPageInfo
109+ selectOnBoardingPageInfos [currentState.currentStep - 1 ] = selectChangedCurrentPageInfo
93110 return currentState.copy(
94111 currentOnBoardingPageInfo = selectChangedCurrentPageInfo,
95112 nextButtonEnable = selectChangedCurrentPageInfo.isItemSelected,
@@ -100,10 +117,10 @@ class OnBoardingViewModel @AssistedInject constructor(
100117 val currentState = state
101118 if (currentState !is OnBoardingState .Idle ) return null
102119
103- val isLastSelectOnBoarding = currentState.currentStep >= onBoardingPageInfos .size
104- if (isLastSelectOnBoarding ) return null
120+ val isLastPageOfSelectOnBoarding = currentState.currentStep >= selectOnBoardingPageInfos .size
121+ if (isLastPageOfSelectOnBoarding ) return null
105122
106- val nextOnBoardingPageInfo = onBoardingPageInfos [currentState.currentStep]
123+ val nextOnBoardingPageInfo = selectOnBoardingPageInfos [currentState.currentStep]
107124 val nextButtonEnable = nextOnBoardingPageInfo.isItemSelected
108125 return currentState.copy(
109126 currentOnBoardingPageInfo = nextOnBoardingPageInfo,
@@ -114,27 +131,35 @@ class OnBoardingViewModel @AssistedInject constructor(
114131
115132 is OnBoardingIntent .SelectPrevious -> {
116133 val currentState = state
117- if (currentState !is OnBoardingState .Idle || currentState.currentStep == 1 ) {
134+ if (currentState !is OnBoardingState .Idle || currentState.currentStep == 0 ) {
118135 sendSideEffect(sideEffect = OnBoardingSideEffect .MoveToPreviousScreen )
119136 return null
120137 }
121138
122- val isSelectOnBoardingStep = currentState.currentStep <= onBoardingPageInfos.size
139+ if (currentState.currentStep == 1 ) {
140+ return currentState.copy(
141+ currentStep = 0 ,
142+ currentOnBoardingPageInfo = OnBoardingPageInfo .Intro ,
143+ nextButtonEnable = true
144+ )
145+ }
146+
147+ val isSelectOnBoardingStep = currentState.currentStep <= selectOnBoardingPageInfos.size
123148 if (isSelectOnBoardingStep) {
124- val previousOnBoardingPageInfo = onBoardingPageInfos [currentState.currentStep - 2 ]
149+ val previousOnBoardingPageInfo = selectOnBoardingPageInfos [currentState.currentStep - 2 ]
125150 val nextButtonEnable = previousOnBoardingPageInfo.isItemSelected
126151 return currentState.copy(
127152 currentOnBoardingPageInfo = previousOnBoardingPageInfo,
128153 nextButtonEnable = nextButtonEnable,
129154 currentStep = currentState.currentStep - 1 ,
130155 )
131156 } else {
132- val selectOnBoardingPageInfo = onBoardingPageInfos .last()
157+ val selectOnBoardingPageInfo = selectOnBoardingPageInfos .last()
133158 val nextButtonEnable = selectOnBoardingPageInfo.isItemSelected
134159 return currentState.copy(
135160 currentOnBoardingPageInfo = selectOnBoardingPageInfo,
136161 nextButtonEnable = nextButtonEnable,
137- currentStep = onBoardingPageInfos .size,
162+ currentStep = selectOnBoardingPageInfos .size,
138163 )
139164 }
140165 }
@@ -193,9 +218,9 @@ class OnBoardingViewModel @AssistedInject constructor(
193218 val currentState = stateFlow.value
194219 if (currentState !is OnBoardingState .Idle ) return @launch
195220
196- val isLastSelectOnBoarding = currentState.currentStep >= onBoardingPageInfos .size
221+ val isLastSelectOnBoarding = currentState.currentStep >= selectOnBoardingPageInfos .size
197222 if (isLastSelectOnBoarding) {
198- val selectedItemIdsWithOnBoardingId = getSelectedOnBoardingItemIdsWithId(onBoardingPageInfos )
223+ val selectedItemIdsWithOnBoardingId = getSelectedOnBoardingItemIdsWithId(selectOnBoardingPageInfos )
199224
200225 val onBoardingAbstract = getOnBoardingAbstractUseCase(selectedItemIdsWithOnBoardingId = selectedItemIdsWithOnBoardingId)
201226
@@ -239,12 +264,9 @@ class OnBoardingViewModel @AssistedInject constructor(
239264 }
240265
241266 fun loadRecommendRoutines () {
267+ loadRecommendRoutinesJob?.cancel()
242268 loadRecommendRoutinesJob = viewModelScope.async {
243- val minimumDelayDeferred = async {
244- delay(2000L )
245- }
246-
247- val selectedItems = onBoardingPageInfos
269+ val selectedItems = selectOnBoardingPageInfos
248270 .map { onBoardingPage ->
249271 val id = onBoardingPage.id
250272 val selectedItemIds = onBoardingPage.items.filter { onBoardingItem ->
@@ -259,7 +281,6 @@ class OnBoardingViewModel @AssistedInject constructor(
259281
260282 getRecommendOnBoardingRoutinesUseCase(selectedItems).fold(
261283 onSuccess = { recommendRoutines ->
262- minimumDelayDeferred.await()
263284 if (isActive) {
264285 sendIntent(
265286 intent = OnBoardingIntent .LoadRecommendRoutinesSuccess (
0 commit comments