Updated on 2026-08-14
This commit is contained in:
parent
a1943321d9
commit
6fe140bb45
2 changed files with 33 additions and 21 deletions
|
|
@ -209,7 +209,7 @@ internal class StateBuilder(
|
|||
fromToken: CryptoCurrency,
|
||||
swapProvider: SwapProvider,
|
||||
bestRatedProviderId: String,
|
||||
isManyProviders: Boolean,
|
||||
isNeedBestRateBadge: Boolean,
|
||||
selectedFeeType: FeeType,
|
||||
isReverseSwapPossible: Boolean,
|
||||
): SwapStateHolder {
|
||||
|
|
@ -270,7 +270,7 @@ internal class StateBuilder(
|
|||
isBestRate = bestRatedProviderId == swapProvider.providerId,
|
||||
fromTokenInfo = quoteModel.fromTokenInfo,
|
||||
toTokenInfo = quoteModel.toTokenInfo,
|
||||
isNeedBadge = isManyProviders,
|
||||
isNeedBestRateBadge = isNeedBestRateBadge,
|
||||
selectionType = ProviderState.SelectionType.CLICK,
|
||||
onProviderClick = actions.onProviderClick,
|
||||
),
|
||||
|
|
@ -327,19 +327,7 @@ internal class StateBuilder(
|
|||
)
|
||||
else -> Unit
|
||||
}
|
||||
if (!quoteModel.preparedSwapConfigState.isFeeEnough &&
|
||||
quoteModel.preparedSwapConfigState.isBalanceEnough &&
|
||||
quoteModel.permissionState !is PermissionDataState.PermissionLoading
|
||||
) {
|
||||
warnings.add(
|
||||
SwapWarning.UnableToCoverFeeWarning(
|
||||
createUnableToCoverFeeNotificationConfig(
|
||||
fromToken = fromToken,
|
||||
onBuyClick = actions.onBuyClick,
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
addUnableCoverFeeWarning(quoteModel, fromToken, warnings)
|
||||
// check isBalanceEnough, but for dex includeFeeInAmount always Excluded
|
||||
if (!quoteModel.preparedSwapConfigState.isBalanceEnough &&
|
||||
quoteModel.preparedSwapConfigState.includeFeeInAmount !is IncludeFeeInAmount.Included
|
||||
|
|
@ -379,6 +367,26 @@ internal class StateBuilder(
|
|||
return warnings
|
||||
}
|
||||
|
||||
private fun addUnableCoverFeeWarning(
|
||||
quoteModel: SwapState.QuotesLoadedState,
|
||||
fromToken: CryptoCurrency,
|
||||
warnings: MutableList<SwapWarning>,
|
||||
) {
|
||||
if (!quoteModel.preparedSwapConfigState.isFeeEnough &&
|
||||
quoteModel.preparedSwapConfigState.isBalanceEnough &&
|
||||
quoteModel.permissionState !is PermissionDataState.PermissionLoading
|
||||
) {
|
||||
warnings.add(
|
||||
SwapWarning.UnableToCoverFeeWarning(
|
||||
createUnableToCoverFeeNotificationConfig(
|
||||
fromToken = fromToken,
|
||||
onBuyClick = actions.onBuyClick,
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getSwapButtonEnabled(preparedSwapConfigState: PreparedSwapConfigState): Boolean {
|
||||
if (preparedSwapConfigState.hasOutgoingTransaction) return false
|
||||
return when (preparedSwapConfigState.includeFeeInAmount) {
|
||||
|
|
@ -1123,7 +1131,7 @@ internal class StateBuilder(
|
|||
fromTokenInfo: TokenSwapInfo,
|
||||
toTokenInfo: TokenSwapInfo,
|
||||
selectionType: ProviderState.SelectionType,
|
||||
isNeedBadge: Boolean,
|
||||
isNeedBestRateBadge: Boolean,
|
||||
onProviderClick: (String) -> Unit,
|
||||
): ProviderState {
|
||||
val rate = toTokenInfo.tokenAmount.value.calculateRate(
|
||||
|
|
@ -1133,7 +1141,7 @@ internal class StateBuilder(
|
|||
val fromCurrencySymbol = fromTokenInfo.cryptoCurrencyStatus.currency.symbol
|
||||
val toCurrencySymbol = toTokenInfo.cryptoCurrencyStatus.currency.symbol
|
||||
val rateString = "1 $fromCurrencySymbol ≈ $rate $toCurrencySymbol"
|
||||
val badge = if (isNeedBadge && isBestRate) {
|
||||
val badge = if (isNeedBestRateBadge && isBestRate) {
|
||||
ProviderState.AdditionalBadge.BestTrade
|
||||
} else {
|
||||
ProviderState.AdditionalBadge.Empty
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ internal class SwapViewModel @Inject constructor(
|
|||
fromToken = fromToken.currency,
|
||||
swapProvider = provider,
|
||||
bestRatedProviderId = bestRatedProviderId,
|
||||
isManyProviders = dataState.lastLoadedSwapStates.size > 1,
|
||||
isNeedBestRateBadge = dataState.lastLoadedSwapStates.consideredProvidersStates().size > 1,
|
||||
selectedFeeType = dataState.selectedFee?.feeType ?: FeeType.NORMAL,
|
||||
isReverseSwapPossible = isReverseSwapPossible(),
|
||||
)
|
||||
|
|
@ -390,9 +390,7 @@ internal class SwapViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun selectProvider(state: Map<SwapProvider, SwapState>): SwapProvider {
|
||||
val consideredProviders = state.filter {
|
||||
it.value is SwapState.QuotesLoadedState || isExchangeTooSmallAmountError(it.value)
|
||||
}
|
||||
val consideredProviders = state.consideredProvidersStates()
|
||||
|
||||
return if (consideredProviders.isNotEmpty()) {
|
||||
val currentSelected = dataState.selectedProvider
|
||||
|
|
@ -948,6 +946,12 @@ internal class SwapViewModel @Inject constructor(
|
|||
.mapValues { it.value as SwapState.QuotesLoadedState }
|
||||
}
|
||||
|
||||
private fun Map<SwapProvider, SwapState>.consideredProvidersStates(): Map<SwapProvider, SwapState> {
|
||||
return this.filter {
|
||||
it.value is SwapState.QuotesLoadedState || isExchangeTooSmallAmountError(it.value)
|
||||
}
|
||||
}
|
||||
|
||||
private fun isReverseSwapPossible(): Boolean {
|
||||
val from = dataState.fromCryptoCurrency ?: return false
|
||||
val to = dataState.toCryptoCurrency ?: return false
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue