Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-12 15:54:15 +01:00
parent ae759af1c7
commit d5d9c7bd2d
4 changed files with 63 additions and 19 deletions

View file

@ -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<FeedEntryChildFactory.Child>()
private val innerRouter = InnerRouter<FeedEntryChildFactory.Child>(
@ -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,

View file

@ -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
}

View file

@ -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)
}
}

View file

@ -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)