Updated on 2026-08-14
This commit is contained in:
parent
799d797fb5
commit
50a384f13d
16 changed files with 61 additions and 78 deletions
|
|
@ -1,7 +1,6 @@
|
|||
package com.tangem.features.feed.model.earn
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import arrow.core.Either
|
||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.arkivanov.decompose.router.slot.dismiss
|
||||
|
|
@ -68,7 +67,7 @@ internal class EarnModel @Inject constructor(
|
|||
) : Model() {
|
||||
|
||||
private val params = paramsContainer.require<DefaultEarnComponent.Params>()
|
||||
private val earnNetworks = MutableStateFlow<EarnNetworks>(Either.Right(emptyList()))
|
||||
private val earnNetworks = MutableStateFlow<EarnNetworks?>(null)
|
||||
private val earnListConfigProvider = Provider {
|
||||
createEarnTokensListConfig(
|
||||
selectedTypeFilter = stateController.value.earnFilterUM.selectedTypeFilter,
|
||||
|
|
@ -131,10 +130,10 @@ internal class EarnModel @Inject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private fun EarnFilter.resolveAgainst(networks: EarnNetworks): EarnFilter {
|
||||
private fun EarnFilter.resolveAgainst(networks: EarnNetworks?): EarnFilter {
|
||||
val specific = earnFilterNetwork as? EarnFilterNetwork.Specific ?: return this
|
||||
if (specific.symbol.isNotEmpty()) return this
|
||||
val loaded = networks.getOrNull()?.takeIf { it.isNotEmpty() } ?: return this
|
||||
val loaded = networks?.getOrNull()?.takeIf { it.isNotEmpty() } ?: return this
|
||||
val match = loaded.firstOrNull { it.networkId.equals(specific.id, ignoreCase = true) }
|
||||
return copy(
|
||||
earnFilterNetwork = match?.let { earnNetwork ->
|
||||
|
|
@ -230,7 +229,7 @@ internal class EarnModel @Inject constructor(
|
|||
|
||||
private fun reloadEarnNetworks() {
|
||||
modelScope.launch(dispatchers.default) {
|
||||
if (earnNetworks.value.isLeft()) {
|
||||
if (earnNetworks.value?.isLeft() != false) {
|
||||
fetchEarnNetworks()
|
||||
}
|
||||
}
|
||||
|
|
@ -275,7 +274,7 @@ internal class EarnModel @Inject constructor(
|
|||
isSelected = selectedFilter is EarnFilterNetworkUM.MyNetworks,
|
||||
),
|
||||
)
|
||||
earnNetworks.value.onRight { networks ->
|
||||
earnNetworks.value?.onRight { networks ->
|
||||
networks.mapTo(this) { network ->
|
||||
EarnFilterNetwork.Specific(
|
||||
id = network.networkId,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import com.tangem.features.feed.ui.earn.state.EarnFilterTypeUM
|
|||
internal fun createEarnTokensListConfig(
|
||||
selectedTypeFilter: EarnFilterTypeUM,
|
||||
selectedNetworkFilter: EarnFilterNetworkUM,
|
||||
earnNetworks: EarnNetworks,
|
||||
earnNetworks: EarnNetworks?,
|
||||
isForEarn: Boolean = false,
|
||||
): EarnTokensListConfig {
|
||||
val type = when (selectedTypeFilter) {
|
||||
|
|
@ -19,8 +19,9 @@ internal fun createEarnTokensListConfig(
|
|||
}
|
||||
val networks = when (selectedNetworkFilter) {
|
||||
is EarnFilterNetworkUM.AllNetworks -> null
|
||||
is EarnFilterNetworkUM.MyNetworks -> {
|
||||
earnNetworks.fold(
|
||||
is EarnFilterNetworkUM.MyNetworks -> when (earnNetworks) {
|
||||
null -> listOf(NO_ONE_NETWORK)
|
||||
else -> earnNetworks.fold(
|
||||
ifLeft = { null },
|
||||
ifRight = { networks ->
|
||||
networks.filter(EarnNetwork::isAdded)
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.tangem.features.feed.ui.earn.state.EarnFilterTypeUM
|
|||
import com.tangem.features.feed.ui.earn.state.EarnUM
|
||||
|
||||
internal class EarnFilterSelectedStateTransformer(
|
||||
private val earnNetworks: EarnNetworks,
|
||||
private val earnNetworks: EarnNetworks?,
|
||||
private val filterType: EarnFilterTypeUM,
|
||||
private val filterNetwork: EarnFilterNetworkUM,
|
||||
) : EarnUMTransformer {
|
||||
|
|
@ -16,7 +16,7 @@ internal class EarnFilterSelectedStateTransformer(
|
|||
earnFilterUM = prevState.earnFilterUM.copy(
|
||||
selectedTypeFilter = filterType,
|
||||
selectedNetworkFilter = filterNetwork,
|
||||
isNetworkFilterEnabled = earnNetworks.isRight { networks -> networks.isNotEmpty() },
|
||||
isNetworkFilterEnabled = earnNetworks?.isRight { networks -> networks.isNotEmpty() } == true,
|
||||
isTypeFilterEnabled = true,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ internal class EarnListBatchFlowManager(
|
|||
private val modelScope: CoroutineScope,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
) {
|
||||
private val actionsFlow = MutableSharedFlow<BatchAction<Int, EarnTokensListConfig, Nothing>>()
|
||||
// `replay = 1` because the batch source subscribes asynchronously, so an action emitted before
|
||||
// that would be dropped silently.
|
||||
private val actionsFlow = MutableSharedFlow<BatchAction<Int, EarnTokensListConfig, Nothing>>(replay = 1)
|
||||
private val converter = EarnTokenWithCurrencyToListItemUMConverter(
|
||||
onItemClick = { onItemClick(it, EarnSource.BEST_OPPORTUNITIES_SOURCE) },
|
||||
)
|
||||
|
|
@ -38,8 +40,10 @@ internal class EarnListBatchFlowManager(
|
|||
batchSize = DEFAULT_BATCH_SIZE,
|
||||
)
|
||||
|
||||
private val batchState = batchFlow.state.filterNot { it.status is PaginationStatus.None }
|
||||
|
||||
val uiItems: StateFlow<ImmutableList<EarnListItemUM>> =
|
||||
batchFlow.state
|
||||
batchState
|
||||
.scan(persistentListOf<EarnListItemUM>() to -1) { (accItems, lastProcessedBatchIndex), newState ->
|
||||
if (newState.data.size <= lastProcessedBatchIndex) {
|
||||
val newItems = newState.data
|
||||
|
|
@ -63,7 +67,7 @@ internal class EarnListBatchFlowManager(
|
|||
initialValue = persistentListOf(),
|
||||
)
|
||||
|
||||
val initialLoadingError: StateFlow<Throwable?> = batchFlow.state
|
||||
val initialLoadingError: StateFlow<Throwable?> = batchState
|
||||
.map { state ->
|
||||
val status = state.status
|
||||
if (status is PaginationStatus.InitialLoadingError) {
|
||||
|
|
@ -79,7 +83,7 @@ internal class EarnListBatchFlowManager(
|
|||
initialValue = null,
|
||||
)
|
||||
|
||||
val paginationStatus: StateFlow<PaginationStatus<List<EarnTokenWithCurrency>>> = batchFlow.state
|
||||
val paginationStatus: StateFlow<PaginationStatus<List<EarnTokenWithCurrency>>> = batchState
|
||||
.map { it.status }
|
||||
.distinctUntilChanged()
|
||||
.stateIn(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue