diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index 5d5c08ef1a..1ac0523e66 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -4,12 +4,16 @@
Валюты
Отправляйте только %1$s (%2$s) в сети %3$s на этот адрес. Использование другой сети может привести к утрате средств.
Обратиться в поддержку
+ Попробовать снова
Эта функция недоступна в демонстрационном режиме
Причина: %s
Не могу отправить транзакцию
Выбранный кошелёк не поддерживает сеть %1$s
Для активации криптографии сети %1$s необходимо сбросить кошелек до заводских настроек. Пожалуйста, выведите свои средства, чтобы не потерять их, после сброса доступ к текущему кошельку будет невозможен.
Токены в сети %1$s не поддерживаются этой картой из-за ограничений прошивки.
+ Спасибо за ваш отзыв. Мы ответим в кратчайшие сроки.
+ Ваши предложения отправлены
+ Пожалуйста, попробуйте приложить карту в точности, как показано на анимации, или запросите поддержку.
У вас возникли трудности со сканированием карты?
Эта карта не предназначена для работы с этим приложением
Подключите функцию комиссии по умолчанию и при формировании транзакции на отправку средств комиссия будет выставлена автоматически, а экран комиссии пропущен. Вы всегда сможете на него вернуться.
@@ -24,6 +28,8 @@
Тёмная
Светлая
Как в системе
+ При выборе настройки как в системе приложение будет использовать тему в соответствии с настройками вашего устройства
+ Системная
Тема
Настройки приложения
Чтобы скрыть или показать баланс, просто поверните ваше устройство вниз или отключите опцию его в разделе \"Настройки\"
@@ -75,6 +81,7 @@
Создать
Удалить
Отключено
+ Отключить
Готово
Включить
Включено
@@ -107,6 +114,7 @@
Отклонить
Перезагрузить
Переименовать
+ Повторить
Сохранить изменения
Искать
Поиск токенов
@@ -130,6 +138,7 @@
Я понял
Произошла ошибка. Пожалуйста, попробуйте снова.
Недоступно
+ Предупреждение
Да
Адрес контракта скопирован!
Доступные сети
@@ -176,6 +185,7 @@
Скрывать балансы жестом переворота
Эмитент
Подписано
+ Если вы забудете код, то потеряете доступ к своим средствам. Восстановление кода невозможно.
Подробности
Проверьте подключение с интернетом или переключитесь на другую сеть
Условия использования
@@ -430,8 +440,6 @@
Отсканируйте карту, чтобы изменить ее настройки. Изменения затронут только ту карту, которую вы отсканировали, и не повлияют на другие карты, привязанные к вашему кошельку.
Приготовьте свою карту
Уже содержится в введенном адресе
- Вычесть
- Недостаточно средств для покрытия комиссии сети. Вычесть недостающую сумму для покрытия комиссии из отправляемой суммы?
Сумма комиссии в %s раз превышает рекомендованную. Убедитесь, что указанная комиссия верна.
Вы указали комиссию ниже рекомендуемой, это может привести к задержке исполнения вашей транзакции. Продолжить?
Причина: %1$s\nКод: %2$s
@@ -547,6 +555,7 @@
У вас нет средств для отправки. Пополните счет, чтобы иметь возможность отправить с него средства.
Обмен %s не доступен. Но мы работаем над его добавлением.
В данный момент продажа монеты %s недоступна. Но мы работаем над её добавлением.
+ Выберите адрес
Сгенерировать XPUB
Скрыть
Вы скрываете токен с главного экрана, но в любой момент сможете добавить его обратно через страницу управления токенами.
@@ -656,6 +665,10 @@
Пожалуйста, измените сумму для обмена
Возможно, данная карта - образец или подделка
Ошибка проверки подлинности
+ Ассоциировать
+ Этот токен должен быть ассоциирован с вашей учетной записью Hedera, прежде чем вы сможете его принять. Стоимость ассоциации ~%.4f %s
+ Этот токен должен быть ассоциирован с вашей учетной записью Hedera, прежде чем вы сможете его принять
+ Ассоциируете свой токен
На этой карте осталось всего %s подписей. Вам следует вывести все ваши средства.
Малое количество подписей
Токены на разных сетях могут иметь разные адреса. Пожалуйста, убедитесь при переводе средств, что ваш адрес соответствует сети.
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 04985255c2..257e2e4adc 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -4,12 +4,16 @@
Manage tokens
Send only %1$s (%2$s) from %3$s network to this address. Using other tokens and networks may result in loss of funds.
Request support
+ Try again
This feature is disabled in Demo mode
Reason: %s
Can\'t send a transaction
The selected does not support the %1$s network
To activate the %1$s blockchain\'s cryptographic encryption, you\'ll need to reset the wallet to factory settings. Please withdraw your funds before doing so to ensure that you don\'t lose them, and then complete the reset process. Access to the current wallet will not be possible after the reset.
Tokens in %1$s network are not supported by this card due to firmware limitation.
+ Thank you for your feedback. We will respond as soon as possible
+ Your suggestions were sent
+ Please try to tap the card exactly as shown in the animation or request support.
Are you having difficulty scanning your card?
This card is not designed to work with this app
Default Fee
@@ -25,6 +29,8 @@
Dark
Light
System default
+ If system is selected, the app will auto-adjust based on your device\'s system settings
+ System
Theme
App Settings
To hide or show your balances, simply flip your device screen down, or switch it off in Settings
@@ -74,6 +80,7 @@
Create
Delete
Disabled
+ Disconnect
Done
Enable
Enabled
@@ -106,6 +113,7 @@
Reject
Reload
Rename
+ Retry
Save changes
Search
Search tokens
@@ -129,6 +137,7 @@
I understand
There was an error. Please try again.
Unreachable
+ Warning
Yes
Contract address copied!
Available networks
@@ -175,6 +184,7 @@
Flip-to-Hide Balances
Issuer
Signed
+ If you forget the code you will lose access to your funds. Code recovery is not possible.
Details
Check your internet connection or switch to a different network
Terms of Service
@@ -425,8 +435,6 @@
Scan the card to change its settings. The changes will impact only the card you\'ve scanned and will not affect other cards tied to your wallet.
Get your card ready!
Already included in the entered address
- Subtract
- Not enough funds to cover the network fee. Do you want to subtract the amount required to cover the fee?
The commission amount is %s times the recommended amount. Make sure that the custom settings are correct.
You specified a commission below the recommended amount, which could cause a delay in your transaction. Continue?
Reason: %1$s\nCode: %2$s
@@ -548,6 +556,7 @@
You do not have funds to send. Top up your account to be able to send funds from it.
%s swap is not available. But we are working on adding it.
Sell of the %s coin is currently unavailable. But we are working on adding it.
+ Choose address
Generate XPUB
Hide
You are about to hide this token from the main screen. You can add it back anytime through the manage tokens page.
@@ -657,6 +666,10 @@
Please change the amount to swap
This card might be a production sample or counterfeit
Authenticity check failed
+ Associate
+ This token must be associated with your Hedera account before you can receive it. Association fee ~%.4f %s
+ This token must be associated with your Hedera account before you can receive it
+ Associate your token
Only %s signatures are left on this card. You must withdraw all of your funds.
Low signature count
Tokens on different networks can have different addresses. Double-check that your address matches the network when you transfer funds.
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt
index 2f48bcb034..e99471d8de 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt
@@ -103,6 +103,10 @@ internal sealed class SendAnalyticEvents(
params = mapOf(TOKEN to token),
)
+ data object NoticeFeeCoverage : SendAnalyticEvents(
+ event = "Notice - Network Fee Coverage",
+ )
+
/** If error occurs during send transactions */
data class TransactionError(val token: String) : SendAnalyticEvents(
event = "Error - Transaction Rejected",
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt
index 6de841373c..fc7ae7daf1 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendAlertState.kt
@@ -68,16 +68,6 @@ internal sealed class SendAlertState {
override val confirmButtonText: TextReference = resourceReference(R.string.common_continue)
}
- data class FeeCoverage(
- override val onConfirmClick: (() -> Unit),
- ) : SendAlertState() {
- override val title: TextReference? = null
- override val message: TextReference =
- resourceReference(id = R.string.send_alert_fee_coverage_title)
- override val confirmButtonText: TextReference =
- resourceReference(id = R.string.send_alert_fee_coverage_subract_text)
- }
-
data class ReserveAmount(val amount: String) : SendAlertState() {
override val title: TextReference =
resourceReference(id = R.string.send_notification_invalid_reserve_amount_title, wrappedList(amount))
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt
index d99b6bd0ff..616fad69f8 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendEventStateFactory.kt
@@ -48,19 +48,6 @@ internal class SendEventStateFactory(
)
}
- fun getFeeCoverageAlert(onConsume: () -> Unit): SendUiState {
- return currentStateProvider().copy(
- event = triggeredEvent(
- data = SendEvent.ShowAlert(
- SendAlertState.FeeCoverage(
- onConfirmClick = clickIntents::onSubtractSelect,
- ),
- ),
- onConsume = onConsume,
- ),
- )
- }
-
fun getFeeUpdatedAlert(fee: TransactionFee, onConsume: () -> Unit, onFeeNotIncreased: () -> Unit): SendUiState {
val state = currentStateProvider()
val feeSelector = state.feeState?.feeSelectorState as? FeeSelectorState.Content ?: return state
@@ -139,9 +126,7 @@ internal class SendEventStateFactory(
return state.copy(
event = triggeredEvent(
data = SendEvent.ShowAlert(
- SendAlertState.FeeUnreachableError(
- onConfirmClick = { clickIntents.feeReload(true) },
- ),
+ SendAlertState.FeeUnreachableError(onConfirmClick = clickIntents::feeReload),
),
onConsume = onConsume,
),
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
index e59bd0e517..3334f3faaa 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendNotification.kt
@@ -42,11 +42,6 @@ internal sealed class SendNotification(val config: NotificationConfig) {
),
)
- data class ReserveAmountError(val amount: String) : Error(
- title = resourceReference(R.string.send_notification_invalid_reserve_amount_title, wrappedList(amount)),
- subtitle = resourceReference(R.string.send_notification_invalid_reserve_amount_text),
- )
-
data class TransactionLimitError(
val cryptoCurrency: String,
val utxoLimit: String,
@@ -153,5 +148,10 @@ internal sealed class SendNotification(val config: NotificationConfig) {
onClick = onRefresh,
),
)
+
+ data object FeeCoverageNotification : Warning(
+ title = resourceReference(R.string.send_network_fee_warning_title),
+ subtitle = resourceReference(R.string.swapping_network_fee_warning_content),
+ )
}
}
\ No newline at end of file
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt
index 0938d051f2..b31e9559be 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendStateFactory.kt
@@ -14,7 +14,6 @@ import com.tangem.domain.wallets.usecase.ValidateWalletMemoUseCase
import com.tangem.features.send.impl.R
import com.tangem.features.send.impl.presentation.domain.AvailableWallet
import com.tangem.features.send.impl.presentation.state.amount.SendAmountStateConverter
-import com.tangem.features.send.impl.presentation.state.amount.SendAmountSubtractConverter
import com.tangem.features.send.impl.presentation.state.confirm.SendConfirmStateConverter
import com.tangem.features.send.impl.presentation.state.fee.SendFeeStateConverter
import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldConverter
@@ -48,12 +47,6 @@ internal class SendStateFactory(
appCurrencyProvider = appCurrencyProvider,
)
}
- private val amountSubtractConverter by lazy(LazyThreadSafetyMode.NONE) {
- SendAmountSubtractConverter(
- currentStateProvider = currentStateProvider,
- cryptoCurrencyStatusProvider = cryptoCurrencyStatusProvider,
- )
- }
private val amountStateConverter by lazy(LazyThreadSafetyMode.NONE) {
SendAmountStateConverter(
appCurrencyProvider = appCurrencyProvider,
@@ -265,14 +258,6 @@ internal class SendStateFactory(
//endregion
//region send
- fun onSubtractSelect(isAmountSubtractAvailable: Boolean): SendUiState {
- val state = currentStateProvider()
-
- if (!isAmountSubtractAvailable) return state
-
- return amountSubtractConverter.convert(Unit)
- }
-
fun getSendingStateUpdate(isSending: Boolean): SendUiState {
val state = currentStateProvider()
return state.copy(
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt
index eb0e05e900..2b14283039 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/SendUiState.kt
@@ -50,10 +50,7 @@ internal sealed class SendStates {
val segmentedButtonConfig: PersistentList,
val isSegmentedButtonsEnabled: Boolean,
val amountTextField: SendTextField.AmountField,
- val notifications: ImmutableList,
val appCurrencyCode: String,
- val isFeeLoading: Boolean,
- val subtractedFee: BigDecimal?,
) : SendStates()
/** Recipient state */
@@ -90,7 +87,6 @@ internal sealed class SendStates {
override val isPrimaryButtonEnabled: Boolean = true,
val isSending: Boolean,
val isSuccess: Boolean,
- val isSubtract: Boolean,
val transactionDate: Long,
val txUrl: String,
val ignoreAmountReduce: Boolean,
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt
index 4577927cc1..6f56b6aff3 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/AmountStateFactory.kt
@@ -1,12 +1,10 @@
package com.tangem.features.send.impl.presentation.state.amount
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
-import com.tangem.features.send.impl.presentation.state.SendNotification
import com.tangem.features.send.impl.presentation.state.SendUiState
import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldChangeConverter
import com.tangem.features.send.impl.presentation.state.fields.SendAmountFieldMaxAmountConverter
import com.tangem.utils.Provider
-import kotlinx.collections.immutable.ImmutableList
/**
* Factory to produce amount state for [SendUiState]
@@ -43,18 +41,4 @@ internal class AmountStateFactory(
}
fun getOnCurrencyChangedState(isFiat: Boolean) = amountCurrencyConverter.convert(isFiat)
-
- fun getAmountNotificationState(notifications: ImmutableList): SendUiState {
- val state = currentStateProvider()
- return state.copy(
- amountState = state.amountState?.copy(notifications = notifications),
- )
- }
-
- fun getOnAmountFeeLoadingCancel(): SendUiState {
- val state = currentStateProvider()
- return state.copy(
- amountState = state.amountState?.copy(isFeeLoading = false),
- )
- }
}
\ No newline at end of file
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt
index ba3ab64dcf..7e3199d1ff 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountStateConverter.kt
@@ -39,10 +39,7 @@ internal class SendAmountStateConverter(
tokenIconState = iconStateConverter.convert(status),
amountTextField = sendAmountFieldConverter.convert(value),
isPrimaryButtonEnabled = false,
- notifications = persistentListOf(),
- isFeeLoading = false,
appCurrencyCode = appCurrency.code,
- subtractedFee = null,
segmentedButtonConfig = persistentListOf(
SendAmountSegmentedButtonsConfig(
title = stringReference(status.currency.symbol),
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountSubtractConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountSubtractConverter.kt
deleted file mode 100644
index fb5d2708ad..0000000000
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/amount/SendAmountSubtractConverter.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.tangem.features.send.impl.presentation.state.amount
-
-import com.tangem.core.ui.utils.parseBigDecimal
-import com.tangem.domain.tokens.model.CryptoCurrencyStatus
-import com.tangem.features.send.impl.presentation.state.SendUiState
-import com.tangem.utils.Provider
-import com.tangem.utils.converter.Converter
-import java.math.BigDecimal
-
-internal class SendAmountSubtractConverter(
- private val currentStateProvider: Provider,
- private val cryptoCurrencyStatusProvider: Provider,
-) : Converter {
- override fun convert(value: Unit): SendUiState {
- val state = currentStateProvider()
- val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
- val amountState = state.amountState ?: return state
- val feeState = state.feeState ?: return state
- val feeValue = feeState.fee?.amount?.value ?: return state
- val amountTextField = amountState.amountTextField
- val amountValue = amountTextField.cryptoAmount.value ?: return state
- val balance = cryptoCurrencyStatus.value.amount ?: return state
- val fiatRate = cryptoCurrencyStatus.value.fiatRate
- val cryptoDecimals = amountTextField.cryptoAmount.decimals
- val fiatDecimals = amountTextField.fiatAmount.decimals
-
- val feeDiff = amountState.subtractedFee?.let { feeValue.minus(it) }
- ?: amountValue.minus(balance.minus(feeValue))
- val decimalCryptoValue = amountValue.minus(feeDiff)
-
- if (decimalCryptoValue < BigDecimal.ZERO) return state
-
- val decimalFiatValue = decimalCryptoValue.multiply(fiatRate)
- val cryptoValue = decimalCryptoValue.parseBigDecimal(cryptoDecimals)
- val fiatValue = decimalFiatValue.parseBigDecimal(fiatDecimals)
-
- return state.copy(
- sendState = state.sendState?.copy(isSubtract = true),
- amountState = amountState.copy(
- subtractedFee = feeValue,
- amountTextField = amountTextField.copy(
- value = cryptoValue,
- fiatValue = fiatValue,
- cryptoAmount = amountTextField.cryptoAmount.copy(value = decimalCryptoValue),
- fiatAmount = amountTextField.fiatAmount.copy(value = decimalFiatValue),
- ),
- ),
- )
- }
-}
\ No newline at end of file
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt
index d5662a10b7..e202bf5e25 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendConfirmStateConverter.kt
@@ -13,7 +13,6 @@ internal class SendConfirmStateConverter(
isPrimaryButtonEnabled = true,
isSending = false,
isSuccess = false,
- isSubtract = false,
transactionDate = 0L,
txUrl = "",
ignoreAmountReduce = false,
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
index 3ad03b434c..3b01354982 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/confirm/SendNotificationFactory.kt
@@ -18,11 +18,10 @@ import com.tangem.domain.wallets.models.UserWallet
import com.tangem.features.send.impl.R
import com.tangem.features.send.impl.presentation.analytics.SendAnalyticEvents
import com.tangem.features.send.impl.presentation.state.*
-import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState
-import com.tangem.features.send.impl.presentation.state.fee.FeeType
-import com.tangem.features.send.impl.presentation.state.fee.checkIfFeeTooHigh
+import com.tangem.features.send.impl.presentation.state.fee.*
import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents
import com.tangem.lib.crypto.BlockchainUtils.isDogecoin
+import com.tangem.lib.crypto.BlockchainUtils.isTezos
import com.tangem.utils.Provider
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
@@ -36,11 +35,11 @@ import java.math.BigDecimal
internal class SendNotificationFactory(
private val cryptoCurrencyStatusProvider: Provider,
private val coinCryptoCurrencyStatusProvider: Provider,
- private val feePaidCryptoCurrencyStatusProvider: Provider,
private val currentStateProvider: Provider,
private val userWalletProvider: Provider,
private val currencyChecksRepository: CurrencyChecksRepository,
private val stateRouterProvider: Provider,
+ private val isSubtractAvailableProvider: Provider,
private val clickIntents: SendClickIntents,
private val analyticsEventHandler: AnalyticsEventHandler,
private val getBalanceNotEnoughForFeeWarningUseCase: GetBalanceNotEnoughForFeeWarningUseCase,
@@ -52,19 +51,33 @@ internal class SendNotificationFactory(
val state = currentStateProvider()
val sendState = state.sendState ?: return@map persistentListOf()
val feeState = state.feeState ?: return@map persistentListOf()
- val feeAmount = feeState.fee?.amount?.value ?: BigDecimal.ZERO
+ val balance = cryptoCurrencyStatusProvider().value.amount ?: BigDecimal.ZERO
val amountValue = state.amountState?.amountTextField?.cryptoAmount?.value ?: BigDecimal.ZERO
+ val feeValue = feeState.fee?.amount?.value ?: BigDecimal.ZERO
+ val isFeeCoverage = checkFeeCoverage(
+ isSubtractAvailable = isSubtractAvailableProvider(),
+ balance = balance,
+ amountValue = amountValue,
+ feeValue = feeValue,
+ )
+ val sendingAmount = calculateSubtractedAmount(
+ isFeeCoverage = isFeeCoverage,
+ cryptoCurrencyStatus = cryptoCurrencyStatusProvider(),
+ amountValue = amountValue,
+ feeValue = feeValue,
+ )
buildList {
// errors
addFeeUnreachableNotification(feeState.feeSelectorState)
- addExceedBalanceNotification(feeAmount, amountValue)
+ addExceedBalanceNotification(feeValue, sendingAmount)
addExceedsBalanceNotification(feeState.fee)
- addMinimumAmountErrorNotification(feeAmount, amountValue)
- addDustWarningNotification(feeAmount, amountValue)
- addTransactionLimitErrorNotification(feeAmount, amountValue)
+ addMinimumAmountErrorNotification(feeValue, sendingAmount)
+ addDustWarningNotification(feeValue, sendingAmount)
+ addTransactionLimitErrorNotification(feeValue, sendingAmount)
// warnings
- addExistentialWarningNotification(feeAmount, amountValue)
- addHighFeeWarningNotification(feeAmount, amountValue, sendState.ignoreAmountReduce)
+ addExistentialWarningNotification(feeValue, amountValue)
+ addFeeCoverageNotification(isFeeCoverage)
+ addHighFeeWarningNotification(amountValue, sendState.ignoreAmountReduce)
addTooHighNotification(feeState.feeSelectorState)
addTooLowNotification(feeState)
}.toImmutableList()
@@ -95,13 +108,11 @@ internal class SendNotificationFactory(
receivedAmount: BigDecimal,
) {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
- val feePaidCryptoCurrencyStatus = feePaidCryptoCurrencyStatusProvider()
- val cryptoAmount = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO
+ val balance = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO
- val isCurrentNotFeePaidCurrency = cryptoCurrencyStatus.currency.id != feePaidCryptoCurrencyStatus?.currency?.id
- if (isCurrentNotFeePaidCurrency) return
+ if (!isSubtractAvailableProvider()) return
- val showNotification = receivedAmount + feeAmount > cryptoAmount
+ val showNotification = receivedAmount + feeAmount > balance
if (showNotification) {
add(SendNotification.Error.TotalExceedsBalance)
}
@@ -192,16 +203,22 @@ internal class SendNotificationFactory(
}
}
+ private fun MutableList.addFeeCoverageNotification(sendingAmount: Boolean) {
+ if (sendingAmount) {
+ analyticsEventHandler.send(SendAnalyticEvents.NoticeFeeCoverage)
+ add(SendNotification.Warning.FeeCoverageNotification)
+ }
+ }
+
private fun MutableList.addHighFeeWarningNotification(
- feeAmount: BigDecimal,
sendAmount: BigDecimal,
ignoreAmountReduce: Boolean,
) {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
val balance = cryptoCurrencyStatus.value.amount ?: BigDecimal.ZERO
- val isTezos = cryptoCurrencyStatus.currency.network.id.value == Blockchain.Tezos.id
+ val isTezos = isTezos(cryptoCurrencyStatus.currency.network.id.value)
val threshold = Blockchain.Tezos.minimalAmount()
- val isTotalBalance = feeAmount.plus(sendAmount) >= balance && balance > threshold
+ val isTotalBalance = sendAmount >= balance && balance > threshold
if (!ignoreAmountReduce && isTotalBalance && isTezos) {
add(
SendNotification.Warning.HighFeeError(
@@ -218,6 +235,7 @@ internal class SendNotificationFactory(
}
}
+ // todo remove in [REDACTED_TASK_KEY]
private fun MutableList.addMinimumAmountErrorNotification(
feeAmount: BigDecimal,
receivedAmount: BigDecimal,
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt
index 31307124fd..8ec4bfd4d6 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeCalculation.kt
@@ -1,21 +1,73 @@
package com.tangem.features.send.impl.presentation.state.fee
+import com.tangem.blockchain.common.Blockchain
import com.tangem.blockchain.common.transaction.TransactionFee
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.core.ui.utils.parseToBigDecimal
+import com.tangem.domain.common.extensions.minimalAmount
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.send.impl.presentation.state.SendUiState
+import com.tangem.lib.crypto.BlockchainUtils
import java.math.BigDecimal
import java.math.RoundingMode
/**
- * Check if sending amount with fee is greater than balance
+ * Check and calculates subtracted amount
*/
-internal fun checkFeeCoverage(state: SendUiState, cryptoCurrencyStatus: CryptoCurrencyStatus): Boolean {
- val balance = cryptoCurrencyStatus.value.amount ?: return false
- val fee = state.feeState?.fee?.amount?.value ?: return false
- val amount = state.amountState?.amountTextField?.cryptoAmount?.value ?: return false
- return balance < amount + fee && balance > fee
+internal fun checkAndCalculateSubtractedAmount(
+ isAmountSubtractAvailable: Boolean,
+ cryptoCurrencyStatus: CryptoCurrencyStatus,
+ amountValue: BigDecimal,
+ feeValue: BigDecimal,
+): BigDecimal {
+ val balance = cryptoCurrencyStatus.value.amount ?: return amountValue
+ val isFeeCoverage = checkFeeCoverage(
+ isSubtractAvailable = isAmountSubtractAvailable,
+ balance = balance,
+ amountValue = amountValue,
+ feeValue = feeValue,
+ )
+ return calculateSubtractedAmount(
+ isFeeCoverage = isFeeCoverage,
+ cryptoCurrencyStatus = cryptoCurrencyStatus,
+ amountValue = amountValue,
+ feeValue = feeValue,
+ )
+}
+
+/**
+ * Checks if sending amount with fee is greater than balance
+ */
+internal fun checkFeeCoverage(
+ isSubtractAvailable: Boolean,
+ balance: BigDecimal,
+ amountValue: BigDecimal,
+ feeValue: BigDecimal,
+): Boolean {
+ if (!isSubtractAvailable) return false
+ return balance < amountValue + feeValue && balance > feeValue
+}
+
+/**
+ * Calculates subtracted amount
+ */
+internal fun calculateSubtractedAmount(
+ isFeeCoverage: Boolean,
+ cryptoCurrencyStatus: CryptoCurrencyStatus,
+ amountValue: BigDecimal,
+ feeValue: BigDecimal,
+): BigDecimal {
+ val balance = cryptoCurrencyStatus.value.amount ?: return amountValue
+ return if (isFeeCoverage) {
+ var subtractedValue = minOf(amountValue, balance.minus(feeValue))
+ if (BlockchainUtils.isTezos(cryptoCurrencyStatus.currency.network.id.value)) {
+ val threshold = Blockchain.Tezos.minimalAmount()
+ subtractedValue = -threshold
+ }
+ subtractedValue
+ } else {
+ amountValue
+ }
}
/**
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt
index 5e34a54d61..a74613acd3 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fee/FeeStateFactory.kt
@@ -45,7 +45,6 @@ internal class FeeStateFactory(
val state = currentStateProvider()
val feeState = state.feeState ?: return state
return state.copy(
- amountState = state.amountState?.copy(isFeeLoading = true),
feeState = feeState.copy(
feeSelectorState = if (feeState.feeSelectorState is FeeSelectorState.Content) {
feeState.feeSelectorState
@@ -78,7 +77,6 @@ internal class FeeStateFactory(
val fee = feeConverter.convert(updatedFeeSelectorState)
return state.copy(
- amountState = state.amountState?.copy(isFeeLoading = false),
feeState = feeState.copy(
feeSelectorState = updatedFeeSelectorState,
fee = fee,
@@ -90,7 +88,6 @@ internal class FeeStateFactory(
fun onFeeOnErrorState(): SendUiState {
val state = currentStateProvider()
return state.copy(
- amountState = state.amountState?.copy(isFeeLoading = false),
feeState = state.feeState?.copy(
feeSelectorState = FeeSelectorState.Error,
),
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt
index 8d7daa1665..a1fc8fbe25 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldChangeConverter.kt
@@ -38,7 +38,6 @@ internal class SendAmountFieldChangeConverter(
return state.copy(
amountState = amountState.copy(
isPrimaryButtonEnabled = !isExceedBalance && !isZero,
- subtractedFee = null,
amountTextField = amountTextField.copy(
value = cryptoValue,
fiatValue = fiatValue,
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldMaxAmountConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldMaxAmountConverter.kt
index 715d3ad4f8..b29459e757 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldMaxAmountConverter.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/fields/SendAmountFieldMaxAmountConverter.kt
@@ -34,7 +34,6 @@ internal class SendAmountFieldMaxAmountConverter(
return state.copy(
amountState = amountState.copy(
isPrimaryButtonEnabled = true,
- subtractedFee = null,
amountTextField = amountTextField.copy(
value = cryptoValue,
fiatValue = fiatValue,
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt
index c301029957..cbe162c0c5 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt
@@ -22,10 +22,7 @@ internal object AmountStatePreviewData {
walletBalance = stringReference("123.123"),
tokenIconState = TokenIconState.Loading,
segmentedButtonConfig = persistentListOf(),
- notifications = persistentListOf(),
- isFeeLoading = false,
appCurrencyCode = "usd",
- subtractedFee = null,
amountTextField = SendTextField.AmountField(
value = "123.123123123123123123",
onValueChange = {},
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt
index 92be46efa2..10a3142e61 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/SendClickIntentsStub.kt
@@ -34,14 +34,12 @@ internal object SendClickIntentsStub : SendClickIntents {
override fun onRecipientMemoValueChange(value: String) {}
- override fun feeReload(isToNextState: Boolean) {}
+ override fun feeReload() {}
override fun onFeeSelectorClick(feeType: FeeType) {}
override fun onCustomFeeValueChange(index: Int, value: String) {}
- override fun onSubtractSelect() {}
-
override fun onReadMoreClick() {}
override fun onSendClick() {}
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
index fda14b8a8a..604a9ba0a6 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/SendNavigationButtons.kt
@@ -78,7 +78,6 @@ private fun SendNavigationButton(
val isFromConfirmation = currentState.isFromConfirmation
val isCorrectScreen = currentState.type == SendUiStateType.Amount || currentState.type == SendUiStateType.Fee
val isSendingState = currentState.type == SendUiStateType.Send && !isSuccess && !isSending
- val showProgress = uiState.amountState?.isFeeLoading == true
val (buttonTextId, buttonClick) = getButtonData(
currentState = currentState,
@@ -120,7 +119,7 @@ private fun SendNavigationButton(
if (isSendingState) hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
buttonClick()
},
- showProgress = showProgress,
+ showProgress = false,
modifier = Modifier.fillMaxWidth(),
colors = TangemButtonsDefaults.primaryButtonColors,
)
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt
index 4e05fe9506..340f8e20ad 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountButtons.kt
@@ -28,7 +28,6 @@ private const val AMOUNT_BUTTONS_KEY = "amountButtonsKey"
internal fun LazyListScope.buttons(
segmentedButtonConfig: PersistentList,
clickIntents: SendClickIntents,
- isMaxButtonEnabled: Boolean,
isSegmentedButtonsEnabled: Boolean,
) {
item(
@@ -61,7 +60,6 @@ internal fun LazyListScope.buttons(
}
SecondaryButton(
text = stringResource(R.string.send_max_amount),
- enabled = isMaxButtonEnabled,
onClick = {
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
clickIntents.onMaxValueClick()
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt
index bb5b97aa51..f92a93cdae 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountField.kt
@@ -22,11 +22,10 @@ import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.utils.BigDecimalFormatter
import com.tangem.core.ui.utils.rememberDecimalFormat
import com.tangem.features.send.impl.presentation.state.fields.SendTextField
-import kotlinx.coroutines.delay
import kotlinx.coroutines.job
@Composable
-internal fun AmountField(sendField: SendTextField.AmountField, isEnabled: Boolean, appCurrencyCode: String) {
+internal fun AmountField(sendField: SendTextField.AmountField, appCurrencyCode: String) {
val decimalFormat = rememberDecimalFormat()
val isFiatValue = sendField.isFiatValue
val currencyCode = if (isFiatValue) appCurrencyCode else null
@@ -36,15 +35,6 @@ internal fun AmountField(sendField: SendTextField.AmountField, isEnabled: Boolea
sendField.cryptoAmount to sendField.value
}
val requester = remember { FocusRequester() }
- var isEnabledProxy by remember { mutableStateOf(isEnabled) }
-
- // Fix animation from amount screen to summary screen ([REDACTED_TASK_KEY])
- LaunchedEffect(key1 = isEnabled) {
- if (isEnabled) {
- delay(timeMillis = 700)
- }
- isEnabledProxy = isEnabled
- }
AmountTextField(
value = primaryValue,
@@ -62,7 +52,6 @@ internal fun AmountField(sendField: SendTextField.AmountField, isEnabled: Boolea
color = TangemTheme.colors.text.primary1,
textAlign = TextAlign.Center,
),
- isEnabled = isEnabledProxy,
isAutoResize = true,
modifier = Modifier
.focusRequester(requester)
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt
index d9926e3f54..eb78c8d0a1 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/AmountFieldContainer.kt
@@ -62,7 +62,6 @@ internal fun LazyListScope.amountField(
)
AmountField(
sendField = amountState.amountTextField,
- isEnabled = !amountState.isFeeLoading,
appCurrencyCode = amountState.appCurrencyCode,
)
}
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt
index fb9d2df22c..6806468b2b 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/amount/SendAmountContent.kt
@@ -12,7 +12,6 @@ import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.previewdata.AmountStatePreviewData
import com.tangem.features.send.impl.presentation.state.previewdata.SendClickIntentsStub
-import com.tangem.features.send.impl.presentation.ui.common.notifications
import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents
@Composable
@@ -35,10 +34,8 @@ internal fun SendAmountContent(
buttons(
segmentedButtonConfig = amountState.segmentedButtonConfig,
clickIntents = clickIntents,
- isMaxButtonEnabled = !amountState.isFeeLoading,
isSegmentedButtonsEnabled = amountState.isSegmentedButtonsEnabled,
)
- notifications(amountState.notifications)
}
}
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt
index 9db5547b20..74e5d81128 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendClickIntents.kt
@@ -39,14 +39,12 @@ internal interface SendClickIntents {
// endregion
// region Fee
- fun feeReload(isToNextState: Boolean = false)
+ fun feeReload()
fun onFeeSelectorClick(feeType: FeeType)
fun onCustomFeeValueChange(index: Int, value: String)
- fun onSubtractSelect()
-
fun onReadMoreClick()
// endregion
diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt
index 77708a0eda..caec97e044 100644
--- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt
+++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt
@@ -157,10 +157,10 @@ internal class SendViewModel @Inject constructor(
private val sendNotificationFactory = SendNotificationFactory(
cryptoCurrencyStatusProvider = Provider { cryptoCurrencyStatus },
coinCryptoCurrencyStatusProvider = Provider { coinCryptoCurrencyStatus },
- feePaidCryptoCurrencyStatusProvider = Provider { feeCryptoCurrencyStatus },
currentStateProvider = Provider { uiState },
userWalletProvider = Provider { userWallet },
stateRouterProvider = Provider { stateRouter },
+ isSubtractAvailableProvider = Provider { isAmountSubtractAvailable },
currencyChecksRepository = currencyChecksRepository,
clickIntents = this,
analyticsEventHandler = analyticsEventHandler,
@@ -192,7 +192,6 @@ internal class SendViewModel @Inject constructor(
private var qrScannerJobHolder = JobHolder()
private var sendIdleTimer = 0L
- private var feeIdleTimer = 0L
init {
subscribeOnCurrencyStatusUpdates()
@@ -488,12 +487,7 @@ internal class SendViewModel @Inject constructor(
if (onFeeNext()) return
}
SendUiStateType.Amount -> {
- if (uiState.feeState?.feeSelectorState is FeeSelectorState.Content) {
- if (onFeeCoverageAlert()) return
- } else {
- loadFee(isToNextState = true)
- return
- }
+ loadFee()
}
else -> Unit
}
@@ -519,7 +513,6 @@ internal class SendViewModel @Inject constructor(
innerRouter.openTokenDetails(userWalletId, currency)
private fun onFeeNext(): Boolean {
- if (onFeeCoverageAlert()) return true
if (checkIfFeeTooLow(uiState)) {
uiState = eventStateFactory.getFeeTooLowAlert(
onConsume = { uiState = eventStateFactory.onConsumeEventState() },
@@ -538,19 +531,6 @@ internal class SendViewModel @Inject constructor(
)
}
- private fun onFeeCoverageAlert(): Boolean {
- val isFeeCoverage = checkFeeCoverage(uiState, cryptoCurrencyStatus)
- return if (isAmountSubtractAvailable && isFeeCoverage) {
- uiState = eventStateFactory.getFeeCoverageAlert(
- onConsume = { uiState = eventStateFactory.onConsumeEventState() },
- )
- true
- } else {
- analyticsEventHandler.send(SendAnalyticEvents.SubtractFromAmount(false))
- false
- }
- }
-
private fun cancelFeeRequest() {
viewModelScope.launch(dispatchers.main) {
feeJobHolder.cancel()
@@ -652,7 +632,7 @@ internal class SendViewModel @Inject constructor(
// endregion
// region fee
- override fun feeReload(isToNextState: Boolean) = loadFee(isToNextState = isToNextState)
+ override fun feeReload() = loadFee()
override fun onFeeSelectorClick(feeType: FeeType) {
uiState = feeStateFactory.onFeeSelectedState(feeType)
@@ -667,12 +647,6 @@ internal class SendViewModel @Inject constructor(
updateFeeNotifications()
}
- override fun onSubtractSelect() {
- uiState = stateFactory.onSubtractSelect(isAmountSubtractAvailable)
- stateRouter.showSend()
- analyticsEventHandler.send(SendAnalyticEvents.SubtractFromAmount(true))
- }
-
override fun onReadMoreClick() {
val locale = if (Locale.getDefault().language == RU_LOCALE) RU_LOCALE else EN_LOCALE
val url = buildString {
@@ -683,10 +657,7 @@ internal class SendViewModel @Inject constructor(
innerRouter.openUrl(url)
}
- private fun loadFee(isToNextState: Boolean = false) {
- // debouncing fee request
- if (SystemClock.elapsedRealtime() - feeIdleTimer < FEE_UPDATE_DELAY) return
-
+ private fun loadFee() {
viewModelScope.launch(dispatchers.main) {
val isShowStatus = uiState.feeState?.fee == null
if (isShowStatus) {
@@ -694,36 +665,25 @@ internal class SendViewModel @Inject constructor(
}
val result = callFeeUseCase()?.fold(
ifRight = {
- feeIdleTimer = SystemClock.elapsedRealtime()
uiState = feeStateFactory.onFeeOnLoadedState(it)
- if (isToNextState && !onFeeCoverageAlert()) {
- stateRouter.showSend()
- }
},
ifLeft = {
- onFeeLoadFailed(isShowStatus, isToNextState)
+ onFeeLoadFailed(isShowStatus)
},
)
if (result == null) {
- onFeeLoadFailed(isShowStatus, isToNextState)
+ onFeeLoadFailed(isShowStatus)
}
updateNotifications()
updateFeeNotifications()
}.saveIn(feeJobHolder)
.invokeOnCompletion {
- uiState = amountStateFactory.getOnAmountFeeLoadingCancel()
+ // todo
}
}
- private fun onFeeLoadFailed(isShowStatus: Boolean, isToNextState: Boolean) {
- when {
- isToNextState -> {
- uiState = eventStateFactory.getFeeUnreachableErrorState {
- uiState = eventStateFactory.onConsumeEventState()
- }
- }
- isShowStatus -> uiState = feeStateFactory.onFeeOnErrorState()
- }
+ private fun onFeeLoadFailed(isShowStatus: Boolean) {
+ if (isShowStatus) uiState = feeStateFactory.onFeeOnErrorState()
}
private suspend fun checkIfSubtractAvailable() {
@@ -757,7 +717,6 @@ internal class SendViewModel @Inject constructor(
verifyAndSendTransaction()
} else {
onCheckFeeUpdate()
- feeIdleTimer = SystemClock.elapsedRealtime()
sendIdleTimer = SystemClock.elapsedRealtime()
}
}
@@ -798,7 +757,7 @@ internal class SendViewModel @Inject constructor(
override fun onAmountReduceClick(reducedAmount: BigDecimal, clazz: Class) {
uiState = amountStateFactory.getOnAmountValueChange(reducedAmount.parseBigDecimal(cryptoCurrency.decimals))
uiState = sendNotificationFactory.dismissNotificationState(clazz)
- updateNotifications()
+ feeReload()
}
override fun onNotificationCancel(clazz: Class) {
@@ -811,10 +770,18 @@ internal class SendViewModel @Inject constructor(
val fee = feeState.fee ?: return
val memo = uiState.recipientState?.memoTextField?.value
val amountValue = uiState.amountState?.amountTextField?.cryptoAmount?.value ?: return
+ val feeValue = fee.amount.value ?: return
+
+ val receivingAmount = checkAndCalculateSubtractedAmount(
+ isAmountSubtractAvailable = isAmountSubtractAvailable,
+ cryptoCurrencyStatus = cryptoCurrencyStatus,
+ amountValue = amountValue,
+ feeValue = feeValue,
+ )
viewModelScope.launch(dispatchers.main) {
createTransactionUseCase(
- amount = amountValue.convertToAmount(cryptoCurrency),
+ amount = receivingAmount.convertToAmount(cryptoCurrency),
fee = fee,
memo = memo,
destination = recipient,
@@ -927,7 +894,6 @@ internal class SendViewModel @Inject constructor(
private companion object {
const val CHECK_FEE_UPDATE_DELAY = 60_000L
- const val FEE_UPDATE_DELAY = 10_000L
const val BALANCE_UPDATE_DELAY = 10_000L
const val RU_LOCALE = "ru"
diff --git a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt
index cf10f1ce54..a4492852b0 100644
--- a/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt
+++ b/libs/crypto/src/main/java/com/tangem/lib/crypto/BlockchainUtils.kt
@@ -33,8 +33,15 @@ object BlockchainUtils {
return blockchain == Blockchain.Bitcoin || blockchain == Blockchain.BitcoinTestnet
}
+ /** If current [networkId] is Dogecoin */
fun isDogecoin(networkId: String): Boolean {
val blockchain = Blockchain.fromId(networkId)
return blockchain == Blockchain.Dogecoin
}
+
+ /** If current [networkId] is Tezos */
+ fun isTezos(networkId: String): Boolean {
+ val blockchain = Blockchain.fromId(networkId)
+ return blockchain == Blockchain.Tezos
+ }
}
\ No newline at end of file