diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt index 8d8d5b6cbc..03b4921a5d 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt @@ -26,6 +26,7 @@ import com.tangem.features.managetokens.component.ManageTokensMode import com.tangem.features.managetokens.component.ManageTokensSource import com.tangem.features.managetokens.component.analytics.CommonManageTokensAnalyticEvents import com.tangem.features.managetokens.entity.item.CurrencyItemUM +import com.tangem.features.managetokens.entity.item.CurrencyItemUM.Basic import com.tangem.features.managetokens.entity.managetokens.ManageTokensTopBarUM import com.tangem.features.managetokens.entity.managetokens.ManageTokensUM import com.tangem.features.managetokens.impl.R @@ -42,7 +43,6 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject -import kotlin.collections.isNotEmpty @Suppress("LongParameterList") @ModelScoped @@ -95,7 +95,7 @@ internal class ChooseManagedTokensModel @Inject constructor( observeSearchQueryChanges() modelScope.launch { - manageTokensListManager.launchPagination() + manageTokensListManager.launchPagination(isCollapsed = false) } } @@ -176,8 +176,19 @@ internal class ChooseManagedTokensModel @Inject constructor( uiState.update { state -> state.copy( readContent = state.readContent.copy( - items = items.filterNot { - it.id.value == params.initialCurrency.id.rawCurrencyId?.value + items = items.filterNot { currency -> + val availableNetworks = (currency as? Basic)?.networks as? Basic.NetworksUM.Expanded + + // Check whether currency is initial token + val isToken = currency.id.value == params.initialCurrency.id.rawCurrencyId?.value + + // Ensure that initial token network is filtered out and network list is empty + val isEmptyNetworks = availableNetworks?.networks?.filterNot { network -> + network.id == params.initialCurrency.network.id.rawId.value + }.isNullOrEmpty() + + // Filter out currency from display + isToken && isEmptyNetworks }.toPersistentList(), ), ) diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt index 9fb821525a..c34a6ba32d 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/ManageTokensModel.kt @@ -84,7 +84,7 @@ internal class ManageTokensModel @Inject constructor( observeSearchQueryChanges() modelScope.launch { - manageTokensListManager.launchPagination() + manageTokensListManager.launchPagination(isCollapsed = true) } } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt index c54c9a40e3..7d7026d93c 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/model/OnboardingManageTokensModel.kt @@ -80,7 +80,7 @@ internal class OnboardingManageTokensModel @Inject constructor( observeSearchQueryChanges() modelScope.launch { - manageTokensListManager.launchPagination() + manageTokensListManager.launchPagination(isCollapsed = true) } } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt index 0964dbe793..9398d31472 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensListManager.kt @@ -83,7 +83,12 @@ internal class ManageTokensListManager @AssistedInject constructor( .distinctUntilChanged() val uiItems: Flow> = uiManager.items - suspend fun launchPagination() = coroutineScope { + /** + * Launch pagination flow to get currencies + * + * @param isCollapsed set initial display state of networks. !!! WARNING !!! Use `false` flag with cation + */ + suspend fun launchPagination(isCollapsed: Boolean) = coroutineScope { val loadUserTokensFromRemote = when (mode) { is ManageTokensMode.Wallet -> source == ManageTokensSource.ONBOARDING is ManageTokensMode.Account, @@ -100,7 +105,7 @@ internal class ManageTokensListManager @AssistedInject constructor( ) batchFlow.state - .onEach { state -> updateState(state) } + .onEach { state -> updateState(state, isCollapsed) } .flowOn(dispatchers.default) .launchIn(scope = this) .saveIn(jobHolder) @@ -137,7 +142,7 @@ internal class ManageTokensListManager @AssistedInject constructor( ) } - private fun updateState(batchListState: BatchListState>) { + private fun updateState(batchListState: BatchListState>, isCollapsed: Boolean) { state.update { state -> state.copy( status = batchListState.status, @@ -186,7 +191,7 @@ internal class ManageTokensListManager @AssistedInject constructor( } state.copy( currencyBatches = newBatches, - uiBatches = uiManager.createOrUpdateUiBatches(newBatches, canEditItems), + uiBatches = uiManager.createOrUpdateUiBatches(newBatches, canEditItems, isCollapsed), canEditItems = canEditItems, ) } diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt index 23bb3ba720..49919e627d 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/list/ManageTokensUiManager.kt @@ -38,6 +38,7 @@ internal class ManageTokensUiManager( fun createOrUpdateUiBatches( newCurrencyBatches: List>>, canEditItems: Boolean, + isCollapsed: Boolean, ): List>> { val currentUiBatches = state.value.uiBatches val batches = currentUiBatches.toMutableList() @@ -54,6 +55,7 @@ internal class ManageTokensUiManager( isEditable = canEditItems, onRemoveCustomCurrencyClick = ::removeCustomCurrency, onTokenClick = actions::onTokenClick, + isCollapsed = isCollapsed, ) }, ) @@ -78,6 +80,7 @@ internal class ManageTokensUiManager( isEditable = canEditItems, onRemoveCustomCurrencyClick = ::removeCustomCurrency, onTokenClick = actions::onTokenClick, + isCollapsed = isCollapsed, ) } else { previousUiItem.update(item) diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyItemMapper.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyItemMapper.kt index c16e25cd84..47a6cfe610 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyItemMapper.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyItemMapper.kt @@ -8,14 +8,16 @@ import com.tangem.domain.managetokens.model.ManagedCryptoCurrency import com.tangem.features.managetokens.entity.item.CurrencyItemUM import com.tangem.features.managetokens.entity.item.CurrencyItemUM.Basic.NetworksUM import com.tangem.features.managetokens.utils.ui.getIconRes +import kotlinx.collections.immutable.toImmutableList internal fun ManagedCryptoCurrency.toUiModel( isEditable: Boolean, onTokenClick: (ManagedCryptoCurrency.Token) -> Unit, onRemoveCustomCurrencyClick: (ManagedCryptoCurrency.Custom) -> Unit, + isCollapsed: Boolean, ): CurrencyItemUM = when (this) { is ManagedCryptoCurrency.Custom -> toUiModel(onRemoveCustomCurrencyClick) - is ManagedCryptoCurrency.Token -> toUiModel(isEditable, onTokenClick) + is ManagedCryptoCurrency.Token -> toUiModel(isEditable, onTokenClick, isCollapsed) } private fun ManagedCryptoCurrency.Custom.toUiModel( @@ -54,6 +56,7 @@ private fun ManagedCryptoCurrency.Custom.toUiModel( private fun ManagedCryptoCurrency.Token.toUiModel( isEditable: Boolean, onTokenClick: (ManagedCryptoCurrency.Token) -> Unit, + isCollapsed: Boolean, ): CurrencyItemUM { val background = TangemColorPalette.Black @@ -69,7 +72,20 @@ private fun ManagedCryptoCurrency.Token.toUiModel( fallbackTint = getTintForTokenIcon(background), fallbackBackground = background, ), - networks = NetworksUM.Collapsed, + networks = if (isCollapsed) { + NetworksUM.Collapsed + } else { + NetworksUM.Expanded( + availableNetworks.map { + it.toCurrencyNetworkModel( + isSelected = it.network in addedIn, + isEditable = false, + onSelectedStateChange = { _, _ -> }, + onLongTap = { _ -> }, + ) + }.toImmutableList(), + ) + }, onExpandClick = { onTokenClick(this) }, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt index 225fb0daae..58cea15030 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/utils/mapper/CurrencyNetworksMapper.kt @@ -46,7 +46,7 @@ internal fun Network.toCurrencyNetworkModel( ) } -private fun SourceNetwork.toCurrencyNetworkModel( +internal fun SourceNetwork.toCurrencyNetworkModel( isSelected: Boolean, isEditable: Boolean, onSelectedStateChange: (SourceNetwork, Boolean) -> Unit, diff --git a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt index 327f65e671..e8cab11656 100644 --- a/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt +++ b/features/yield-supply/impl/src/main/java/com/tangem/features/yield/supply/impl/main/model/YieldSupplyModel.kt @@ -36,7 +36,7 @@ internal class YieldSupplyModel @Inject constructor( private val params = paramsContainer.require() val uiState: StateFlow - field = MutableStateFlow(YieldSupplyUM.Loading) + field = MutableStateFlow(YieldSupplyUM.Loading) val bottomSheetNavigation: SlotNavigation = SlotNavigation() @@ -44,12 +44,12 @@ internal class YieldSupplyModel @Inject constructor( var userWallet: UserWallet by Delegates.notNull() val cryptoCurrencyStatusFlow: StateFlow - field = MutableStateFlow( - CryptoCurrencyStatus( - currency = params.cryptoCurrency, - value = CryptoCurrencyStatus.Loading, - ), - ) + field = MutableStateFlow( + CryptoCurrencyStatus( + currency = params.cryptoCurrency, + value = CryptoCurrencyStatus.Loading, + ), + ) init { subscribeOnCurrencyStatusUpdates()