From 3d72284f67e5e8e47d9dd18538d01cdbe83ea0e5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 30 May 2022 17:35:48 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../compose/extensions/LazyListState.kt | 23 +++++++++++ .../tap/domain/tokens/CurrenciesRepository.kt | 4 +- .../tokens/LoadAvailableCoinsService.kt | 1 + .../tokens/ui/compose/ListOfCurrencies.kt | 40 +++++++++---------- 4 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/common/compose/extensions/LazyListState.kt diff --git a/app/src/main/java/com/tangem/tap/common/compose/extensions/LazyListState.kt b/app/src/main/java/com/tangem/tap/common/compose/extensions/LazyListState.kt new file mode 100644 index 0000000000..c41581fce1 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/compose/extensions/LazyListState.kt @@ -0,0 +1,23 @@ +package com.tangem.tap.common.compose.extensions + +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.runtime.* + +@Composable +fun LazyListState.OnBottomReached(loadMoreThreshold: Int, loadMore: () -> Unit) { + require(loadMoreThreshold >= 0) + val shouldLoadMore = remember { + derivedStateOf { + val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull() + ?: return@derivedStateOf false + lastVisibleItem.index >= layoutInfo.totalItemsCount - 1 - loadMoreThreshold + } + } + + LaunchedEffect(shouldLoadMore) { + snapshotFlow { shouldLoadMore.value } + .collect { shouldLoadMore -> + if (shouldLoadMore) loadMore() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt index cd4e2c9d0e..6888b7f648 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/CurrenciesRepository.kt @@ -191,8 +191,8 @@ class CurrenciesRepository( } }.map { it.await() } .map { (it as? Result.Success)?.data?.coins?.firstOrNull()?.id } - .mapIndexedNotNull { index, s -> - if (s == null) null else tokens[index].contractAddress to s + .mapIndexedNotNull { index, id -> + if (id == null) null else tokens[index].contractAddress to id }.toMap() } diff --git a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt index 55301f5089..b195457e4f 100644 --- a/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt +++ b/app/src/main/java/com/tangem/tap/domain/tokens/LoadAvailableCoinsService.kt @@ -2,6 +2,7 @@ package com.tangem.tap.domain.tokens import com.tangem.blockchain.common.Blockchain import com.tangem.common.services.Result +import com.tangem.domain.common.extensions.getListOfCoins import com.tangem.domain.common.extensions.toNetworkId import com.tangem.network.api.tangemTech.CoinsResponse import com.tangem.network.api.tangemTech.TangemTechService diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt index e6fa6a6d1c..75755a0e73 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt @@ -4,13 +4,14 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.tangem.blockchain.common.Blockchain +import com.tangem.tap.common.compose.extensions.OnBottomReached import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.TokenWithBlockchain @@ -18,7 +19,7 @@ import com.tangem.tap.features.tokens.redux.TokenWithBlockchain @Composable fun ListOfCurrencies( - header: @Composable ()->Unit, + header: @Composable () -> Unit, currencies: List, nonRemovableTokens: List, nonRemovableBlockchains: List, @@ -42,34 +43,31 @@ fun ListOfCurrencies( expandedCurrencies.value = mutableList } + val listState = rememberLazyListState() + LazyColumn( + state = listState, modifier = Modifier .fillMaxSize(), contentPadding = PaddingValues(bottom = 90.dp) ) { item { header() } itemsIndexed(currencies) { index, currency -> - val lastIndex = currencies.lastIndex - if (currencies.isNotEmpty()) { - if (index + 40 == lastIndex) { - SideEffect { onLoadMore() } - } - CurrencyItem( - currency = currency, - nonRemovableTokens = nonRemovableTokens, - nonRemovableBlockchains = nonRemovableBlockchains, - addedTokens = addedTokens, - addedBlockchains = addedBlockchains, - allowToAdd = allowToAdd, - expanded = expandedCurrencies.value.contains(currency.id), - onCurrencyClick = onCurrencyClick, - onAddCurrencyToggled = onAddCurrencyToggled, - onNetworkItemClicked = onNetworkItemClicked - ) - } - + CurrencyItem( + currency = currency, + nonRemovableTokens = nonRemovableTokens, + nonRemovableBlockchains = nonRemovableBlockchains, + addedTokens = addedTokens, + addedBlockchains = addedBlockchains, + allowToAdd = allowToAdd, + expanded = expandedCurrencies.value.contains(currency.id), + onCurrencyClick = onCurrencyClick, + onAddCurrencyToggled = onAddCurrencyToggled, + onNetworkItemClicked = onNetworkItemClicked + ) } } + listState.OnBottomReached(loadMoreThreshold = 40) { onLoadMore() } } val Currency.fullName: String