From fb4020ac9127381200cfecc45346a1f8004c42d1 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 9 Dec 2025 16:11:28 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../DefaultTangemPayCryptoCurrencyFactory.kt | 64 ++++++++++++++ .../pay/DefaultTangemPaySwapDataFactory.kt | 85 ------------------- .../tangem/data/pay/di/TangemPayDataModule.kt | 8 +- .../DefaultTangemPayCardDetailsRepository.kt | 1 + .../pay/TangemPayCryptoCurrencyFactory.kt | 11 +++ .../domain/pay/model/TangemPayCardBalance.kt | 1 + .../TangemPayTopUpData.kt} | 16 +--- .../components/TangemPayAddFundsComponent.kt | 2 +- .../tangempay/model/TangemPayAddFundsModel.kt | 37 +++++--- .../tangempay/model/TangemPayDetailsModel.kt | 41 ++++----- .../transformers/DetailsBalanceTransformer.kt | 33 +++++-- .../TangemPayAddFundsUMConverter.kt | 2 +- .../tangempay/ui/TangemPayDetailsScreen.kt | 11 ++- 13 files changed, 160 insertions(+), 152 deletions(-) create mode 100644 data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt delete mode 100644 data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPaySwapDataFactory.kt create mode 100644 domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPayCryptoCurrencyFactory.kt rename domain/visa/src/main/kotlin/com/tangem/domain/pay/{TangemPaySwapDataFactory.kt => model/TangemPayTopUpData.kt} (51%) diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt new file mode 100644 index 0000000000..a768bf84b1 --- /dev/null +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPayCryptoCurrencyFactory.kt @@ -0,0 +1,64 @@ +package com.tangem.data.pay + +import arrow.core.Either +import arrow.core.Either.Companion.catch +import com.squareup.moshi.Moshi +import com.tangem.blockchain.blockchains.ethereum.Chain +import com.tangem.blockchainsdk.utils.ExcludedBlockchains +import com.tangem.core.error.UniversalError +import com.tangem.data.common.currency.CryptoCurrencyFactory +import com.tangem.data.common.network.NetworkFactory +import com.tangem.data.pay.util.TangemPayErrorConverter +import com.tangem.datasource.di.NetworkMoshi +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory +import timber.log.Timber +import javax.inject.Inject + +private const val TAG = "TangemPay: DefaultTangemPayCryptoCurrencyFactory" +/** + * Custom token parameters. Will be used only for F&F. + */ +private const val TOKEN_ID = "usd-coin" +private const val TOKEN_NAME = "USDC" +private const val TOKEN_CONTRACT_ADDRESS = "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359" +private const val TOKEN_DECIMALS = 6 + +internal class DefaultTangemPayCryptoCurrencyFactory @Inject constructor( + @NetworkMoshi moshi: Moshi, + excludedBlockchains: ExcludedBlockchains, +) : TangemPayCryptoCurrencyFactory { + + private val cryptoCurrencyFactory by lazy(mode = LazyThreadSafetyMode.NONE) { + CryptoCurrencyFactory(excludedBlockchains) + } + private val networkFactory by lazy(mode = LazyThreadSafetyMode.NONE) { + NetworkFactory(excludedBlockchains) + } + + private val errorConverter by lazy(mode = LazyThreadSafetyMode.NONE) { TangemPayErrorConverter(moshi) } + + override fun create(userWallet: UserWallet, chainId: Int): Either { + return catch { + val chain = requireNotNull(Chain.entries.find { it.id == chainId }) { "Can not find chain with $chainId" } + val blockchain = requireNotNull(chain.blockchain) + val network = networkFactory.create( + blockchain = blockchain, + extraDerivationPath = null, + userWallet = userWallet, + ) + cryptoCurrencyFactory.createToken( + network = requireNotNull(network), + rawId = CryptoCurrency.RawID(TOKEN_ID), + name = TOKEN_NAME, + symbol = TOKEN_NAME, + contractAddress = TOKEN_CONTRACT_ADDRESS, + decimals = TOKEN_DECIMALS, + ) + }.mapLeft { exception -> + Timber.tag(TAG).e(exception) + errorConverter.convert(exception) + } + } +} \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPaySwapDataFactory.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPaySwapDataFactory.kt deleted file mode 100644 index 8533ae4744..0000000000 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/DefaultTangemPaySwapDataFactory.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.tangem.data.pay - -import arrow.core.Either -import arrow.core.Either.Companion.catch -import com.squareup.moshi.Moshi -import com.tangem.blockchain.blockchains.ethereum.Chain -import com.tangem.blockchainsdk.utils.ExcludedBlockchains -import com.tangem.core.error.UniversalError -import com.tangem.data.common.currency.CryptoCurrencyFactory -import com.tangem.data.common.network.NetworkFactory -import com.tangem.data.pay.util.TangemPayErrorConverter -import com.tangem.datasource.di.NetworkMoshi -import com.tangem.domain.models.ReceiveAddressModel -import com.tangem.domain.models.ReceiveAddressModel.NameService -import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.domain.pay.TangemPayTopUpData -import com.tangem.domain.pay.TangemPaySwapDataFactory -import timber.log.Timber -import java.math.BigDecimal -import javax.inject.Inject - -private const val TAG = "TangemPay: DefaultDataForTopUpFactory" -/** - * Custom token parameters. Will be used only for F&F. - */ -private const val TOKEN_ID = "usd-coin" -private const val TOKEN_NAME = "USDC" -private const val TOKEN_CONTRACT_ADDRESS = "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359" -private const val TOKEN_DECIMALS = 6 - -internal class DefaultTangemPaySwapDataFactory @Inject constructor( - @NetworkMoshi moshi: Moshi, - excludedBlockchains: ExcludedBlockchains, -) : TangemPaySwapDataFactory { - - private val cryptoCurrencyFactory by lazy(mode = LazyThreadSafetyMode.NONE) { - CryptoCurrencyFactory(excludedBlockchains) - } - private val networkFactory by lazy(mode = LazyThreadSafetyMode.NONE) { - NetworkFactory(excludedBlockchains) - } - private val errorConverter by lazy(mode = LazyThreadSafetyMode.NONE) { TangemPayErrorConverter(moshi) } - - private fun getCurrency(userWallet: UserWallet, chainId: Int): CryptoCurrency { - val chain = requireNotNull(Chain.entries.find { it.id == chainId }) { "Can not find chain with $chainId" } - val blockchain = requireNotNull(chain.blockchain) - val network = networkFactory.create( - blockchain = blockchain, - extraDerivationPath = null, - userWallet = userWallet, - ) - return cryptoCurrencyFactory.createToken( - network = requireNotNull(network), - rawId = CryptoCurrency.RawID(TOKEN_ID), - name = TOKEN_NAME, - symbol = TOKEN_NAME, - contractAddress = TOKEN_CONTRACT_ADDRESS, - decimals = TOKEN_DECIMALS, - ) - } - - override fun create( - userWallet: UserWallet, - depositAddress: String, - chainId: Int, - cryptoBalance: BigDecimal, - fiatBalance: BigDecimal, - ): Either { - return catch { - val currency = getCurrency(userWallet, chainId) - TangemPayTopUpData( - currency = currency, - walletId = userWallet.walletId, - cryptoBalance = cryptoBalance, - fiatBalance = fiatBalance, - depositAddress = depositAddress, - receiveAddress = listOf(ReceiveAddressModel(nameService = NameService.Default, value = depositAddress)), - ) - }.mapLeft { exception -> - Timber.tag(TAG).e(exception) - errorConverter.convert(exception) - } - } -} \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/di/TangemPayDataModule.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/di/TangemPayDataModule.kt index 49bc15d0db..bae2d97baf 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/di/TangemPayDataModule.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/di/TangemPayDataModule.kt @@ -1,10 +1,10 @@ package com.tangem.data.pay.di -import com.tangem.data.pay.DefaultTangemPaySwapDataFactory +import com.tangem.data.pay.DefaultTangemPayCryptoCurrencyFactory import com.tangem.data.pay.repository.* import com.tangem.data.pay.usecase.DefaultGetTangemPayCurrencyStatusUseCase import com.tangem.data.pay.usecase.DefaultTangemPayWithdrawUseCase -import com.tangem.domain.pay.TangemPaySwapDataFactory +import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory import com.tangem.domain.pay.repository.* import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase import com.tangem.domain.pay.usecase.TangemPayMainScreenCustomerInfoUseCase @@ -48,7 +48,9 @@ internal interface TangemPayDataModule { @Binds @Singleton - fun bindTangemPaySwapDataFactory(factory: DefaultTangemPaySwapDataFactory): TangemPaySwapDataFactory + fun bindTangemPayCryptoCurrencyFactory( + factory: DefaultTangemPayCryptoCurrencyFactory, + ): TangemPayCryptoCurrencyFactory @Binds @Singleton diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt index 21077cd428..8af56ff827 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt @@ -55,6 +55,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor( fiatBalance = result.fiat.availableBalance, currencyCode = result.fiat.currency, cryptoBalance = result.crypto.balance, + availableForWithdrawal = result.availableForWithdrawal.amount, chainId = result.crypto.chainId, depositAddress = result.crypto.depositAddress, contractAddress = result.crypto.tokenContractAddress, diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPayCryptoCurrencyFactory.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPayCryptoCurrencyFactory.kt new file mode 100644 index 0000000000..5f3223e514 --- /dev/null +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPayCryptoCurrencyFactory.kt @@ -0,0 +1,11 @@ +package com.tangem.domain.pay + +import arrow.core.Either +import com.tangem.core.error.UniversalError +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.wallet.UserWallet + +interface TangemPayCryptoCurrencyFactory { + + fun create(userWallet: UserWallet, chainId: Int): Either +} \ No newline at end of file diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayCardBalance.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayCardBalance.kt index 90d3375e9c..911aead866 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayCardBalance.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayCardBalance.kt @@ -6,6 +6,7 @@ data class TangemPayCardBalance( val fiatBalance: BigDecimal, val currencyCode: String, val cryptoBalance: BigDecimal, + val availableForWithdrawal: BigDecimal, val chainId: Int, val depositAddress: String?, val contractAddress: String, diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPaySwapDataFactory.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayTopUpData.kt similarity index 51% rename from domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPaySwapDataFactory.kt rename to domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayTopUpData.kt index c23f9becab..3d40efda8e 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/pay/TangemPaySwapDataFactory.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/TangemPayTopUpData.kt @@ -1,24 +1,10 @@ -package com.tangem.domain.pay +package com.tangem.domain.pay.model -import arrow.core.Either -import com.tangem.core.error.UniversalError import com.tangem.domain.models.ReceiveAddressModel import com.tangem.domain.models.currency.CryptoCurrency -import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import java.math.BigDecimal -interface TangemPaySwapDataFactory { - - fun create( - userWallet: UserWallet, - depositAddress: String, - chainId: Int, - cryptoBalance: BigDecimal, - fiatBalance: BigDecimal, - ): Either -} - data class TangemPayTopUpData( val walletId: UserWalletId, val currency: CryptoCurrency, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayAddFundsComponent.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayAddFundsComponent.kt index db43708e08..7058acc0a1 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayAddFundsComponent.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayAddFundsComponent.kt @@ -5,7 +5,7 @@ import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.decompose.ComposableBottomSheetComponent import com.tangem.domain.models.wallet.UserWalletId -import com.tangem.domain.pay.TangemPayTopUpData +import com.tangem.domain.pay.model.TangemPayTopUpData import com.tangem.features.tangempay.model.TangemPayAddFundsModel import com.tangem.features.tangempay.ui.TangemPayAddFundsContent import java.math.BigDecimal diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayAddFundsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayAddFundsModel.kt index 4f2ae1c371..b1a7a7133a 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayAddFundsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayAddFundsModel.kt @@ -4,7 +4,10 @@ import androidx.compose.runtime.Stable import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer -import com.tangem.domain.pay.TangemPaySwapDataFactory +import com.tangem.domain.models.ReceiveAddressModel +import com.tangem.domain.models.ReceiveAddressModel.NameService +import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory +import com.tangem.domain.pay.model.TangemPayTopUpData import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.features.tangempay.components.TangemPayAddFundsComponent import com.tangem.features.tangempay.entity.TangemPayAddFundsUM @@ -17,7 +20,7 @@ import javax.inject.Inject internal class TangemPayAddFundsModel @Inject constructor( paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, - private val tangemPaySwapDataFactory: TangemPaySwapDataFactory, + private val tangemPayCryptoCurrencyFactory: TangemPayCryptoCurrencyFactory, private val getUserWalletUseCase: GetUserWalletUseCase, ) : Model() { @@ -26,17 +29,25 @@ internal class TangemPayAddFundsModel @Inject constructor( val uiState: TangemPayAddFundsUM = getInitialState() private fun getInitialState(): TangemPayAddFundsUM { - val userWallet = requireNotNull( - getUserWalletUseCase(params.walletId).getOrNull(), - ) { "User wallet not found for id: ${params.walletId}" } - val data = tangemPaySwapDataFactory.create( - userWallet = userWallet, - depositAddress = params.depositAddress, - chainId = params.chainId, - cryptoBalance = params.cryptoBalance, - fiatBalance = params.fiatBalance, - ).getOrNull() - + val userWallet = getUserWalletUseCase(params.walletId).getOrNull() + val currency = userWallet?.let { + tangemPayCryptoCurrencyFactory.create(userWallet = userWallet, chainId = params.chainId).getOrNull() + } + val data = currency?.let { + TangemPayTopUpData( + currency = currency, + walletId = params.walletId, + cryptoBalance = params.cryptoBalance, + fiatBalance = params.fiatBalance, + depositAddress = params.depositAddress, + receiveAddress = listOf( + ReceiveAddressModel( + nameService = NameService.Default, + value = params.depositAddress, + ), + ), + ) + } return TangemPayAddFundsUMConverter(listener = params.listener).convert(data) } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index bfe48f97c9..3a08e43adf 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -18,8 +18,8 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.message.SnackbarMessage import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.models.TokenReceiveConfig -import com.tangem.domain.pay.TangemPaySwapDataFactory -import com.tangem.domain.pay.TangemPayTopUpData +import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory +import com.tangem.domain.pay.model.TangemPayTopUpData import com.tangem.domain.pay.model.TangemPayCardBalance import com.tangem.domain.pay.repository.CustomerOrderRepository import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository @@ -70,7 +70,7 @@ internal class TangemPayDetailsModel @Inject constructor( private val uiMessageSender: UiMessageSender, private val cardDetailsEventListener: CardDetailsEventListener, private val txHistoryUpdateListener: TangemPayTxHistoryUpdateListener, - private val tangemPaySwapDataFactory: TangemPaySwapDataFactory, + private val tangemPayCryptoCurrencyFactory: TangemPayCryptoCurrencyFactory, private val orderRepository: CustomerOrderRepository, private val getUserWalletUseCase: GetUserWalletUseCase, ) : Model(), TangemPayTxHistoryUiActions, TangemPayDetailIntents, AddFundsListener { @@ -236,27 +236,22 @@ internal class TangemPayDetailsModel @Inject constructor( if (hasActiveWithdrawal) { showBottomSheetError(TangemPayDetailsErrorType.WithdrawInProgress) } else { - val userWallet = requireNotNull( - getUserWalletUseCase(params.userWalletId).getOrNull(), - ) { "User wallet not found: ${params.userWalletId}" } - val data = tangemPaySwapDataFactory.create( - userWallet = userWallet, - depositAddress = depositAddress, - chainId = params.config.chainId, - cryptoBalance = currentBalance.cryptoBalance, - fiatBalance = currentBalance.fiatBalance, - ).getOrNull() - if (data != null) { + val userWallet = getUserWalletUseCase(params.userWalletId).getOrNull() + val currency = userWallet?.let { + tangemPayCryptoCurrencyFactory.create(userWallet = userWallet, chainId = params.config.chainId) + .getOrNull() + } + if (currency != null) { router.push( AppRoute.Swap( - currencyFrom = data.currency, - userWalletId = data.walletId, + currencyFrom = currency, + userWalletId = params.userWalletId, isInitialReverseOrder = false, screenSource = AnalyticsParam.ScreensSources.TangemPay.value, tangemPayInput = AppRoute.Swap.TangemPayInput( - cryptoAmount = data.cryptoBalance, - fiatAmount = data.fiatBalance, - depositAddress = data.depositAddress, + cryptoAmount = currentBalance.availableForWithdrawal, + fiatAmount = currentBalance.availableForWithdrawal, + depositAddress = depositAddress, isWithdrawal = true, ), ), @@ -277,7 +272,13 @@ internal class TangemPayDetailsModel @Inject constructor( Timber.e(e) return@launch } - uiState.update(DetailsBalanceTransformer(balance = result)) + uiState.update( + transformer = DetailsBalanceTransformer( + balance = result, + userWallet = getUserWalletUseCase(params.userWalletId).getOrNull(), + cryptoCurrencyFactory = tangemPayCryptoCurrencyFactory, + ), + ) }.saveIn(fetchBalanceJobHolder) } diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/DetailsBalanceTransformer.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/DetailsBalanceTransformer.kt index 7817286e55..857920d456 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/DetailsBalanceTransformer.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/DetailsBalanceTransformer.kt @@ -2,17 +2,24 @@ package com.tangem.features.tangempay.model.transformers import arrow.core.Either import com.tangem.core.error.UniversalError +import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.fiat import com.tangem.core.ui.format.bigdecimal.format +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory import com.tangem.domain.pay.model.TangemPayCardBalance import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState import com.tangem.features.tangempay.entity.TangemPayDetailsUM import com.tangem.utils.transformer.Transformer import kotlinx.collections.immutable.persistentListOf +import java.math.BigDecimal import java.util.Currency internal class DetailsBalanceTransformer( private val balance: Either, + private val cryptoCurrencyFactory: TangemPayCryptoCurrencyFactory, + private val userWallet: UserWallet?, ) : Transformer { override fun transform(prevState: TangemPayDetailsUM): TangemPayDetailsUM { @@ -21,22 +28,32 @@ internal class DetailsBalanceTransformer( TangemPayDetailsBalanceBlockState.Error(actionButtons = persistentListOf()) } is Either.Right -> { - TangemPayDetailsBalanceBlockState.Content( - isBalanceFlickering = false, - fiatBalance = getBalanceText(balance.value), - // TODO [REDACTED_TASK_KEY]: Add crypto balance when the BFF is ready - cryptoBalance = "", - actionButtons = prevState.balanceBlockState.actionButtons, - ) + val cryptoCurrency = userWallet?.let { + cryptoCurrencyFactory.create(userWallet, balance.value.chainId).getOrNull() + } + if (cryptoCurrency == null) { + TangemPayDetailsBalanceBlockState.Error(actionButtons = persistentListOf()) + } else { + TangemPayDetailsBalanceBlockState.Content( + isBalanceFlickering = false, + fiatBalance = getFiatBalanceText(balance.value), + cryptoBalance = getCryptoBalanceText(balance.value.cryptoBalance, cryptoCurrency), + actionButtons = prevState.balanceBlockState.actionButtons, + ) + } } } return prevState.copy(balanceBlockState = balance) } - private fun getBalanceText(balance: TangemPayCardBalance): String { + private fun getFiatBalanceText(balance: TangemPayCardBalance): String { val currency = Currency.getInstance(balance.currencyCode) return balance.fiatBalance.format { fiat(fiatCurrencyCode = currency.currencyCode, fiatCurrencySymbol = currency.symbol) } } + + private fun getCryptoBalanceText(cryptoBalance: BigDecimal, cryptoCurrency: CryptoCurrency): String { + return cryptoBalance.format { crypto(cryptoCurrency = cryptoCurrency) } + } } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayAddFundsUMConverter.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayAddFundsUMConverter.kt index b770bcc649..4de43025ef 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayAddFundsUMConverter.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayAddFundsUMConverter.kt @@ -1,7 +1,7 @@ package com.tangem.features.tangempay.model.transformers import com.tangem.core.ui.extensions.TextReference -import com.tangem.domain.pay.TangemPayTopUpData +import com.tangem.domain.pay.model.TangemPayTopUpData import com.tangem.features.tangempay.components.AddFundsListener import com.tangem.features.tangempay.details.impl.R import com.tangem.features.tangempay.entity.TangemPayAddFundsItemUM diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt index e59ab905cb..6c0a7fdf77 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayDetailsScreen.kt @@ -157,12 +157,11 @@ internal fun TangemPayDetailsBalanceBlock( state = state, isBalanceHidden = isBalanceHidden, ) - // TODO [REDACTED_TASK_KEY]: Uncomment after adding crypto balance when the BFF is ready - // CryptoBalance( - // modifier = Modifier.padding(start = 12.dp, top = 4.dp), - // state = state, - // isBalanceHidden = isBalanceHidden, - // ) + CryptoBalance( + modifier = Modifier.padding(start = 12.dp, top = 4.dp), + state = state, + isBalanceHidden = isBalanceHidden, + ) if (state.actionButtons.isNotEmpty()) { HorizontalActionChips( modifier = Modifier.padding(top = 12.dp),