Updated on 2026-08-14
This commit is contained in:
parent
ae2edc7fbf
commit
7cdf385873
16 changed files with 143 additions and 102 deletions
|
|
@ -0,0 +1,17 @@
|
|||
package com.tangem.feature.wallet.presentation.wallet.domain
|
||||
|
||||
import com.tangem.domain.models.scan.CardDTO
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
|
||||
fun UserWallet.getCardsCount(): Int? {
|
||||
return if (isMultiCurrency) {
|
||||
when (val status = scanResponse.card.backupStatus) {
|
||||
is CardDTO.BackupStatus.Active -> status.cardCount + 1
|
||||
is CardDTO.BackupStatus.CardLinked -> status.cardCount + 1
|
||||
is CardDTO.BackupStatus.NoBackup -> 1
|
||||
null -> 1 // Multi-currency wallet without backup function. Example, 4.12
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
|
@ -2,9 +2,10 @@ package com.tangem.feature.wallet.presentation.wallet.domain
|
|||
|
||||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.extensions.plus
|
||||
import com.tangem.core.ui.extensions.stringReference
|
||||
import com.tangem.core.ui.extensions.wrappedList
|
||||
import com.tangem.core.ui.utils.BigDecimalFormatter
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.common.util.cardTypesResolver
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
import com.tangem.feature.wallet.impl.R
|
||||
import java.math.BigDecimal
|
||||
|
|
@ -16,55 +17,73 @@ import java.math.BigDecimal
|
|||
*/
|
||||
internal object WalletAdditionalInfoFactory {
|
||||
|
||||
private val DIVIDER_RES by lazy { TextReference.Str(value = " • ") }
|
||||
private val DIVIDER by lazy(mode = LazyThreadSafetyMode.NONE) { stringReference(value = " • ") }
|
||||
|
||||
/**
|
||||
* Get additional info
|
||||
*
|
||||
* @param cardTypesResolver card type resolver
|
||||
* @param wallet current wallet
|
||||
* @param currencyAmount amount of currency
|
||||
*/
|
||||
fun resolve(
|
||||
cardTypesResolver: CardTypesResolver,
|
||||
wallet: UserWallet,
|
||||
currencyAmount: BigDecimal? = null,
|
||||
): TextReference {
|
||||
return if (cardTypesResolver.isMultiwalletAllowed()) {
|
||||
resolveMultiCurrencyInfo(cardTypesResolver, wallet)
|
||||
fun resolve(wallet: UserWallet, currencyAmount: BigDecimal? = null): TextReference {
|
||||
return if (wallet.isMultiCurrency) {
|
||||
wallet.resolveMultiCurrencyInfo()
|
||||
} else {
|
||||
resolveSingleCurrencyInfo(cardTypesResolver, wallet, currencyAmount)
|
||||
wallet.resolveSingleCurrencyInfo(currencyAmount)
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveMultiCurrencyInfo(cardTypeResolver: CardTypesResolver, wallet: UserWallet): TextReference {
|
||||
val backupCardsCount = wallet.cardsInWallet.size + 1
|
||||
val backupInfoRes = TextReference.PluralRes(
|
||||
id = R.plurals.card_label_card_count,
|
||||
count = backupCardsCount,
|
||||
formatArgs = wrappedList(backupCardsCount),
|
||||
)
|
||||
|
||||
return if (wallet.isLocked) {
|
||||
backupInfoRes + DIVIDER_RES + TextReference.Res(R.string.common_locked)
|
||||
private fun UserWallet.resolveMultiCurrencyInfo(): TextReference {
|
||||
return if (isLocked) {
|
||||
getBackupInfoWithDivider(backupCardsCount = getCardsCount()) + TextReference.Res(R.string.common_locked)
|
||||
} else {
|
||||
val cardTypeResolver = scanResponse.cardTypesResolver
|
||||
if (cardTypeResolver.isWallet2()) {
|
||||
backupInfoRes + DIVIDER_RES + TextReference.Res(id = R.string.common_seed_phrase)
|
||||
resolveWallet2Info()
|
||||
} else {
|
||||
backupInfoRes
|
||||
getBackupInfo(backupCardsCount = getCardsCount())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveSingleCurrencyInfo(
|
||||
cardTypeResolver: CardTypesResolver,
|
||||
wallet: UserWallet,
|
||||
currencyAmount: BigDecimal?,
|
||||
): TextReference {
|
||||
return if (wallet.isLocked) {
|
||||
private fun UserWallet.resolveWallet2Info(): TextReference {
|
||||
return if (isImported) {
|
||||
getBackupInfoWithDivider(backupCardsCount = getCardsCount()) +
|
||||
TextReference.Res(id = R.string.common_seed_phrase)
|
||||
} else {
|
||||
getBackupInfo(backupCardsCount = getCardsCount())
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBackupInfoWithDivider(backupCardsCount: Int?): TextReference {
|
||||
return if (backupCardsCount != null) {
|
||||
getBackupInfoTextReference(count = backupCardsCount) + DIVIDER
|
||||
} else {
|
||||
TextReference.EMPTY
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBackupInfo(backupCardsCount: Int?): TextReference {
|
||||
return if (backupCardsCount != null) {
|
||||
getBackupInfoTextReference(count = backupCardsCount)
|
||||
} else {
|
||||
TextReference.EMPTY
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBackupInfoTextReference(count: Int): TextReference {
|
||||
return TextReference.PluralRes(
|
||||
id = R.plurals.card_label_card_count,
|
||||
count = count,
|
||||
formatArgs = wrappedList(count),
|
||||
)
|
||||
}
|
||||
|
||||
private fun UserWallet.resolveSingleCurrencyInfo(currencyAmount: BigDecimal?): TextReference {
|
||||
return if (isLocked) {
|
||||
TextReference.Res(R.string.common_locked)
|
||||
} else {
|
||||
val blockchain = cardTypeResolver.getBlockchain()
|
||||
val blockchain = scanResponse.cardTypesResolver.getBlockchain()
|
||||
val amount = currencyAmount?.let {
|
||||
BigDecimalFormatter.formatCryptoAmount(
|
||||
cryptoAmount = it,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@ package com.tangem.feature.wallet.presentation.wallet.domain
|
|||
|
||||
import androidx.annotation.DrawableRes
|
||||
import com.tangem.blockchain.common.Blockchain
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.common.util.cardTypesResolver
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
import com.tangem.feature.wallet.impl.R
|
||||
|
||||
/**
|
||||
|
|
@ -12,34 +13,41 @@ import com.tangem.feature.wallet.impl.R
|
|||
*/
|
||||
internal object WalletImageResolver {
|
||||
|
||||
private const val DOUBLE_WALLET_SET_BACKUP_COUNT = 1
|
||||
private const val TRIPLE_WALLET_SET_BACKUP_COUNT = 2
|
||||
private const val DOUBLE_WALLET_SET_BACKUP_COUNT = 2
|
||||
private const val TRIPLE_WALLET_SET_BACKUP_COUNT = 3
|
||||
|
||||
/** Get image by [cardTypesResolver] */
|
||||
/** Get a specified wallet [userWallet] image */
|
||||
@DrawableRes
|
||||
fun resolve(cardTypesResolver: CardTypesResolver): Int? {
|
||||
fun resolve(userWallet: UserWallet): Int? {
|
||||
val cardTypesResolver = userWallet.scanResponse.cardTypesResolver
|
||||
return when {
|
||||
cardTypesResolver.isWallet2() -> resolveWallet2(cardTypesResolver)
|
||||
cardTypesResolver.isDev() -> R.drawable.ill_dev_120_106
|
||||
cardTypesResolver.isWallet2() -> userWallet.resolveWallet2()
|
||||
cardTypesResolver.isTangemWallet() -> R.drawable.ill_wallet_120_106
|
||||
cardTypesResolver.isWhiteWallet() -> R.drawable.ill_old_wallet_120_106
|
||||
cardTypesResolver.isTangemTwins() -> R.drawable.ill_twin_120_106
|
||||
cardTypesResolver.isStart2Coin() -> R.drawable.ill_start2coin_120_106
|
||||
cardTypesResolver.isTangemNote() -> resolveNote(cardTypesResolver)
|
||||
cardTypesResolver.isDev() -> R.drawable.ill_dev_120_106
|
||||
cardTypesResolver.isTangemNote() -> resolveNote(blockchain = cardTypesResolver.getBlockchain())
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveWallet2(cardTypesResolver: CardTypesResolver): Int? {
|
||||
return when (cardTypesResolver.getBackupCardsCount()) {
|
||||
DOUBLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards2_120_106
|
||||
TRIPLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards3_120_106
|
||||
else -> null
|
||||
private fun UserWallet.resolveWallet2(): Int? {
|
||||
val count = getCardsCount()
|
||||
|
||||
return if (count != null) {
|
||||
when (count) {
|
||||
DOUBLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards2_120_106
|
||||
TRIPLE_WALLET_SET_BACKUP_COUNT -> R.drawable.ill_wallet2_cards3_120_106
|
||||
else -> null
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
private fun resolveNote(cardTypesResolver: CardTypesResolver): Int? {
|
||||
return when (cardTypesResolver.getBlockchain()) {
|
||||
private fun resolveNote(blockchain: Blockchain): Int? {
|
||||
return when (blockchain) {
|
||||
Blockchain.Bitcoin -> R.drawable.ill_note_btc_120_106
|
||||
Blockchain.Ethereum -> R.drawable.ill_note_ethereum_120_106
|
||||
Blockchain.BSC -> R.drawable.ill_note_binance_120_106
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.wallet.state.factory
|
|||
import arrow.core.Either
|
||||
import com.tangem.common.Provider
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.tokens.error.TokenListError
|
||||
import com.tangem.domain.tokens.model.TokenList
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
|
|
@ -17,10 +16,11 @@ import com.tangem.utils.converter.Converter
|
|||
/**
|
||||
* Converter from loaded [TokenListError] or [TokenList] to [WalletMultiCurrencyState]
|
||||
*
|
||||
* @property currentStateProvider current ui state provider
|
||||
* @param cardTypeResolverProvider card type resolver
|
||||
* @param currentWalletProvider current wallet provider
|
||||
* @param clickIntents screen click intents
|
||||
* @property currentStateProvider current ui state provider
|
||||
* @property tokenListErrorConverter converter of tokens list
|
||||
* @param appCurrencyProvider app currency provider
|
||||
* @param currentWalletProvider current wallet provider
|
||||
* @param clickIntents screen click intents
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
|
|
@ -28,14 +28,12 @@ internal class WalletLoadedTokensListConverter(
|
|||
private val currentStateProvider: Provider<WalletState>,
|
||||
private val tokenListErrorConverter: TokenListErrorConverter,
|
||||
appCurrencyProvider: Provider<AppCurrency>,
|
||||
cardTypeResolverProvider: Provider<CardTypesResolver>,
|
||||
currentWalletProvider: Provider<UserWallet>,
|
||||
clickIntents: WalletClickIntents,
|
||||
) : Converter<Either<TokenListError, TokenList>, WalletState> {
|
||||
|
||||
private val tokenListStateConverter = TokenListToWalletStateConverter(
|
||||
currentStateProvider = currentStateProvider,
|
||||
cardTypeResolverProvider = cardTypeResolverProvider,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
appCurrencyProvider = appCurrencyProvider,
|
||||
isWalletContentHidden = false, // TODO: [REDACTED_JIRA]
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
|
|||
import com.tangem.core.ui.components.marketprice.PriceChangeConfig
|
||||
import com.tangem.core.ui.utils.BigDecimalFormatter
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.tokens.error.CurrencyStatusError
|
||||
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
|
|
@ -23,7 +22,6 @@ import java.math.BigDecimal
|
|||
|
||||
internal class WalletSingleCurrencyLoadedBalanceConverter(
|
||||
private val currentStateProvider: Provider<WalletState>,
|
||||
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
|
||||
private val appCurrencyProvider: Provider<AppCurrency>,
|
||||
private val currentWalletProvider: Provider<UserWallet>,
|
||||
private val currencyStatusErrorConverter: CurrencyStatusErrorConverter,
|
||||
|
|
@ -90,7 +88,6 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
|
|||
id = selectedWallet.id,
|
||||
title = selectedWallet.title,
|
||||
additionalInfo = WalletAdditionalInfoFactory.resolve(
|
||||
cardTypesResolver = cardTypeResolverProvider(),
|
||||
wallet = currentWalletProvider(),
|
||||
currencyAmount = status.amount,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ internal class WalletSkeletonStateConverter(
|
|||
|
||||
private fun UserWallet.createAdditionalInfo(): TextReference? {
|
||||
return if (isMultiCurrency) {
|
||||
WalletAdditionalInfoFactory.resolve(cardTypesResolver = scanResponse.cardTypesResolver, wallet = this)
|
||||
WalletAdditionalInfoFactory.resolve(wallet = this)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
|
@ -144,7 +144,7 @@ internal class WalletSkeletonStateConverter(
|
|||
|
||||
@DrawableRes
|
||||
private fun UserWallet.createImageResId(): Int? {
|
||||
return WalletImageResolver.resolve(cardTypesResolver = scanResponse.cardTypesResolver)
|
||||
return WalletImageResolver.resolve(userWallet = this)
|
||||
}
|
||||
|
||||
private fun createPullToRefreshConfig(): WalletPullToRefreshConfig {
|
||||
|
|
|
|||
|
|
@ -66,9 +66,8 @@ internal class WalletStateFactory(
|
|||
WalletLoadedTokensListConverter(
|
||||
currentStateProvider = currentStateProvider,
|
||||
tokenListErrorConverter = tokenListErrorConverter,
|
||||
cardTypeResolverProvider = currentCardTypeResolverProvider,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
appCurrencyProvider = appCurrencyProvider,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
clickIntents = clickIntents,
|
||||
)
|
||||
}
|
||||
|
|
@ -91,7 +90,6 @@ internal class WalletStateFactory(
|
|||
private val singleCurrencyLoadedBalanceConverter by lazy {
|
||||
WalletSingleCurrencyLoadedBalanceConverter(
|
||||
currentStateProvider = currentStateProvider,
|
||||
cardTypeResolverProvider = currentCardTypeResolverProvider,
|
||||
appCurrencyProvider = appCurrencyProvider,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
currencyStatusErrorConverter = currencyStatusErrorConverter,
|
||||
|
|
@ -186,7 +184,6 @@ internal class WalletStateFactory(
|
|||
isBottomSheetShow = true,
|
||||
onBottomSheetDismiss = clickIntents::onDismissBottomSheet,
|
||||
)
|
||||
else -> state
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ internal class WalletsUnlockStateConverter(
|
|||
id = id,
|
||||
title = title,
|
||||
additionalInfo = userWallet.createAdditionalInfo(),
|
||||
imageResId = WalletImageResolver.resolve(cardTypesResolver = userWallet.scanResponse.cardTypesResolver),
|
||||
imageResId = WalletImageResolver.resolve(userWallet = userWallet),
|
||||
onRenameClick = onRenameClick,
|
||||
onDeleteClick = onDeleteClick,
|
||||
)
|
||||
|
|
@ -126,7 +126,7 @@ internal class WalletsUnlockStateConverter(
|
|||
|
||||
private fun UserWallet.createAdditionalInfo(): TextReference? {
|
||||
return if (isMultiCurrency) {
|
||||
WalletAdditionalInfoFactory.resolve(cardTypesResolver = scanResponse.cardTypesResolver, wallet = this)
|
||||
WalletAdditionalInfoFactory.resolve(wallet = this)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package com.tangem.feature.wallet.presentation.wallet.utils
|
|||
import com.tangem.common.Provider
|
||||
import com.tangem.core.ui.utils.BigDecimalFormatter.formatFiatAmount
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.tokens.model.TokenList.FiatBalance
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
import com.tangem.feature.wallet.presentation.wallet.domain.WalletAdditionalInfoFactory
|
||||
|
|
@ -12,7 +11,6 @@ import com.tangem.utils.converter.Converter
|
|||
|
||||
internal class FiatBalanceToWalletCardConverter(
|
||||
private val currentState: WalletCardState,
|
||||
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
|
||||
private val appCurrencyProvider: Provider<AppCurrency>,
|
||||
private val currentWalletProvider: Provider<UserWallet>,
|
||||
private val isWalletContentHidden: Boolean,
|
||||
|
|
@ -37,10 +35,7 @@ internal class FiatBalanceToWalletCardConverter(
|
|||
imageResId = imageResId,
|
||||
onDeleteClick = onDeleteClick,
|
||||
onRenameClick = onRenameClick,
|
||||
additionalInfo = WalletAdditionalInfoFactory.resolve(
|
||||
cardTypesResolver = cardTypeResolverProvider(),
|
||||
wallet = currentWalletProvider(),
|
||||
),
|
||||
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -60,10 +55,7 @@ internal class FiatBalanceToWalletCardConverter(
|
|||
WalletCardState.Content(
|
||||
id = currentState.id,
|
||||
title = currentState.title,
|
||||
additionalInfo = WalletAdditionalInfoFactory.resolve(
|
||||
cardTypesResolver = cardTypeResolverProvider(),
|
||||
wallet = currentWalletProvider(),
|
||||
),
|
||||
additionalInfo = WalletAdditionalInfoFactory.resolve(wallet = currentWalletProvider()),
|
||||
imageResId = currentState.imageResId,
|
||||
onRenameClick = currentState.onRenameClick,
|
||||
onDeleteClick = currentState.onDeleteClick,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.tangem.feature.wallet.presentation.wallet.utils
|
|||
|
||||
import com.tangem.common.Provider
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.common.CardTypesResolver
|
||||
import com.tangem.domain.tokens.model.TokenList
|
||||
import com.tangem.domain.wallets.models.UserWallet
|
||||
import com.tangem.feature.wallet.presentation.wallet.state.WalletMultiCurrencyState
|
||||
|
|
@ -16,7 +15,6 @@ import kotlinx.collections.immutable.toPersistentList
|
|||
@Suppress("LongParameterList")
|
||||
internal class TokenListToWalletStateConverter(
|
||||
private val currentStateProvider: Provider<WalletState>,
|
||||
private val cardTypeResolverProvider: Provider<CardTypesResolver>,
|
||||
private val currentWalletProvider: Provider<UserWallet>,
|
||||
private val appCurrencyProvider: Provider<AppCurrency>,
|
||||
private val isWalletContentHidden: Boolean,
|
||||
|
|
@ -50,9 +48,8 @@ internal class TokenListToWalletStateConverter(
|
|||
val selectedWalletCard = walletsListConfig.wallets[selectedWalletIndex]
|
||||
val converter = FiatBalanceToWalletCardConverter(
|
||||
currentState = selectedWalletCard,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
cardTypeResolverProvider = cardTypeResolverProvider,
|
||||
appCurrencyProvider = appCurrencyProvider,
|
||||
currentWalletProvider = currentWalletProvider,
|
||||
isWalletContentHidden = isWalletContentHidden,
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue