From 05d2286ed7051d44bf3bd49114f68429fbac7d23 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 9 Oct 2023 16:51:32 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../presentation/common/WalletPreviewData.kt | 1 + .../common/component/TokenItem.kt | 4 ++- .../common/state/TokenItemState.kt | 1 + .../OrganizeTokensStateHolder.kt | 14 ++++++--- .../organizetokens/OrganizeTokensViewModel.kt | 22 +++++++++++++ .../model/OrganizeTokensListState.kt | 8 +++++ .../error/TokenListHiddenStateConverter.kt | 31 +++++++++++++++++++ .../CryptoCurrencyToDraggableItemConverter.kt | 12 +++++-- .../wallet/ui/components/common/WalletCard.kt | 3 +- 9 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/error/TokenListHiddenStateConverter.kt diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index 22e3dba93f..9456466cb9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -167,6 +167,7 @@ internal object WalletPreviewData { iconState = tokenIconState, titleState = TokenItemState.TitleState.Content(text = "Polygon"), cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = "3 172,14 $"), + isBalanceHidden = false, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt index 0d23420655..930a9d838b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt @@ -42,7 +42,9 @@ internal fun TokenItem( .tokenClickable(state = state) .background(color = TangemTheme.colors.background.primary), ) { - val isBalanceHidden = (state as? TokenItemState.Content)?.isBalanceHidden ?: false + val isBalanceHidden = (state as? TokenItemState.Content)?.isBalanceHidden + ?: (state as? TokenItemState.Draggable)?.isBalanceHidden + ?: false TokenIcon(state = state.iconState, modifier = Modifier.layoutId(layoutId = LayoutId.ICON)) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt index f9226a1bbe..b5d6b52d47 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt @@ -72,6 +72,7 @@ internal sealed class TokenItemState { override val iconState: IconState, override val titleState: TitleState, override val cryptoAmountState: CryptoAmountState, + val isBalanceHidden: Boolean, ) : TokenItemState() { override val fiatAmountState: FiatAmountState? = null override val priceChangeState: PriceChangeState? = null diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt index b8d2dd73a2..9bb4d7874c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt @@ -11,6 +11,7 @@ import com.tangem.feature.wallet.presentation.organizetokens.model.OrganizeToken import com.tangem.feature.wallet.presentation.organizetokens.model.OrganizeTokensState import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.InProgressStateConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.TokenListToStateConverter +import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.error.TokenListHiddenStateConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.error.TokenListErrorConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.error.TokenListSortingErrorConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.items.CryptoCurrencyToDraggableItemConverter @@ -24,12 +25,14 @@ internal class OrganizeTokensStateHolder( private val intents: OrganizeTokensIntents, private val dragAndDropIntents: DragAndDropIntents, private val appCurrencyProvider: Provider, + private val isBalanceHiddenProvider: Provider, + private val listStateProvider: Provider, ) { private val stateFlowInternal: MutableStateFlow = MutableStateFlow(getInitialState()) private val tokenListConverter by lazy { - val tokensConverter = CryptoCurrencyToDraggableItemConverter(appCurrencyProvider) + val tokensConverter = CryptoCurrencyToDraggableItemConverter(appCurrencyProvider, isBalanceHiddenProvider) val itemsConverter = TokenListToListStateConverter( tokensConverter = tokensConverter, groupsConverter = NetworkGroupToDraggableItemsConverter(tokensConverter), @@ -38,9 +41,8 @@ internal class OrganizeTokensStateHolder( TokenListToStateConverter(Provider(stateFlowInternal::value), itemsConverter) } - private val inProgressStateConverter by lazy { - InProgressStateConverter() - } + private val inProgressStateConverter by lazy { InProgressStateConverter() } + private val tokenListHiddenStateConverter by lazy { TokenListHiddenStateConverter(listStateProvider) } private val tokenListErrorConverter by lazy { TokenListErrorConverter(Provider(stateFlowInternal::value), inProgressStateConverter) @@ -80,6 +82,10 @@ internal class OrganizeTokensStateHolder( updateState { copy(header = header.copy(isSortedByBalance = false)) } } + fun updateHiddenState(isBalanceHidden: Boolean) { + updateState { copy(itemsState = tokenListHiddenStateConverter.convert(isBalanceHidden)) } + } + fun updateStateWithError(error: TokenListError) { updateState { tokenListErrorConverter.convert(error) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt index 5a1af707d2..d71ac77914 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt @@ -7,6 +7,8 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.balancehiding.IsBalanceHiddenUseCase +import com.tangem.domain.balancehiding.ListenToFlipsUseCase import com.tangem.domain.tokens.ApplyTokenListSortingUseCase import com.tangem.domain.tokens.GetTokenListUseCase import com.tangem.domain.tokens.ToggleTokenListGroupingUseCase @@ -36,6 +38,8 @@ internal class OrganizeTokensViewModel @Inject constructor( private val toggleTokenListSortingUseCase: ToggleTokenListSortingUseCase, private val applyTokenListSortingUseCase: ApplyTokenListSortingUseCase, private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase, + private val isBalanceHiddenUseCase: IsBalanceHiddenUseCase, + private val listenToFlipsUseCase: ListenToFlipsUseCase, private val analyticsEventsHandler: AnalyticsEventHandler, private val dispatchers: CoroutineDispatcherProvider, savedStateHandle: SavedStateHandle, @@ -45,6 +49,8 @@ internal class OrganizeTokensViewModel @Inject constructor( private val selectedAppCurrencyFlow = createSelectedAppCurrencyFlow() + private var isBalanceHidden = true + private val dragAndDropAdapter = DragAndDropAdapter( listStateProvider = Provider { uiState.value.itemsState }, ) @@ -53,6 +59,8 @@ internal class OrganizeTokensViewModel @Inject constructor( intents = this, dragAndDropIntents = dragAndDropAdapter, appCurrencyProvider = Provider(selectedAppCurrencyFlow::value), + isBalanceHiddenProvider = Provider { isBalanceHidden }, + listStateProvider = Provider { uiState.value.itemsState }, ) private val userWalletId: UserWalletId by lazy { @@ -68,6 +76,20 @@ internal class OrganizeTokensViewModel @Inject constructor( override fun onCreate(owner: LifecycleOwner) { analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ScreenOpened) + isBalanceHiddenUseCase() + .flowWithLifecycle(owner.lifecycle) + .onEach { hidden -> + isBalanceHidden = hidden + stateHolder.updateHiddenState(isBalanceHidden) + } + .launchIn(viewModelScope) + + viewModelScope.launch { + listenToFlipsUseCase() + .flowWithLifecycle(owner.lifecycle) + .collect() + } + bootstrapTokenList() bootstrapDragAndDropUpdates() } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensListState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensListState.kt index 5d16b5035c..2bc9fe9dd9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensListState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensListState.kt @@ -19,4 +19,12 @@ internal sealed class OrganizeTokensListState { object Empty : OrganizeTokensListState() { override val items: PersistentList = persistentListOf() } + + fun copySealed(items: PersistentList = this.items): OrganizeTokensListState { + return when (this) { + is GroupedByNetwork -> copy(items = items) + is Ungrouped -> copy(items = items) + is Empty -> Empty + } + } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/error/TokenListHiddenStateConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/error/TokenListHiddenStateConverter.kt new file mode 100644 index 0000000000..96e5cf4538 --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/error/TokenListHiddenStateConverter.kt @@ -0,0 +1,31 @@ +package com.tangem.feature.wallet.presentation.organizetokens.utils.converter.error + +import com.tangem.common.Provider +import com.tangem.feature.wallet.presentation.organizetokens.model.DraggableItem +import com.tangem.feature.wallet.presentation.organizetokens.model.OrganizeTokensListState +import com.tangem.utils.converter.Converter +import kotlinx.collections.immutable.toPersistentList + +internal class TokenListHiddenStateConverter( + private val currentStateProvider: Provider, +) : Converter { + + override fun convert(input: Boolean): OrganizeTokensListState { + val currentState = currentStateProvider() + val isBalanceHidden = input + + return currentState.copySealed( + currentState.items.map { draggableItem -> + if (draggableItem is DraggableItem.Token) { + draggableItem.copy( + tokenItemState = draggableItem.tokenItemState.copy( + isBalanceHidden = isBalanceHidden, + ), + ) + } else { + draggableItem + } + }.toPersistentList(), + ) + } +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/items/CryptoCurrencyToDraggableItemConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/items/CryptoCurrencyToDraggableItemConverter.kt index aa518deba2..f18e43de7a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/items/CryptoCurrencyToDraggableItemConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/converter/items/CryptoCurrencyToDraggableItemConverter.kt @@ -13,26 +13,29 @@ import com.tangem.utils.converter.Converter internal class CryptoCurrencyToDraggableItemConverter( private val appCurrencyProvider: Provider, + private val isBalanceHiddenProvider: Provider, ) : Converter { private val iconStateConverter = CryptoCurrencyToIconStateConverter() override fun convert(value: CryptoCurrencyStatus): DraggableItem.Token { - return createDraggableToken(value, appCurrencyProvider()) + return createDraggableToken(value, appCurrencyProvider(), isBalanceHiddenProvider()) } override fun convertList(input: Collection): List { val appCurrency = appCurrencyProvider() + val isBalanceHidden = isBalanceHiddenProvider() - return input.map { createDraggableToken(it, appCurrency) } + return input.map { createDraggableToken(it, appCurrency, isBalanceHidden) } } private fun createDraggableToken( currencyStatus: CryptoCurrencyStatus, appCurrency: AppCurrency, + isBalanceHidden: Boolean, ): DraggableItem.Token { return DraggableItem.Token( - tokenItemState = createTokenItemState(currencyStatus, appCurrency), + tokenItemState = createTokenItemState(currencyStatus, appCurrency, isBalanceHidden), groupId = getGroupHeaderId(currencyStatus.currency.network), ) } @@ -40,6 +43,7 @@ internal class CryptoCurrencyToDraggableItemConverter( private fun createTokenItemState( currencyStatus: CryptoCurrencyStatus, appCurrency: AppCurrency, + isBalanceHidden: Boolean, ): TokenItemState.Draggable { val currency = currencyStatus.currency @@ -52,6 +56,8 @@ internal class CryptoCurrencyToDraggableItemConverter( } else { TokenItemState.CryptoAmountState.Content(text = getFormattedFiatAmount(currencyStatus, appCurrency)) }, + isBalanceHidden = isBalanceHidden, + ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletCard.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletCard.kt index ffd3f192de..9af63cffb8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletCard.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletCard.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.* import androidx.constraintlayout.compose.* +import com.tangem.common.Strings import com.tangem.core.ui.components.FontSizeRange import com.tangem.core.ui.components.RectangleShimmer import com.tangem.core.ui.components.ResizableText @@ -296,7 +297,7 @@ private fun Balance(state: WalletCardState, modifier: Modifier = Modifier) { style = TangemTheme.typography.h2, ) } - is WalletCardState.HiddenContent -> NonContentBalanceText(text = WalletCardState.HIDDEN_BALANCE_TEXT) + is WalletCardState.HiddenContent -> NonContentBalanceText(TextReference.Str(Strings.STARS)) is WalletCardState.Error -> NonContentBalanceText(text = WalletCardState.EMPTY_BALANCE_TEXT) is WalletCardState.Loading -> { RectangleShimmer(modifier = Modifier.nonContentBalanceSize(TangemTheme.dimens))