diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt index 97883f8378..a4f6f6d824 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/DefaultFeedEntryComponent.kt @@ -12,6 +12,7 @@ import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.value.Value import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext +import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.decompose.navigation.inner.InnerRouter import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState import com.tangem.core.ui.decompose.ComposableModularBottomSheetContentComponent @@ -25,6 +26,7 @@ import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListCo import com.tangem.features.feed.components.news.details.DefaultNewsDetailsComponent import com.tangem.features.feed.entry.components.FeedEntryComponent import com.tangem.features.feed.entry.components.FeedEntryRoute +import com.tangem.features.feed.model.FeedEntryModel import com.tangem.features.feed.model.feed.FeedModelClickIntents import com.tangem.features.feed.model.market.list.state.SortByTypeUM import com.tangem.features.feed.ui.EntryContent @@ -39,6 +41,8 @@ internal class DefaultFeedEntryComponent @AssistedInject constructor( private val feedEntryChildFactory: FeedEntryChildFactory, ) : FeedEntryComponent, AppComponentContext by context { + private val model: FeedEntryModel = getOrCreateModel() + private val stackNavigation = StackNavigation() private val innerRouter = InnerRouter( @@ -129,6 +133,7 @@ internal class DefaultFeedEntryComponent @AssistedInject constructor( onHeaderSizeChange: (Dp) -> Unit, modifier: Modifier, ) { + val bsState by bottomSheetState val stackStack = stack.subscribeAsState() BackHandler( enabled = bottomSheetState.value == BottomSheetState.EXPANDED && @@ -137,6 +142,10 @@ internal class DefaultFeedEntryComponent @AssistedInject constructor( onChildBack() } + LaunchedEffect(bsState) { + model.containerBottomSheetState.value = bsState + } + EntryContent( bottomSheetState = bottomSheetState, stackState = stackStack, diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/di/ModelModule.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/di/ModelModule.kt index 209d30fe44..6feb4b7bfc 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/di/ModelModule.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/di/ModelModule.kt @@ -2,6 +2,7 @@ package com.tangem.features.feed.di import com.tangem.core.decompose.di.ModelComponent import com.tangem.core.decompose.model.Model +import com.tangem.features.feed.model.FeedEntryModel import com.tangem.features.feed.model.feed.FeedComponentModel import com.tangem.features.feed.model.market.details.MarketsTokenDetailsModel import com.tangem.features.feed.model.market.list.MarketsListModel @@ -41,4 +42,9 @@ internal interface ModelModule { @IntoMap @ClassKey(NewsListModel::class) fun provideNewsListModel(model: NewsListModel): Model + + @Binds + @IntoMap + @ClassKey(FeedEntryModel::class) + fun provideFeedEntryModel(model: FeedEntryModel): Model } \ No newline at end of file diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/FeedEntryModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/FeedEntryModel.kt new file mode 100644 index 0000000000..62db5f2cf8 --- /dev/null +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/FeedEntryModel.kt @@ -0,0 +1,35 @@ +package com.tangem.features.feed.model + +import androidx.compose.runtime.Stable +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.model.Model +import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState +import com.tangem.features.feed.model.market.list.analytics.MarketsListAnalyticsEvent +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import javax.inject.Inject + +@Stable +@ModelScoped +internal class FeedEntryModel @Inject constructor( + override val dispatchers: CoroutineDispatcherProvider, + private val analyticsEventHandler: AnalyticsEventHandler, +) : Model() { + + val containerBottomSheetState = MutableStateFlow(BottomSheetState.COLLAPSED) + + init { + observeContainerBottomSheet() + } + + private fun observeContainerBottomSheet() { + containerBottomSheetState.onEach { bottomSheetState -> + if (bottomSheetState == BottomSheetState.EXPANDED) { + analyticsEventHandler.send(MarketsListAnalyticsEvent.BottomSheetOpened()) + } + }.launchIn(modelScope) + } +} \ No newline at end of file diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/MarketsListModel.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/MarketsListModel.kt index 6780d5a73f..063129a71e 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/MarketsListModel.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/model/market/list/MarketsListModel.kt @@ -18,12 +18,12 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.promo.PromoRepository import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListComponent import com.tangem.features.feed.model.market.list.analytics.MarketsListAnalyticsEvent -import com.tangem.features.feed.model.market.list.statemanager.MarketsListBatchFlowManager -import com.tangem.features.feed.model.market.list.statemanager.MarketsListUMStateManager import com.tangem.features.feed.model.market.list.state.ListUM import com.tangem.features.feed.model.market.list.state.MarketsListUM import com.tangem.features.feed.model.market.list.state.MarketsNotificationUM import com.tangem.features.feed.model.market.list.state.SortByTypeUM +import com.tangem.features.feed.model.market.list.statemanager.MarketsListBatchFlowManager +import com.tangem.features.feed.model.market.list.statemanager.MarketsListUMStateManager import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder @@ -263,18 +263,6 @@ internal class MarketsListModel @Inject constructor( } } - searchMarketsListManager - .isSearchNotFoundState - .onEach { isTokenFound -> - if (isTokenFound) { - analyticsEventHandler.send(MarketsListAnalyticsEvent.TokenSearched(isTokenFound = false)) - } - }.launchIn(modelScope) - - searchMarketsListManager.onFirstBatchLoadedSuccess.onEach { - analyticsEventHandler.send(MarketsListAnalyticsEvent.TokenSearched(isTokenFound = true)) - }.launchIn(modelScope) - // analytics initAnalytics() @@ -291,13 +279,19 @@ internal class MarketsListModel @Inject constructor( } private fun initAnalytics() { - containerBottomSheetState.onEach { bottomSheetState -> - if (bottomSheetState == BottomSheetState.EXPANDED) { - analyticsEventHandler.send(MarketsListAnalyticsEvent.BottomSheetOpened()) - } + searchMarketsListManager + .isSearchNotFoundState + .onEach { isTokenFound -> + if (isTokenFound) { + analyticsEventHandler.send(MarketsListAnalyticsEvent.TokenSearched(isTokenFound = false)) + } + }.launchIn(modelScope) + + searchMarketsListManager.onFirstBatchLoadedSuccess.onEach { + analyticsEventHandler.send(MarketsListAnalyticsEvent.TokenSearched(isTokenFound = true)) }.launchIn(modelScope) - state.filter { it.isInSearchMode.not() } + state .map { MarketsListAnalyticsEvent.SortBy(it.selectedSortBy, it.selectedInterval) }.distinctUntilChanged() .onEach { analyticsEventHandler.send(it)