diff --git a/data/src/main/java/com/threegap/bitnagil/data/onboarding/repositoryImpl/OnBoardingRepositoryImpl.kt b/data/src/main/java/com/threegap/bitnagil/data/onboarding/repositoryImpl/OnBoardingRepositoryImpl.kt index 27870532..2a70a7a7 100644 --- a/data/src/main/java/com/threegap/bitnagil/data/onboarding/repositoryImpl/OnBoardingRepositoryImpl.kt +++ b/data/src/main/java/com/threegap/bitnagil/data/onboarding/repositoryImpl/OnBoardingRepositoryImpl.kt @@ -7,7 +7,12 @@ import com.threegap.bitnagil.data.onboarding.model.request.RegisterOnBoardingRec import com.threegap.bitnagil.domain.onboarding.model.OnBoarding import com.threegap.bitnagil.domain.onboarding.model.OnBoardingAbstract import com.threegap.bitnagil.domain.onboarding.model.OnBoardingRecommendRoutine +import com.threegap.bitnagil.domain.onboarding.model.OnBoardingRecommendRoutineEvent import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow import javax.inject.Inject class OnBoardingRepositoryImpl @Inject constructor( @@ -52,6 +57,16 @@ class OnBoardingRepositoryImpl @Inject constructor( recommendedRoutineIds = selectedRecommendRoutineIds.mapNotNull { it.toIntOrNull() }, ) - return onBoardingDataSource.registerRecommendRoutineList(selectedRecommendRoutineIds = request.recommendedRoutineIds) + return onBoardingDataSource.registerRecommendRoutineList(selectedRecommendRoutineIds = request.recommendedRoutineIds).also { + if (it.isSuccess) { + _onBoardingRecommendRoutineEventFlow.emit(OnBoardingRecommendRoutineEvent.AddRoutines(selectedRecommendRoutineIds)) + } + } } + + private val _onBoardingRecommendRoutineEventFlow = MutableSharedFlow( + extraBufferCapacity = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST, + ) + override suspend fun getOnBoardingRecommendRoutineEventFlow(): Flow = _onBoardingRecommendRoutineEventFlow.asSharedFlow() } diff --git a/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/model/OnBoardingRecommendRoutineEvent.kt b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/model/OnBoardingRecommendRoutineEvent.kt new file mode 100644 index 00000000..a2e98a2e --- /dev/null +++ b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/model/OnBoardingRecommendRoutineEvent.kt @@ -0,0 +1,5 @@ +package com.threegap.bitnagil.domain.onboarding.model + +sealed interface OnBoardingRecommendRoutineEvent { + data class AddRoutines(val routineIds: List) : OnBoardingRecommendRoutineEvent +} diff --git a/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/repository/OnBoardingRepository.kt b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/repository/OnBoardingRepository.kt index ee34c8e3..445c2a69 100644 --- a/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/repository/OnBoardingRepository.kt +++ b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/repository/OnBoardingRepository.kt @@ -3,10 +3,13 @@ package com.threegap.bitnagil.domain.onboarding.repository import com.threegap.bitnagil.domain.onboarding.model.OnBoarding import com.threegap.bitnagil.domain.onboarding.model.OnBoardingAbstract import com.threegap.bitnagil.domain.onboarding.model.OnBoardingRecommendRoutine +import com.threegap.bitnagil.domain.onboarding.model.OnBoardingRecommendRoutineEvent +import kotlinx.coroutines.flow.Flow interface OnBoardingRepository { suspend fun getOnBoardingList(): List suspend fun getOnBoardingAbstract(selectedItemIdsWithOnBoardingId: List>>): OnBoardingAbstract suspend fun getRecommendOnBoardingRouteList(selectedItemIdsWithOnBoardingId: List>>): Result> suspend fun registerRecommendRoutineList(selectedRecommendRoutineIds: List): Result + suspend fun getOnBoardingRecommendRoutineEventFlow(): Flow } diff --git a/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/usecase/GetOnBoardingRecommendRoutineEventFlowUseCase.kt b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/usecase/GetOnBoardingRecommendRoutineEventFlowUseCase.kt new file mode 100644 index 00000000..6903b27b --- /dev/null +++ b/domain/src/main/java/com/threegap/bitnagil/domain/onboarding/usecase/GetOnBoardingRecommendRoutineEventFlowUseCase.kt @@ -0,0 +1,14 @@ +package com.threegap.bitnagil.domain.onboarding.usecase + +import com.threegap.bitnagil.domain.onboarding.model.OnBoardingRecommendRoutineEvent +import com.threegap.bitnagil.domain.onboarding.repository.OnBoardingRepository +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class GetOnBoardingRecommendRoutineEventFlowUseCase @Inject constructor( + private val repository: OnBoardingRepository, +) { + suspend operator fun invoke(): Flow { + return repository.getOnBoardingRecommendRoutineEventFlow() + } +} diff --git a/presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt b/presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt index 0a0a3fc8..f7c856c9 100644 --- a/presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt +++ b/presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.threegap.bitnagil.domain.emotion.usecase.GetEmotionChangeEventFlowUseCase import com.threegap.bitnagil.domain.emotion.usecase.GetEmotionUseCase +import com.threegap.bitnagil.domain.onboarding.usecase.GetOnBoardingRecommendRoutineEventFlowUseCase import com.threegap.bitnagil.domain.routine.model.RoutineCompletion import com.threegap.bitnagil.domain.routine.model.RoutineCompletionInfo import com.threegap.bitnagil.domain.routine.usecase.DeleteRoutineByDayUseCase @@ -47,6 +48,7 @@ class HomeViewModel @Inject constructor( private val deleteRoutineByDayUseCase: DeleteRoutineByDayUseCase, private val getWriteRoutineEventFlowUseCase: GetWriteRoutineEventFlowUseCase, private val getEmotionChangeEventFlowUseCase: GetEmotionChangeEventFlowUseCase, + private val getOnBoardingRecommendRoutineEventFlowUseCase: GetOnBoardingRecommendRoutineEventFlowUseCase, ) : MviViewModel( initState = HomeState(), savedStateHandle = savedStateHandle, @@ -58,6 +60,7 @@ class HomeViewModel @Inject constructor( init { observeWriteRoutineEvent() observeEmotionChangeEvent() + observeRecommendRoutineEvent() observeWeekChanges() observeRoutineUpdates() fetchWeeklyRoutines(container.stateFlow.value.currentWeeks) @@ -251,6 +254,14 @@ class HomeViewModel @Inject constructor( } } + private fun observeRecommendRoutineEvent() { + viewModelScope.launch { + getOnBoardingRecommendRoutineEventFlowUseCase().collect { + fetchWeeklyRoutines(stateFlow.value.currentWeeks) + } + } + } + @OptIn(FlowPreview::class) private fun observeWeekChanges() { viewModelScope.launch {