Updated on 2026-08-14

This commit is contained in:
Tangem 2023-10-09 20:41:33 +03:00
parent 115645bccf
commit 3eb3ea260f
30 changed files with 96 additions and 300 deletions

View file

@ -57,19 +57,6 @@ internal object WalletPreviewData {
)
}
val walletCardHiddenContentState by lazy {
WalletCardState.HiddenContent(
id = UserWalletId("42"),
title = "Wallet 1",
imageResId = R.drawable.ill_wallet2_cards3_120_106,
onRenameClick = { _, _ -> },
onDeleteClick = {},
balance = "8923,05 $",
additionalInfo = TextReference.Str("3 cards • Seed phrase"),
cardCount = 1,
)
}
val walletCardErrorState by lazy {
WalletCardState.Error(
id = UserWalletId("24"),
@ -84,7 +71,6 @@ internal object WalletPreviewData {
mapOf(
UserWalletId(stringValue = "123") to walletCardContentState,
UserWalletId(stringValue = "321") to walletCardLoadingState,
UserWalletId(stringValue = "42") to walletCardHiddenContentState,
UserWalletId(stringValue = "24") to walletCardErrorState,
)
}
@ -131,7 +117,6 @@ internal object WalletPreviewData {
fiatAmountState = TokenItemState.FiatAmountState.Content(text = "321 $"),
cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = "5,412 MATIC"),
priceChangeState = TokenItemState.PriceChangeState.Unknown,
isBalanceHidden = false,
onItemClick = {},
onItemLongClick = {},
)
@ -155,7 +140,6 @@ internal object WalletPreviewData {
valueInPercent = "2.0%",
type = PriceChangeType.UP,
),
isBalanceHidden = false,
onItemClick = {},
onItemLongClick = {},
)
@ -167,7 +151,6 @@ internal object WalletPreviewData {
iconState = tokenIconState,
titleState = TokenItemState.TitleState.Content(text = "Polygon"),
cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = "3 172,14 $"),
isBalanceHidden = false,
)
}
@ -292,6 +275,7 @@ internal object WalletPreviewData {
onCancelClick = {},
),
scrollListToTop = consumedEvent(),
isBalanceHidden = true
)
}

View file

@ -35,6 +35,7 @@ internal fun TokenItem(
state: TokenItemState,
modifier: Modifier = Modifier,
reorderableTokenListState: ReorderableLazyListState? = null,
isBalanceHidden: Boolean
) {
CustomContainer(
state = state,
@ -42,10 +43,6 @@ internal fun TokenItem(
.tokenClickable(state = state)
.background(color = TangemTheme.colors.background.primary),
) {
val isBalanceHidden = (state as? TokenItemState.Content)?.isBalanceHidden
?: (state as? TokenItemState.Draggable)?.isBalanceHidden
?: false
TokenIcon(state = state.iconState, modifier = Modifier.layoutId(layoutId = LayoutId.ICON))
TokenTitle(
@ -382,7 +379,7 @@ private fun calculateLayoutHeight(
@Composable
private fun Preview_CustomTokenItem_InLight(@PreviewParameter(TokenItemStateProvider::class) state: TokenItemState) {
TangemTheme(isDark = false) {
TokenItem(state = state)
TokenItem(state = state, isBalanceHidden = false)
}
}

View file

@ -55,7 +55,6 @@ internal sealed class TokenItemState {
override val fiatAmountState: FiatAmountState,
override val cryptoAmountState: CryptoAmountState.Content,
override val priceChangeState: PriceChangeState?,
val isBalanceHidden: Boolean,
val onItemClick: () -> Unit,
val onItemLongClick: () -> Unit,
) : TokenItemState()
@ -72,7 +71,6 @@ 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

View file

@ -63,6 +63,7 @@ internal fun OrganizeTokensScreen(state: OrganizeTokensState, modifier: Modifier
listState = tokensListState,
state = state.itemsState,
dndConfig = state.dndConfig,
isBalanceHidden = state.isBalanceHidden,
)
},
floatingActionButtonPosition = FabPosition.Center,
@ -83,6 +84,7 @@ private fun TokenList(
state: OrganizeTokensListState,
dndConfig: OrganizeTokensState.DragAndDropConfig,
modifier: Modifier = Modifier,
isBalanceHidden: Boolean,
) {
Box(modifier = modifier) {
val onDragEnd: (Int, Int) -> Unit = remember {
@ -125,6 +127,7 @@ private fun TokenList(
item = item,
reorderableState = reorderableListState,
onDragStart = onDragStart,
isBalanceHidden = isBalanceHidden,
)
}
}
@ -139,6 +142,7 @@ private fun LazyItemScope.DraggableItem(
item: DraggableItem,
reorderableState: ReorderableLazyListState,
onDragStart: () -> Unit,
isBalanceHidden: Boolean,
) {
var isDragging by remember {
mutableStateOf(value = false)
@ -163,6 +167,7 @@ private fun LazyItemScope.DraggableItem(
modifier = itemModifier,
state = item.tokenItemState,
reorderableTokenListState = reorderableState,
isBalanceHidden = isBalanceHidden
)
// Should be presented in the list but remain invisible
is DraggableItem.Placeholder -> Box(modifier = Modifier.fillMaxWidth())

View file

@ -11,7 +11,6 @@ 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
@ -25,14 +24,12 @@ internal class OrganizeTokensStateHolder(
private val intents: OrganizeTokensIntents,
private val dragAndDropIntents: DragAndDropIntents,
private val appCurrencyProvider: Provider<AppCurrency>,
private val isBalanceHiddenProvider: Provider<Boolean>,
private val listStateProvider: Provider<OrganizeTokensListState>,
) {
private val stateFlowInternal: MutableStateFlow<OrganizeTokensState> = MutableStateFlow(getInitialState())
private val tokenListConverter by lazy {
val tokensConverter = CryptoCurrencyToDraggableItemConverter(appCurrencyProvider, isBalanceHiddenProvider)
val tokensConverter = CryptoCurrencyToDraggableItemConverter(appCurrencyProvider)
val itemsConverter = TokenListToListStateConverter(
tokensConverter = tokensConverter,
groupsConverter = NetworkGroupToDraggableItemsConverter(tokensConverter),
@ -42,7 +39,6 @@ internal class OrganizeTokensStateHolder(
}
private val inProgressStateConverter by lazy { InProgressStateConverter() }
private val tokenListHiddenStateConverter by lazy { TokenListHiddenStateConverter(listStateProvider) }
private val tokenListErrorConverter by lazy {
TokenListErrorConverter(Provider(stateFlowInternal::value), inProgressStateConverter)
@ -83,7 +79,7 @@ internal class OrganizeTokensStateHolder(
}
fun updateHiddenState(isBalanceHidden: Boolean) {
updateState { copy(itemsState = tokenListHiddenStateConverter.convert(isBalanceHidden)) }
updateState { copy(isBalanceHidden = isBalanceHidden) }
}
fun updateStateWithError(error: TokenListError) {
@ -113,6 +109,7 @@ internal class OrganizeTokensStateHolder(
canDragItemOver = dragAndDropIntents::canDragItemOver,
),
scrollListToTop = consumedEvent(),
isBalanceHidden = true
)
}

View file

@ -59,8 +59,6 @@ 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 {

View file

@ -12,6 +12,7 @@ internal data class OrganizeTokensState(
val actions: ActionsConfig,
val dndConfig: DragAndDropConfig,
val scrollListToTop: StateEvent<Unit>,
val isBalanceHidden: Boolean,
) {
data class HeaderConfig(

View file

@ -1,12 +0,0 @@
package com.tangem.feature.wallet.presentation.organizetokens.utils.converter
internal class TokenItemHiddenStateConverter {
fun updateHiddenState(wasBalanceHidden: Boolean, isBalanceHidden: Boolean): Boolean {
return when {
!wasBalanceHidden && isBalanceHidden -> true
wasBalanceHidden && !isBalanceHidden -> false
else -> wasBalanceHidden
}
}
}

View file

@ -1,31 +0,0 @@
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<OrganizeTokensListState>,
) : Converter<Boolean, OrganizeTokensListState> {
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(),
)
}
}

View file

@ -13,29 +13,26 @@ import com.tangem.utils.converter.Converter
internal class CryptoCurrencyToDraggableItemConverter(
private val appCurrencyProvider: Provider<AppCurrency>,
private val isBalanceHiddenProvider: Provider<Boolean>,
) : Converter<CryptoCurrencyStatus, DraggableItem.Token> {
private val iconStateConverter = CryptoCurrencyToIconStateConverter()
override fun convert(value: CryptoCurrencyStatus): DraggableItem.Token {
return createDraggableToken(value, appCurrencyProvider(), isBalanceHiddenProvider())
return createDraggableToken(value, appCurrencyProvider())
}
override fun convertList(input: Collection<CryptoCurrencyStatus>): List<DraggableItem.Token> {
val appCurrency = appCurrencyProvider()
val isBalanceHidden = isBalanceHiddenProvider()
return input.map { createDraggableToken(it, appCurrency, isBalanceHidden) }
return input.map { createDraggableToken(it, appCurrency) }
}
private fun createDraggableToken(
currencyStatus: CryptoCurrencyStatus,
appCurrency: AppCurrency,
isBalanceHidden: Boolean,
): DraggableItem.Token {
return DraggableItem.Token(
tokenItemState = createTokenItemState(currencyStatus, appCurrency, isBalanceHidden),
tokenItemState = createTokenItemState(currencyStatus, appCurrency),
groupId = getGroupHeaderId(currencyStatus.currency.network),
)
}
@ -43,7 +40,6 @@ internal class CryptoCurrencyToDraggableItemConverter(
private fun createTokenItemState(
currencyStatus: CryptoCurrencyStatus,
appCurrency: AppCurrency,
isBalanceHidden: Boolean,
): TokenItemState.Draggable {
val currency = currencyStatus.currency
@ -56,8 +52,6 @@ internal class CryptoCurrencyToDraggableItemConverter(
} else {
TokenItemState.CryptoAmountState.Content(text = getFormattedFiatAmount(currencyStatus, appCurrency))
},
isBalanceHidden = isBalanceHidden,
)
}

View file

@ -49,29 +49,6 @@ internal sealed interface WalletCardState {
val balance: String,
) : WalletCardState
/**
* Wallet card hidden content state
*
* @property id wallet id
* @property title wallet name
* @property imageResId wallet image resource id
* @property onRenameClick lambda be invoked when Rename button is clicked
* @property onDeleteClick lambda be invoked when Delete button is clicked
* @property additionalInfo wallet additional info
* @property cardCount number of cards in the wallet
* @property balance wallet balance
*/
data class HiddenContent(
override val id: UserWalletId,
override val title: String,
override val imageResId: Int?,
override val onRenameClick: (UserWalletId, String) -> Unit,
override val onDeleteClick: (UserWalletId) -> Unit,
val additionalInfo: TextReference,
val balance: String,
val cardCount: Int?,
) : WalletCardState
/**
* Wallet card locked state
*
@ -129,7 +106,6 @@ internal sealed interface WalletCardState {
return when (this) {
is Content -> copy(title = title)
is Error -> copy(title = title)
is HiddenContent -> copy(title = title)
is Loading -> copy(title = title)
is LockedContent -> copy(title = title)
}

View file

@ -30,7 +30,6 @@ internal class WalletLoadedTokensListConverter(
private val tokenListErrorConverter: TokenListErrorConverter,
appCurrencyProvider: Provider<AppCurrency>,
currentWalletProvider: Provider<UserWallet>,
isBalanceHiddenProvider: Provider<Boolean>,
clickIntents: WalletClickIntents,
) : Converter<Either<TokenListError, TokenList>, WalletState> {
@ -38,7 +37,6 @@ internal class WalletLoadedTokensListConverter(
currentStateProvider = currentStateProvider,
currentWalletProvider = currentWalletProvider,
appCurrencyProvider = appCurrencyProvider,
isBalanceHiddenProvider = isBalanceHiddenProvider,
clickIntents = clickIntents,
)

View file

@ -26,7 +26,6 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
private val currentStateProvider: Provider<WalletState>,
private val appCurrencyProvider: Provider<AppCurrency>,
private val currentWalletProvider: Provider<UserWallet>,
private val isBalanceHiddenProvider: Provider<Boolean>,
private val currencyStatusErrorConverter: CurrencyStatusErrorConverter,
) : Converter<Either<CurrencyStatusError, CryptoCurrencyStatus>, WalletState> {
@ -87,35 +86,19 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
is CryptoCurrencyStatus.NoQuote,
is CryptoCurrencyStatus.Loaded,
-> {
if (isBalanceHiddenProvider()) {
WalletCardState.HiddenContent(
id = selectedWallet.id,
title = selectedWallet.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(
wallet = currentWalletProvider(),
currencyAmount = status.amount,
),
imageResId = selectedWallet.imageResId,
onRenameClick = selectedWallet.onRenameClick,
onDeleteClick = selectedWallet.onDeleteClick,
balance = formatFiatAmount(status = status, appCurrency = appCurrencyProvider()),
cardCount = currentWalletProvider().getCardsCount(),
)
} else {
WalletCardState.Content(
id = selectedWallet.id,
title = selectedWallet.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(
wallet = currentWalletProvider(),
currencyAmount = status.amount,
),
imageResId = selectedWallet.imageResId,
onRenameClick = selectedWallet.onRenameClick,
onDeleteClick = selectedWallet.onDeleteClick,
balance = formatFiatAmount(status = status, appCurrency = appCurrencyProvider()),
cardCount = currentWalletProvider().getCardsCount(),
)
}
WalletCardState.Content(
id = selectedWallet.id,
title = selectedWallet.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(
wallet = currentWalletProvider(),
currencyAmount = status.amount,
),
imageResId = selectedWallet.imageResId,
onRenameClick = selectedWallet.onRenameClick,
onDeleteClick = selectedWallet.onDeleteClick,
balance = formatFiatAmount(status = status, appCurrency = appCurrencyProvider()),
cardCount = currentWalletProvider().getCardsCount(),
)
}
is CryptoCurrencyStatus.Loading -> {
WalletCardState.Loading(

View file

@ -80,7 +80,6 @@ internal class WalletStateFactory(
tokenListErrorConverter = tokenListErrorConverter,
appCurrencyProvider = appCurrencyProvider,
currentWalletProvider = currentWalletProvider,
isBalanceHiddenProvider = isBalanceHiddenProvider,
clickIntents = clickIntents,
)
}
@ -106,7 +105,6 @@ internal class WalletStateFactory(
currentStateProvider = currentStateProvider,
appCurrencyProvider = appCurrencyProvider,
currentWalletProvider = currentWalletProvider,
isBalanceHiddenProvider = isBalanceHiddenProvider,
currencyStatusErrorConverter = currencyStatusErrorConverter,
)
}

View file

@ -38,12 +38,6 @@ internal class WalletUpdateCardCountConverter(
),
cardCount = currentWalletProvider().getCardsCount(),
)
is WalletCardState.HiddenContent -> walletCard.copy(
additionalInfo = WalletAdditionalInfoFactory.resolve(
wallet = currentWalletProvider(),
),
cardCount = currentWalletProvider().getCardsCount(),
)
else -> walletCard
}
} else {

View file

@ -126,7 +126,11 @@ private fun WalletContent(
horizontalAlignment = Alignment.CenterHorizontally,
) {
item {
WalletsList(config = state.walletsListConfig, lazyListState = walletsListState)
WalletsList(
config = state.walletsListConfig,
lazyListState = walletsListState,
isBalanceHidden = state.isBalanceHidden,
)
}
if (state is WalletSingleCurrencyState) {

View file

@ -38,7 +38,7 @@ private const val SHORT_SNAP_ELEMENT_COUNT = 50
*/
@OptIn(ExperimentalFoundationApi::class)
@Composable
internal fun WalletsList(config: WalletsListConfig, lazyListState: LazyListState) {
internal fun WalletsList(config: WalletsListConfig, lazyListState: LazyListState, isBalanceHidden: Boolean) {
val horizontalCardPadding = TangemTheme.dimens.spacing16
val screenWidth = LocalConfiguration.current.screenWidthDp.dp
val itemWidth by remember(screenWidth) { derivedStateOf { screenWidth - horizontalCardPadding * 2 } }
@ -60,6 +60,7 @@ internal fun WalletsList(config: WalletsListConfig, lazyListState: LazyListState
modifier = Modifier
.animateItemPlacement()
.width(itemWidth),
isBalanceHidden = isBalanceHidden
)
}
}
@ -98,7 +99,11 @@ private fun rememberWalletsFlingBehaviour(lazyListState: LazyListState, itemWidt
@Composable
private fun Preview_WalletsList_LightTheme() {
TangemTheme(isDark = false) {
WalletsList(config = WalletPreviewData.walletListConfig, lazyListState = rememberLazyListState())
WalletsList(
config = WalletPreviewData.walletListConfig,
lazyListState = rememberLazyListState(),
isBalanceHidden = false
)
}
}
@ -106,6 +111,10 @@ private fun Preview_WalletsList_LightTheme() {
@Composable
private fun Preview_WalletsList_DarkTheme() {
TangemTheme(isDark = true) {
WalletsList(config = WalletPreviewData.walletListConfig, lazyListState = rememberLazyListState())
WalletsList(
config = WalletPreviewData.walletListConfig,
lazyListState = rememberLazyListState(),
isBalanceHidden = false
)
}
}

View file

@ -57,7 +57,7 @@ private const val HALF_OF_ITEM_WIDTH = 0.5
[REDACTED_AUTHOR]
*/
@Composable
internal fun WalletCard(state: WalletCardState, modifier: Modifier = Modifier) {
internal fun WalletCard(state: WalletCardState, modifier: Modifier = Modifier, isBalanceHidden: Boolean) {
@Suppress("DestructuringDeclarationWithTooManyEntries")
CardContainer(
name = state.title,
@ -90,6 +90,7 @@ internal fun WalletCard(state: WalletCardState, modifier: Modifier = Modifier) {
top.linkTo(anchor = titleRef.bottom)
bottom.linkTo(anchor = additionalTextRef.top)
},
isBalanceHidden = isBalanceHidden
)
AdditionalInfo(
@ -102,7 +103,6 @@ internal fun WalletCard(state: WalletCardState, modifier: Modifier = Modifier) {
when (state) {
is WalletCardState.Content,
is WalletCardState.Error,
is WalletCardState.HiddenContent,
-> {
end.linkTo(imageRef.start)
width = Dimension.fillToConstraints
@ -275,7 +275,7 @@ private fun TitleText(text: String, modifier: Modifier = Modifier) {
@OptIn(ExperimentalAnimationApi::class)
@Composable
private fun Balance(state: WalletCardState, modifier: Modifier = Modifier) {
private fun Balance(state: WalletCardState, modifier: Modifier = Modifier, isBalanceHidden: Boolean) {
AnimatedContent(
targetState = state,
label = "Update the balance",
@ -288,7 +288,7 @@ private fun Balance(state: WalletCardState, modifier: Modifier = Modifier) {
when (walletCardState) {
is WalletCardState.Content -> {
ResizableText(
text = walletCardState.balance,
text = if (isBalanceHidden) Strings.STARS else walletCardState.balance,
fontSizeRange = FontSizeRange(min = 16.sp, max = TangemTheme.typography.h2.fontSize),
modifier = Modifier.defaultMinSize(minHeight = TangemTheme.dimens.size32),
color = TangemTheme.colors.text.primary1,
@ -297,8 +297,9 @@ private fun Balance(state: WalletCardState, modifier: Modifier = Modifier) {
style = TangemTheme.typography.h2,
)
}
is WalletCardState.HiddenContent -> NonContentBalanceText(TextReference.Str(Strings.STARS))
is WalletCardState.Error -> NonContentBalanceText(text = WalletCardState.EMPTY_BALANCE_TEXT)
is WalletCardState.Error -> NonContentBalanceText(
text = if (isBalanceHidden) WalletCardState.HIDDEN_BALANCE_TEXT else WalletCardState.EMPTY_BALANCE_TEXT
)
is WalletCardState.Loading -> {
RectangleShimmer(modifier = Modifier.nonContentBalanceSize(TangemTheme.dimens))
}
@ -349,7 +350,6 @@ private fun resolveAdditionalTextByState(state: WalletCardState): TextReference?
is WalletCardState.Content -> state.additionalInfo
is WalletCardState.LockedContent -> state.additionalInfo
is WalletCardState.Error -> WalletCardState.EMPTY_BALANCE_TEXT
is WalletCardState.HiddenContent -> WalletCardState.HIDDEN_BALANCE_TEXT
is WalletCardState.Loading -> null
}
}
@ -402,7 +402,7 @@ private fun Preview_WalletCard_LightTheme(
state: WalletCardState,
) {
TangemTheme(isDark = false) {
WalletCard(state = state)
WalletCard(state = state, isBalanceHidden = false)
}
}
@ -410,7 +410,7 @@ private fun Preview_WalletCard_LightTheme(
@Composable
private fun Preview_WalletCard_DarkTheme(@PreviewParameter(WalletCardStateProvider::class) state: WalletCardState) {
TangemTheme(isDark = true) {
WalletCard(state)
WalletCard(state = state, isBalanceHidden = false)
}
}
@ -418,7 +418,6 @@ private class WalletCardStateProvider : CollectionPreviewParameterProvider<Walle
collection = listOf(
WalletPreviewData.walletCardContentState,
WalletPreviewData.walletCardLoadingState,
WalletPreviewData.walletCardHiddenContentState,
WalletPreviewData.walletCardErrorState,
),
)

View file

@ -26,7 +26,7 @@ internal fun LazyListScope.contentItems(
modifier: Modifier = Modifier,
) {
when (state) {
is WalletMultiCurrencyState -> tokensListItems(state.tokensListState, modifier)
is WalletMultiCurrencyState -> tokensListItems(state.tokensListState, modifier, isBalanceHidden)
is WalletSingleCurrencyState -> txHistoryItems(state.txHistoryState, txHistoryItems, isBalanceHidden, modifier)
}
}

View file

@ -30,9 +30,17 @@ private const val NON_CONTENT_TOKENS_LIST_KEY = "NON_CONTENT_TOKENS_LIST"
*
[REDACTED_AUTHOR]
*/
internal fun LazyListScope.tokensListItems(state: WalletTokensListState, modifier: Modifier = Modifier) {
internal fun LazyListScope.tokensListItems(
state: WalletTokensListState,
modifier: Modifier = Modifier,
isBalanceHidden: Boolean,
) {
when (state) {
is WalletTokensListState.ContentState -> contentItems(items = state.items, modifier = modifier)
is WalletTokensListState.ContentState -> contentItems(
items = state.items,
modifier = modifier,
isBalanceHidden = isBalanceHidden
)
WalletTokensListState.Empty -> nonContentItem(modifier = modifier)
}
}
@ -40,6 +48,7 @@ internal fun LazyListScope.tokensListItems(state: WalletTokensListState, modifie
private fun LazyListScope.contentItems(
items: ImmutableList<WalletTokensListState.TokensListItemState>,
modifier: Modifier = Modifier,
isBalanceHidden: Boolean,
) {
itemsIndexed(
items = items,
@ -52,6 +61,7 @@ private fun LazyListScope.contentItems(
currentIndex = index,
lastIndex = items.lastIndex,
),
isBalanceHidden = isBalanceHidden
)
},
)

View file

@ -16,13 +16,17 @@ import com.tangem.feature.wallet.presentation.wallet.state.components.WalletToke
[REDACTED_AUTHOR]
*/
@Composable
internal fun MultiCurrencyContentItem(state: WalletTokensListState.TokensListItemState, modifier: Modifier = Modifier) {
internal fun MultiCurrencyContentItem(
state: WalletTokensListState.TokensListItemState,
modifier: Modifier = Modifier,
isBalanceHidden: Boolean,
) {
when (state) {
is WalletTokensListState.TokensListItemState.NetworkGroupTitle -> {
NetworkGroupItem(networkName = state.name.resolveReference(), modifier = modifier)
}
is WalletTokensListState.TokensListItemState.Token -> {
TokenItem(state = state.state, modifier = modifier)
TokenItem(state = state.state, modifier = modifier, isBalanceHidden = isBalanceHidden)
}
}
}

View file

@ -13,7 +13,6 @@ import java.math.BigDecimal
internal class CryptoCurrencyStatusToTokenItemConverter(
private val appCurrencyProvider: Provider<AppCurrency>,
private val isBalanceHiddenProvider: Provider<Boolean>,
private val clickIntents: WalletClickIntents,
) : Converter<CryptoCurrencyStatus, TokenItemState> {
@ -48,7 +47,6 @@ internal class CryptoCurrencyStatusToTokenItemConverter(
),
cryptoAmountState = TokenItemState.CryptoAmountState.Content(text = getFormattedAmount()),
priceChangeState = getPriceChangeConfig(),
isBalanceHidden = isBalanceHiddenProvider(),
onItemClick = { clickIntents.onTokenItemClick(currency) },
onItemLongClick = { clickIntents.onTokenItemLongClick(cryptoCurrencyStatus = this) },
)

View file

@ -14,7 +14,6 @@ internal class FiatBalanceToWalletCardConverter(
private val currentState: WalletCardState,
private val appCurrencyProvider: Provider<AppCurrency>,
private val currentWalletProvider: Provider<UserWallet>,
private val isBalanceHiddenProvider: Provider<Boolean>,
) : Converter<FiatBalance, WalletCardState> {
override fun convert(value: FiatBalance): WalletCardState {
@ -42,36 +41,19 @@ internal class FiatBalanceToWalletCardConverter(
private fun FiatBalance.Loaded.convertToWalletCardState(): WalletCardState {
val appCurrency = appCurrencyProvider()
return if (isBalanceHiddenProvider()) {
WalletCardState.HiddenContent(
id = currentState.id,
title = currentState.title,
imageResId = currentState.imageResId,
onRenameClick = currentState.onRenameClick,
onDeleteClick = currentState.onDeleteClick,
balance = formatFiatAmount(
fiatAmount = this.amount,
fiatCurrencyCode = appCurrency.code,
fiatCurrencySymbol = appCurrency.symbol,
),
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
cardCount = currentWalletProvider().getCardsCount(),
)
} else {
WalletCardState.Content(
id = currentState.id,
title = currentState.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
imageResId = currentState.imageResId,
onRenameClick = currentState.onRenameClick,
onDeleteClick = currentState.onDeleteClick,
balance = formatFiatAmount(
fiatAmount = this.amount,
fiatCurrencyCode = appCurrency.code,
fiatCurrencySymbol = appCurrency.symbol,
),
cardCount = currentWalletProvider().getCardsCount(),
)
}
return WalletCardState.Content(
id = currentState.id,
title = currentState.title,
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
imageResId = currentState.imageResId,
onRenameClick = currentState.onRenameClick,
onDeleteClick = currentState.onDeleteClick,
balance = formatFiatAmount(
fiatAmount = this.amount,
fiatCurrencyCode = appCurrency.code,
fiatCurrencySymbol = appCurrency.symbol,
),
cardCount = currentWalletProvider().getCardsCount(),
)
}
}

View file

@ -2,68 +2,22 @@ package com.tangem.feature.wallet.presentation.wallet.utils
import com.tangem.common.Converter
import com.tangem.common.Provider
import com.tangem.feature.wallet.presentation.common.state.TokenItemState
import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.TokenItemHiddenStateConverter
import com.tangem.feature.wallet.presentation.wallet.state.WalletMultiCurrencyState
import com.tangem.feature.wallet.presentation.wallet.state.WalletSingleCurrencyState
import com.tangem.feature.wallet.presentation.wallet.state.WalletState
import com.tangem.feature.wallet.presentation.wallet.state.components.WalletTokensListState
import kotlinx.collections.immutable.toImmutableList
internal class HiddenStateConverter(
private val currentStateProvider: Provider<WalletState>,
) : Converter<Boolean, WalletState> {
private val walletHiddenBalanceStateConverter by lazy { WalletHiddenBalanceStateConverter() }
private val tokenItemHiddenStateConverter by lazy { TokenItemHiddenStateConverter() }
override fun convert(value: Boolean): WalletState {
return when (val state = currentStateProvider() as? WalletState.ContentState) {
is WalletMultiCurrencyState.Content -> {
val updatedTokensList = (state.tokensListState as? WalletTokensListState.Content)?.let { content ->
content.copy(
items = content.items.map { tokenListItemState ->
if (tokenListItemState is WalletTokensListState.TokensListItemState.Token) {
if (tokenListItemState.state is TokenItemState.Content) {
tokenListItemState.copy(
state = tokenListItemState.state.copy(
isBalanceHidden = tokenItemHiddenStateConverter.updateHiddenState(
wasBalanceHidden = tokenListItemState.state.isBalanceHidden,
isBalanceHidden = value,
),
),
)
} else {
tokenListItemState
}
} else {
tokenListItemState
}
}.toImmutableList(),
)
} ?: state.tokensListState
state.copy(
walletsListConfig = state.walletsListConfig.copy(
wallets = state.walletsListConfig.wallets.map {
walletHiddenBalanceStateConverter.updateHiddenState(it, value)
}.toImmutableList(),
),
tokensListState = updatedTokensList,
isBalanceHidden = value
)
state.copy(isBalanceHidden = value)
}
is WalletSingleCurrencyState.Content -> {
state.copy(
walletsListConfig = state.walletsListConfig.copy(
wallets = state.walletsListConfig.wallets.map {
walletHiddenBalanceStateConverter.updateHiddenState(it, value)
}.toImmutableList(),
),
isBalanceHidden = value
)
state.copy(isBalanceHidden = value)
}
else -> currentStateProvider()

View file

@ -17,12 +17,10 @@ import kotlinx.collections.immutable.persistentListOf
internal class TokenListToContentItemsConverter(
appCurrencyProvider: Provider<AppCurrency>,
isBalanceHiddenProvider: Provider<Boolean>,
private val clickIntents: WalletClickIntents,
) : Converter<TokenList, WalletTokensListState> {
private val tokenStatusConverter = CryptoCurrencyStatusToTokenItemConverter(
isBalanceHiddenProvider = isBalanceHiddenProvider,
appCurrencyProvider = appCurrencyProvider,
clickIntents = clickIntents,
)

View file

@ -17,12 +17,10 @@ internal class TokenListToWalletStateConverter(
private val currentStateProvider: Provider<WalletState>,
private val currentWalletProvider: Provider<UserWallet>,
private val appCurrencyProvider: Provider<AppCurrency>,
private val isBalanceHiddenProvider: Provider<Boolean>,
clickIntents: WalletClickIntents,
) : Converter<TokenList, WalletState> {
private val tokenListToContentConverter = TokenListToContentItemsConverter(
isBalanceHiddenProvider = isBalanceHiddenProvider,
appCurrencyProvider = appCurrencyProvider,
clickIntents = clickIntents,
)
@ -50,7 +48,6 @@ internal class TokenListToWalletStateConverter(
currentState = selectedWalletCard,
currentWalletProvider = currentWalletProvider,
appCurrencyProvider = appCurrencyProvider,
isBalanceHiddenProvider = isBalanceHiddenProvider,
)
return walletsListConfig.copy(

View file

@ -1,44 +0,0 @@
package com.tangem.feature.wallet.presentation.wallet.utils
import com.tangem.feature.wallet.presentation.wallet.state.components.WalletCardState
internal class WalletHiddenBalanceStateConverter {
fun updateHiddenState(walletCardState: WalletCardState, hiddenBalance: Boolean): WalletCardState {
return when {
walletCardState is WalletCardState.Content && hiddenBalance -> {
contentToHidden(walletCardState)
}
walletCardState is WalletCardState.HiddenContent && !hiddenBalance -> {
hiddenToContent(walletCardState)
}
else -> walletCardState
}
}
private fun contentToHidden(content: WalletCardState.Content): WalletCardState.HiddenContent {
return WalletCardState.HiddenContent(
id = content.id,
title = content.title,
additionalInfo = content.additionalInfo,
imageResId = content.imageResId,
onRenameClick = content.onRenameClick,
onDeleteClick = content.onDeleteClick,
balance = content.balance,
cardCount = content.cardCount,
)
}
private fun hiddenToContent(hiddenContent: WalletCardState.HiddenContent): WalletCardState.Content {
return WalletCardState.Content(
id = hiddenContent.id,
title = hiddenContent.title,
additionalInfo = hiddenContent.additionalInfo,
imageResId = hiddenContent.imageResId,
onRenameClick = hiddenContent.onRenameClick,
onDeleteClick = hiddenContent.onDeleteClick,
balance = hiddenContent.balance,
cardCount = hiddenContent.cardCount,
)
}
}

View file

@ -19,4 +19,10 @@ internal object WalletStateCache {
fun update(userWalletId: UserWalletId, state: WalletState.ContentState) {
states[userWalletId] = state
}
fun updateAll(func: (WalletState.ContentState.() -> WalletState.ContentState)) {
states.keys.forEach {
states[it] = func(states[it]!!)
}
}
}

View file

@ -191,6 +191,7 @@ internal class WalletViewModel @Inject constructor(
.flowWithLifecycle(owner.lifecycle)
.onEach { hidden ->
isBalanceHidden = hidden
WalletStateCache.updateAll { copySealed(isBalanceHidden = hidden) }
uiState = stateFactory.getHiddenBalanceState(isBalanceHidden = hidden)
}
.launchIn(viewModelScope)

View file

@ -126,8 +126,6 @@ internal class WalletsUpdateActionResolver(
}
previousWalletState is WalletCardState.Content &&
previousWalletState.cardCount != selectedWallet.getCardsCount() ||
previousWalletState is WalletCardState.HiddenContent &&
previousWalletState.cardCount != selectedWallet.getCardsCount() -> {
Action.UpdateWalletCardCount
}