Updated on 2026-08-14
This commit is contained in:
parent
c3ea39c47d
commit
fb4020ac91
13 changed files with 160 additions and 152 deletions
|
|
@ -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<UniversalError, CryptoCurrency> {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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<UniversalError, TangemPayTopUpData> {
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package com.tangem.data.pay.di
|
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.repository.*
|
||||||
import com.tangem.data.pay.usecase.DefaultGetTangemPayCurrencyStatusUseCase
|
import com.tangem.data.pay.usecase.DefaultGetTangemPayCurrencyStatusUseCase
|
||||||
import com.tangem.data.pay.usecase.DefaultTangemPayWithdrawUseCase
|
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.repository.*
|
||||||
import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase
|
import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase
|
||||||
import com.tangem.domain.pay.usecase.TangemPayMainScreenCustomerInfoUseCase
|
import com.tangem.domain.pay.usecase.TangemPayMainScreenCustomerInfoUseCase
|
||||||
|
|
@ -48,7 +48,9 @@ internal interface TangemPayDataModule {
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@Singleton
|
@Singleton
|
||||||
fun bindTangemPaySwapDataFactory(factory: DefaultTangemPaySwapDataFactory): TangemPaySwapDataFactory
|
fun bindTangemPayCryptoCurrencyFactory(
|
||||||
|
factory: DefaultTangemPayCryptoCurrencyFactory,
|
||||||
|
): TangemPayCryptoCurrencyFactory
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
|
||||||
fiatBalance = result.fiat.availableBalance,
|
fiatBalance = result.fiat.availableBalance,
|
||||||
currencyCode = result.fiat.currency,
|
currencyCode = result.fiat.currency,
|
||||||
cryptoBalance = result.crypto.balance,
|
cryptoBalance = result.crypto.balance,
|
||||||
|
availableForWithdrawal = result.availableForWithdrawal.amount,
|
||||||
chainId = result.crypto.chainId,
|
chainId = result.crypto.chainId,
|
||||||
depositAddress = result.crypto.depositAddress,
|
depositAddress = result.crypto.depositAddress,
|
||||||
contractAddress = result.crypto.tokenContractAddress,
|
contractAddress = result.crypto.tokenContractAddress,
|
||||||
|
|
|
||||||
|
|
@ -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<UniversalError, CryptoCurrency>
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ data class TangemPayCardBalance(
|
||||||
val fiatBalance: BigDecimal,
|
val fiatBalance: BigDecimal,
|
||||||
val currencyCode: String,
|
val currencyCode: String,
|
||||||
val cryptoBalance: BigDecimal,
|
val cryptoBalance: BigDecimal,
|
||||||
|
val availableForWithdrawal: BigDecimal,
|
||||||
val chainId: Int,
|
val chainId: Int,
|
||||||
val depositAddress: String?,
|
val depositAddress: String?,
|
||||||
val contractAddress: String,
|
val contractAddress: String,
|
||||||
|
|
|
||||||
|
|
@ -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.ReceiveAddressModel
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
|
|
||||||
interface TangemPaySwapDataFactory {
|
|
||||||
|
|
||||||
fun create(
|
|
||||||
userWallet: UserWallet,
|
|
||||||
depositAddress: String,
|
|
||||||
chainId: Int,
|
|
||||||
cryptoBalance: BigDecimal,
|
|
||||||
fiatBalance: BigDecimal,
|
|
||||||
): Either<UniversalError, TangemPayTopUpData>
|
|
||||||
}
|
|
||||||
|
|
||||||
data class TangemPayTopUpData(
|
data class TangemPayTopUpData(
|
||||||
val walletId: UserWalletId,
|
val walletId: UserWalletId,
|
||||||
val currency: CryptoCurrency,
|
val currency: CryptoCurrency,
|
||||||
|
|
@ -5,7 +5,7 @@ import com.tangem.core.decompose.context.AppComponentContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
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.model.TangemPayAddFundsModel
|
||||||
import com.tangem.features.tangempay.ui.TangemPayAddFundsContent
|
import com.tangem.features.tangempay.ui.TangemPayAddFundsContent
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,10 @@ import androidx.compose.runtime.Stable
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
import com.tangem.core.decompose.model.ParamsContainer
|
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.domain.wallets.usecase.GetUserWalletUseCase
|
||||||
import com.tangem.features.tangempay.components.TangemPayAddFundsComponent
|
import com.tangem.features.tangempay.components.TangemPayAddFundsComponent
|
||||||
import com.tangem.features.tangempay.entity.TangemPayAddFundsUM
|
import com.tangem.features.tangempay.entity.TangemPayAddFundsUM
|
||||||
|
|
@ -17,7 +20,7 @@ import javax.inject.Inject
|
||||||
internal class TangemPayAddFundsModel @Inject constructor(
|
internal class TangemPayAddFundsModel @Inject constructor(
|
||||||
paramsContainer: ParamsContainer,
|
paramsContainer: ParamsContainer,
|
||||||
override val dispatchers: CoroutineDispatcherProvider,
|
override val dispatchers: CoroutineDispatcherProvider,
|
||||||
private val tangemPaySwapDataFactory: TangemPaySwapDataFactory,
|
private val tangemPayCryptoCurrencyFactory: TangemPayCryptoCurrencyFactory,
|
||||||
private val getUserWalletUseCase: GetUserWalletUseCase,
|
private val getUserWalletUseCase: GetUserWalletUseCase,
|
||||||
) : Model() {
|
) : Model() {
|
||||||
|
|
||||||
|
|
@ -26,17 +29,25 @@ internal class TangemPayAddFundsModel @Inject constructor(
|
||||||
val uiState: TangemPayAddFundsUM = getInitialState()
|
val uiState: TangemPayAddFundsUM = getInitialState()
|
||||||
|
|
||||||
private fun getInitialState(): TangemPayAddFundsUM {
|
private fun getInitialState(): TangemPayAddFundsUM {
|
||||||
val userWallet = requireNotNull(
|
val userWallet = getUserWalletUseCase(params.walletId).getOrNull()
|
||||||
getUserWalletUseCase(params.walletId).getOrNull(),
|
val currency = userWallet?.let {
|
||||||
) { "User wallet not found for id: ${params.walletId}" }
|
tangemPayCryptoCurrencyFactory.create(userWallet = userWallet, chainId = params.chainId).getOrNull()
|
||||||
val data = tangemPaySwapDataFactory.create(
|
}
|
||||||
userWallet = userWallet,
|
val data = currency?.let {
|
||||||
depositAddress = params.depositAddress,
|
TangemPayTopUpData(
|
||||||
chainId = params.chainId,
|
currency = currency,
|
||||||
cryptoBalance = params.cryptoBalance,
|
walletId = params.walletId,
|
||||||
fiatBalance = params.fiatBalance,
|
cryptoBalance = params.cryptoBalance,
|
||||||
).getOrNull()
|
fiatBalance = params.fiatBalance,
|
||||||
|
depositAddress = params.depositAddress,
|
||||||
|
receiveAddress = listOf(
|
||||||
|
ReceiveAddressModel(
|
||||||
|
nameService = NameService.Default,
|
||||||
|
value = params.depositAddress,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
return TangemPayAddFundsUMConverter(listener = params.listener).convert(data)
|
return TangemPayAddFundsUMConverter(listener = params.listener).convert(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.core.ui.message.SnackbarMessage
|
import com.tangem.core.ui.message.SnackbarMessage
|
||||||
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
|
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
|
||||||
import com.tangem.domain.models.TokenReceiveConfig
|
import com.tangem.domain.models.TokenReceiveConfig
|
||||||
import com.tangem.domain.pay.TangemPaySwapDataFactory
|
import com.tangem.domain.pay.TangemPayCryptoCurrencyFactory
|
||||||
import com.tangem.domain.pay.TangemPayTopUpData
|
import com.tangem.domain.pay.model.TangemPayTopUpData
|
||||||
import com.tangem.domain.pay.model.TangemPayCardBalance
|
import com.tangem.domain.pay.model.TangemPayCardBalance
|
||||||
import com.tangem.domain.pay.repository.CustomerOrderRepository
|
import com.tangem.domain.pay.repository.CustomerOrderRepository
|
||||||
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
|
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
|
||||||
|
|
@ -70,7 +70,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
||||||
private val uiMessageSender: UiMessageSender,
|
private val uiMessageSender: UiMessageSender,
|
||||||
private val cardDetailsEventListener: CardDetailsEventListener,
|
private val cardDetailsEventListener: CardDetailsEventListener,
|
||||||
private val txHistoryUpdateListener: TangemPayTxHistoryUpdateListener,
|
private val txHistoryUpdateListener: TangemPayTxHistoryUpdateListener,
|
||||||
private val tangemPaySwapDataFactory: TangemPaySwapDataFactory,
|
private val tangemPayCryptoCurrencyFactory: TangemPayCryptoCurrencyFactory,
|
||||||
private val orderRepository: CustomerOrderRepository,
|
private val orderRepository: CustomerOrderRepository,
|
||||||
private val getUserWalletUseCase: GetUserWalletUseCase,
|
private val getUserWalletUseCase: GetUserWalletUseCase,
|
||||||
) : Model(), TangemPayTxHistoryUiActions, TangemPayDetailIntents, AddFundsListener {
|
) : Model(), TangemPayTxHistoryUiActions, TangemPayDetailIntents, AddFundsListener {
|
||||||
|
|
@ -236,27 +236,22 @@ internal class TangemPayDetailsModel @Inject constructor(
|
||||||
if (hasActiveWithdrawal) {
|
if (hasActiveWithdrawal) {
|
||||||
showBottomSheetError(TangemPayDetailsErrorType.WithdrawInProgress)
|
showBottomSheetError(TangemPayDetailsErrorType.WithdrawInProgress)
|
||||||
} else {
|
} else {
|
||||||
val userWallet = requireNotNull(
|
val userWallet = getUserWalletUseCase(params.userWalletId).getOrNull()
|
||||||
getUserWalletUseCase(params.userWalletId).getOrNull(),
|
val currency = userWallet?.let {
|
||||||
) { "User wallet not found: ${params.userWalletId}" }
|
tangemPayCryptoCurrencyFactory.create(userWallet = userWallet, chainId = params.config.chainId)
|
||||||
val data = tangemPaySwapDataFactory.create(
|
.getOrNull()
|
||||||
userWallet = userWallet,
|
}
|
||||||
depositAddress = depositAddress,
|
if (currency != null) {
|
||||||
chainId = params.config.chainId,
|
|
||||||
cryptoBalance = currentBalance.cryptoBalance,
|
|
||||||
fiatBalance = currentBalance.fiatBalance,
|
|
||||||
).getOrNull()
|
|
||||||
if (data != null) {
|
|
||||||
router.push(
|
router.push(
|
||||||
AppRoute.Swap(
|
AppRoute.Swap(
|
||||||
currencyFrom = data.currency,
|
currencyFrom = currency,
|
||||||
userWalletId = data.walletId,
|
userWalletId = params.userWalletId,
|
||||||
isInitialReverseOrder = false,
|
isInitialReverseOrder = false,
|
||||||
screenSource = AnalyticsParam.ScreensSources.TangemPay.value,
|
screenSource = AnalyticsParam.ScreensSources.TangemPay.value,
|
||||||
tangemPayInput = AppRoute.Swap.TangemPayInput(
|
tangemPayInput = AppRoute.Swap.TangemPayInput(
|
||||||
cryptoAmount = data.cryptoBalance,
|
cryptoAmount = currentBalance.availableForWithdrawal,
|
||||||
fiatAmount = data.fiatBalance,
|
fiatAmount = currentBalance.availableForWithdrawal,
|
||||||
depositAddress = data.depositAddress,
|
depositAddress = depositAddress,
|
||||||
isWithdrawal = true,
|
isWithdrawal = true,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -277,7 +272,13 @@ internal class TangemPayDetailsModel @Inject constructor(
|
||||||
Timber.e(e)
|
Timber.e(e)
|
||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
uiState.update(DetailsBalanceTransformer(balance = result))
|
uiState.update(
|
||||||
|
transformer = DetailsBalanceTransformer(
|
||||||
|
balance = result,
|
||||||
|
userWallet = getUserWalletUseCase(params.userWalletId).getOrNull(),
|
||||||
|
cryptoCurrencyFactory = tangemPayCryptoCurrencyFactory,
|
||||||
|
),
|
||||||
|
)
|
||||||
}.saveIn(fetchBalanceJobHolder)
|
}.saveIn(fetchBalanceJobHolder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,17 +2,24 @@ package com.tangem.features.tangempay.model.transformers
|
||||||
|
|
||||||
import arrow.core.Either
|
import arrow.core.Either
|
||||||
import com.tangem.core.error.UniversalError
|
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.fiat
|
||||||
import com.tangem.core.ui.format.bigdecimal.format
|
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.domain.pay.model.TangemPayCardBalance
|
||||||
import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState
|
import com.tangem.features.tangempay.entity.TangemPayDetailsBalanceBlockState
|
||||||
import com.tangem.features.tangempay.entity.TangemPayDetailsUM
|
import com.tangem.features.tangempay.entity.TangemPayDetailsUM
|
||||||
import com.tangem.utils.transformer.Transformer
|
import com.tangem.utils.transformer.Transformer
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import java.math.BigDecimal
|
||||||
import java.util.Currency
|
import java.util.Currency
|
||||||
|
|
||||||
internal class DetailsBalanceTransformer(
|
internal class DetailsBalanceTransformer(
|
||||||
private val balance: Either<UniversalError, TangemPayCardBalance>,
|
private val balance: Either<UniversalError, TangemPayCardBalance>,
|
||||||
|
private val cryptoCurrencyFactory: TangemPayCryptoCurrencyFactory,
|
||||||
|
private val userWallet: UserWallet?,
|
||||||
) : Transformer<TangemPayDetailsUM> {
|
) : Transformer<TangemPayDetailsUM> {
|
||||||
|
|
||||||
override fun transform(prevState: TangemPayDetailsUM): TangemPayDetailsUM {
|
override fun transform(prevState: TangemPayDetailsUM): TangemPayDetailsUM {
|
||||||
|
|
@ -21,22 +28,32 @@ internal class DetailsBalanceTransformer(
|
||||||
TangemPayDetailsBalanceBlockState.Error(actionButtons = persistentListOf())
|
TangemPayDetailsBalanceBlockState.Error(actionButtons = persistentListOf())
|
||||||
}
|
}
|
||||||
is Either.Right<TangemPayCardBalance> -> {
|
is Either.Right<TangemPayCardBalance> -> {
|
||||||
TangemPayDetailsBalanceBlockState.Content(
|
val cryptoCurrency = userWallet?.let {
|
||||||
isBalanceFlickering = false,
|
cryptoCurrencyFactory.create(userWallet, balance.value.chainId).getOrNull()
|
||||||
fiatBalance = getBalanceText(balance.value),
|
}
|
||||||
// TODO [REDACTED_TASK_KEY]: Add crypto balance when the BFF is ready
|
if (cryptoCurrency == null) {
|
||||||
cryptoBalance = "",
|
TangemPayDetailsBalanceBlockState.Error(actionButtons = persistentListOf())
|
||||||
actionButtons = prevState.balanceBlockState.actionButtons,
|
} else {
|
||||||
)
|
TangemPayDetailsBalanceBlockState.Content(
|
||||||
|
isBalanceFlickering = false,
|
||||||
|
fiatBalance = getFiatBalanceText(balance.value),
|
||||||
|
cryptoBalance = getCryptoBalanceText(balance.value.cryptoBalance, cryptoCurrency),
|
||||||
|
actionButtons = prevState.balanceBlockState.actionButtons,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return prevState.copy(balanceBlockState = balance)
|
return prevState.copy(balanceBlockState = balance)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getBalanceText(balance: TangemPayCardBalance): String {
|
private fun getFiatBalanceText(balance: TangemPayCardBalance): String {
|
||||||
val currency = Currency.getInstance(balance.currencyCode)
|
val currency = Currency.getInstance(balance.currencyCode)
|
||||||
return balance.fiatBalance.format {
|
return balance.fiatBalance.format {
|
||||||
fiat(fiatCurrencyCode = currency.currencyCode, fiatCurrencySymbol = currency.symbol)
|
fiat(fiatCurrencyCode = currency.currencyCode, fiatCurrencySymbol = currency.symbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getCryptoBalanceText(cryptoBalance: BigDecimal, cryptoCurrency: CryptoCurrency): String {
|
||||||
|
return cryptoBalance.format { crypto(cryptoCurrency = cryptoCurrency) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package com.tangem.features.tangempay.model.transformers
|
package com.tangem.features.tangempay.model.transformers
|
||||||
|
|
||||||
import com.tangem.core.ui.extensions.TextReference
|
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.components.AddFundsListener
|
||||||
import com.tangem.features.tangempay.details.impl.R
|
import com.tangem.features.tangempay.details.impl.R
|
||||||
import com.tangem.features.tangempay.entity.TangemPayAddFundsItemUM
|
import com.tangem.features.tangempay.entity.TangemPayAddFundsItemUM
|
||||||
|
|
|
||||||
|
|
@ -157,12 +157,11 @@ internal fun TangemPayDetailsBalanceBlock(
|
||||||
state = state,
|
state = state,
|
||||||
isBalanceHidden = isBalanceHidden,
|
isBalanceHidden = isBalanceHidden,
|
||||||
)
|
)
|
||||||
// TODO [REDACTED_TASK_KEY]: Uncomment after adding crypto balance when the BFF is ready
|
CryptoBalance(
|
||||||
// CryptoBalance(
|
modifier = Modifier.padding(start = 12.dp, top = 4.dp),
|
||||||
// modifier = Modifier.padding(start = 12.dp, top = 4.dp),
|
state = state,
|
||||||
// state = state,
|
isBalanceHidden = isBalanceHidden,
|
||||||
// isBalanceHidden = isBalanceHidden,
|
)
|
||||||
// )
|
|
||||||
if (state.actionButtons.isNotEmpty()) {
|
if (state.actionButtons.isNotEmpty()) {
|
||||||
HorizontalActionChips(
|
HorizontalActionChips(
|
||||||
modifier = Modifier.padding(top = 12.dp),
|
modifier = Modifier.padding(top = 12.dp),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue