Updated on 2026-08-14
This commit is contained in:
parent
115645bccf
commit
3eb3ea260f
30 changed files with 96 additions and 300 deletions
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ internal data class OrganizeTokensState(
|
|||
val actions: ActionsConfig,
|
||||
val dndConfig: DragAndDropConfig,
|
||||
val scrollListToTop: StateEvent<Unit>,
|
||||
val isBalanceHidden: Boolean,
|
||||
) {
|
||||
|
||||
data class HeaderConfig(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
)
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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) },
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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]!!)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue