Updated on 2026-08-14
This commit is contained in:
parent
45b7742914
commit
c19ca08957
10 changed files with 52 additions and 16 deletions
|
|
@ -647,6 +647,8 @@
|
||||||
<string name="warning_developer_card_title">Не для пользователя!</string>
|
<string name="warning_developer_card_title">Не для пользователя!</string>
|
||||||
<string name="warning_existential_deposit_message">Cеть %1$s использует концепцию экзистенциального депозита. Если баланс вашего счета будет ниже %2$s, то он будет деактивирован, а средства на счете уничтожены.</string>
|
<string name="warning_existential_deposit_message">Cеть %1$s использует концепцию экзистенциального депозита. Если баланс вашего счета будет ниже %2$s, то он будет деактивирован, а средства на счете уничтожены.</string>
|
||||||
<string name="warning_existential_deposit_title">Для работы с сетью необходим депозит</string>
|
<string name="warning_existential_deposit_title">Для работы с сетью необходим депозит</string>
|
||||||
|
<string name="warning_express_active_transaction_message">Обмен будет доступен после завершения %s транзакции</string>
|
||||||
|
<string name="warning_express_active_transaction_title">У вас есть активная транзакция</string>
|
||||||
<string name="warning_express_no_exchangeable_coins_description">У вас в списке нет монет доступных для обмена с %s</string>
|
<string name="warning_express_no_exchangeable_coins_description">У вас в списке нет монет доступных для обмена с %s</string>
|
||||||
<string name="warning_express_no_exchangeable_coins_title">Нет доступных токенов для обмена</string>
|
<string name="warning_express_no_exchangeable_coins_title">Нет доступных токенов для обмена</string>
|
||||||
<string name="warning_express_refresh_required_title">Cервис временно недоступен</string>
|
<string name="warning_express_refresh_required_title">Cервис временно недоступен</string>
|
||||||
|
|
|
||||||
|
|
@ -677,6 +677,8 @@
|
||||||
<string name="warning_developer_card_title">Not for users!</string>
|
<string name="warning_developer_card_title">Not for users!</string>
|
||||||
<string name="warning_existential_deposit_message">%1$s network requires an Existential Deposit. If your account drops below %2$s, it will be deactivated, and any remaining funds will be destroyed.</string>
|
<string name="warning_existential_deposit_message">%1$s network requires an Existential Deposit. If your account drops below %2$s, it will be deactivated, and any remaining funds will be destroyed.</string>
|
||||||
<string name="warning_existential_deposit_title">Network requires Existential Deposit</string>
|
<string name="warning_existential_deposit_title">Network requires Existential Deposit</string>
|
||||||
|
<string name="warning_express_active_transaction_message">Swap will be available after the %s transaction is complete</string>
|
||||||
|
<string name="warning_express_active_transaction_title">You have active transaction</string>
|
||||||
<string name="warning_express_no_exchangeable_coins_description">You do not have any %s exchangeable coins in your list</string>
|
<string name="warning_express_no_exchangeable_coins_description">You do not have any %s exchangeable coins in your list</string>
|
||||||
<string name="warning_express_no_exchangeable_coins_title">No available tokens to swap</string>
|
<string name="warning_express_no_exchangeable_coins_title">No available tokens to swap</string>
|
||||||
<string name="warning_express_not_enough_fee_for_token_tx_description">To make a transaction you need to deposit some %1$s %2$s</string>
|
<string name="warning_express_not_enough_fee_for_token_tx_description">To make a transaction you need to deposit some %1$s %2$s</string>
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ dependencies {
|
||||||
implementation(projects.domain.demo)
|
implementation(projects.domain.demo)
|
||||||
implementation(projects.domain.card)
|
implementation(projects.domain.card)
|
||||||
implementation(projects.domain.appCurrency.models)
|
implementation(projects.domain.appCurrency.models)
|
||||||
|
implementation(projects.domain.txhistory.models)
|
||||||
|
|
||||||
/** Core modules */
|
/** Core modules */
|
||||||
implementation(projects.core.utils)
|
implementation(projects.core.utils)
|
||||||
|
|
|
||||||
|
|
@ -420,7 +420,6 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
permissionState = PermissionDataState.Empty,
|
permissionState = PermissionDataState.Empty,
|
||||||
preparedSwapConfigState = state.preparedSwapConfigState.copy(
|
preparedSwapConfigState = state.preparedSwapConfigState.copy(
|
||||||
isBalanceEnough = includeFeeInAmount !is IncludeFeeInAmount.BalanceNotEnough,
|
isBalanceEnough = includeFeeInAmount !is IncludeFeeInAmount.BalanceNotEnough,
|
||||||
isFeeEnough = includeFeeInAmount !is IncludeFeeInAmount.BalanceNotEnough,
|
|
||||||
includeFeeInAmount = includeFeeInAmount,
|
includeFeeInAmount = includeFeeInAmount,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -798,6 +797,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
isFeeEnough = includeFeeInAmount !is IncludeFeeInAmount.BalanceNotEnough,
|
isFeeEnough = includeFeeInAmount !is IncludeFeeInAmount.BalanceNotEnough,
|
||||||
isAllowedToSpend = isAllowedToSpend,
|
isAllowedToSpend = isAllowedToSpend,
|
||||||
isBalanceEnough = isBalanceWithoutFeeEnough,
|
isBalanceEnough = isBalanceWithoutFeeEnough,
|
||||||
|
hasOutgoingTransaction = hasOutgoingTransaction(fromToken),
|
||||||
includeFeeInAmount = includeFeeInAmount,
|
includeFeeInAmount = includeFeeInAmount,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -873,7 +873,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
/**
|
/**
|
||||||
* Load swap data calls only if spend is allowed for token contract address
|
* Load swap data calls only if spend is allowed for token contract address
|
||||||
*/
|
*/
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList", "LongMethod")
|
||||||
private suspend fun loadDexSwapData(
|
private suspend fun loadDexSwapData(
|
||||||
provider: SwapProvider,
|
provider: SwapProvider,
|
||||||
networkId: String,
|
networkId: String,
|
||||||
|
|
@ -932,6 +932,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
isAllowedToSpend = true,
|
isAllowedToSpend = true,
|
||||||
isBalanceEnough = isBalanceIncludeFeeEnough,
|
isBalanceEnough = isBalanceIncludeFeeEnough,
|
||||||
isFeeEnough = isFeeEnough,
|
isFeeEnough = isFeeEnough,
|
||||||
|
hasOutgoingTransaction = hasOutgoingTransaction(fromToken),
|
||||||
includeFeeInAmount = IncludeFeeInAmount.Excluded, // exclude for dex
|
includeFeeInAmount = IncludeFeeInAmount.Excluded, // exclude for dex
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
@ -1226,6 +1227,10 @@ internal class SwapInteractorImpl @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun hasOutgoingTransaction(cryptoCurrencyStatuses: CryptoCurrencyStatus): Boolean {
|
||||||
|
return cryptoCurrencyStatuses.value.pendingTransactions.any { it.isOutgoing }
|
||||||
|
}
|
||||||
|
|
||||||
private fun Fee.getGasLimit(): Int {
|
private fun Fee.getGasLimit(): Int {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is Fee.Common -> 0
|
is Fee.Common -> 0
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ data class PreparedSwapConfigState(
|
||||||
val isAllowedToSpend: Boolean,
|
val isAllowedToSpend: Boolean,
|
||||||
val isBalanceEnough: Boolean,
|
val isBalanceEnough: Boolean,
|
||||||
val isFeeEnough: Boolean,
|
val isFeeEnough: Boolean,
|
||||||
|
val hasOutgoingTransaction: Boolean,
|
||||||
val includeFeeInAmount: IncludeFeeInAmount,
|
val includeFeeInAmount: IncludeFeeInAmount,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ sealed interface SwapState {
|
||||||
isAllowedToSpend = false,
|
isAllowedToSpend = false,
|
||||||
isBalanceEnough = false,
|
isBalanceEnough = false,
|
||||||
isFeeEnough = false,
|
isFeeEnough = false,
|
||||||
|
hasOutgoingTransaction = false,
|
||||||
includeFeeInAmount = IncludeFeeInAmount.Excluded,
|
includeFeeInAmount = IncludeFeeInAmount.Excluded,
|
||||||
),
|
),
|
||||||
val permissionState: PermissionDataState = PermissionDataState.Empty,
|
val permissionState: PermissionDataState = PermissionDataState.Empty,
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
|
||||||
import com.tangem.core.ui.components.notifications.NotificationConfig
|
import com.tangem.core.ui.components.notifications.NotificationConfig
|
||||||
import com.tangem.core.ui.components.states.Item
|
import com.tangem.core.ui.components.states.Item
|
||||||
import com.tangem.core.ui.components.states.SelectableItemsState
|
import com.tangem.core.ui.components.states.SelectableItemsState
|
||||||
|
import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
||||||
import com.tangem.feature.swap.domain.models.ui.TxFee
|
import com.tangem.feature.swap.domain.models.ui.TxFee
|
||||||
import com.tangem.feature.swap.models.states.FeeItemState
|
import com.tangem.feature.swap.models.states.FeeItemState
|
||||||
|
|
@ -125,6 +126,7 @@ sealed interface SwapWarning {
|
||||||
data class TooSmallAmountWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
data class TooSmallAmountWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
||||||
data class UnableToCoverFeeWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
data class UnableToCoverFeeWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
||||||
data class GeneralWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
data class GeneralWarning(val notificationConfig: NotificationConfig) : SwapWarning
|
||||||
|
data class TransactionInProgressWarning(val title: TextReference, val description: TextReference) : SwapWarning
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class GenericWarningType {
|
enum class GenericWarningType {
|
||||||
|
|
|
||||||
|
|
@ -261,6 +261,7 @@ private fun ProviderLoadingState(modifier: Modifier = Modifier) {
|
||||||
CircularProgressIndicator(
|
CircularProgressIndicator(
|
||||||
modifier = Modifier.size(TangemTheme.dimens.size16),
|
modifier = Modifier.size(TangemTheme.dimens.size16),
|
||||||
color = TangemTheme.colors.icon.informative,
|
color = TangemTheme.colors.icon.informative,
|
||||||
|
strokeWidth = TangemTheme.dimens.size2,
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
text = "Fetching best rates ...",
|
text = "Fetching best rates ...",
|
||||||
|
|
|
||||||
|
|
@ -320,6 +320,26 @@ internal class StateBuilder(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
if (quoteModel.permissionState is PermissionDataState.PermissionLoading) {
|
||||||
|
warnings.add(
|
||||||
|
SwapWarning.TransactionInProgressWarning(
|
||||||
|
title = resourceReference(R.string.swapping_pending_transaction_title),
|
||||||
|
description = resourceReference(R.string.swapping_pending_transaction_subtitle),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
} else if (quoteModel.preparedSwapConfigState.hasOutgoingTransaction) {
|
||||||
|
warnings.add(
|
||||||
|
SwapWarning.TransactionInProgressWarning(
|
||||||
|
title = resourceReference(R.string.warning_express_active_transaction_title),
|
||||||
|
description = resourceReference(
|
||||||
|
id = R.string.warning_express_active_transaction_message,
|
||||||
|
formatArgs = wrappedList(
|
||||||
|
quoteModel.fromTokenInfo.cryptoCurrencyStatus.currency.network.currencySymbol,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
return warnings
|
return warnings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import com.tangem.core.ui.components.*
|
||||||
import com.tangem.core.ui.components.notifications.Notification
|
import com.tangem.core.ui.components.notifications.Notification
|
||||||
import com.tangem.core.ui.components.notifications.NotificationConfig
|
import com.tangem.core.ui.components.notifications.NotificationConfig
|
||||||
import com.tangem.core.ui.extensions.getActiveIconResByCoinId
|
import com.tangem.core.ui.extensions.getActiveIconResByCoinId
|
||||||
|
import com.tangem.core.ui.extensions.resolveReference
|
||||||
import com.tangem.core.ui.extensions.stringReference
|
import com.tangem.core.ui.extensions.stringReference
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.feature.swap.domain.models.ui.FeeType
|
import com.tangem.feature.swap.domain.models.ui.FeeType
|
||||||
|
|
@ -67,20 +68,6 @@ internal fun SwapScreenContent(state: SwapStateHolder, modifier: Modifier = Modi
|
||||||
|
|
||||||
if (state.warnings.isNotEmpty()) SwapWarnings(warnings = state.warnings)
|
if (state.warnings.isNotEmpty()) SwapWarnings(warnings = state.warnings)
|
||||||
|
|
||||||
AnimatedVisibility(visible = state.permissionState is SwapPermissionState.InProgress) {
|
|
||||||
CardWithIcon(
|
|
||||||
title = stringResource(id = R.string.swapping_pending_transaction_title),
|
|
||||||
description = stringResource(id = R.string.swapping_pending_transaction_subtitle),
|
|
||||||
icon = {
|
|
||||||
CircularProgressIndicator(
|
|
||||||
modifier = Modifier
|
|
||||||
.size(TangemTheme.dimens.size16),
|
|
||||||
color = TangemTheme.colors.icon.primary1,
|
|
||||||
strokeWidth = TangemTheme.dimens.size2,
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
MainButton(state = state, onPermissionWarningClick = state.onShowPermissionBottomSheet)
|
MainButton(state = state, onPermissionWarningClick = state.onShowPermissionBottomSheet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -285,6 +272,20 @@ private fun SwapWarnings(warnings: List<SwapWarning>) {
|
||||||
config = warning.notificationConfig,
|
config = warning.notificationConfig,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
is SwapWarning.TransactionInProgressWarning -> {
|
||||||
|
CardWithIcon(
|
||||||
|
title = warning.title.resolveReference(),
|
||||||
|
description = warning.description.resolveReference(),
|
||||||
|
icon = {
|
||||||
|
CircularProgressIndicator(
|
||||||
|
modifier = Modifier
|
||||||
|
.size(TangemTheme.dimens.size16),
|
||||||
|
color = TangemTheme.colors.icon.primary1,
|
||||||
|
strokeWidth = TangemTheme.dimens.size2,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
else -> {}
|
else -> {}
|
||||||
}
|
}
|
||||||
SpacerH8()
|
SpacerH8()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue