From b5ef5e6c4bf78b6d739112cb1f2ee91377154a2b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Apr 2025 19:01:17 +0500 Subject: [PATCH 1/9] Updated on 2026-08-14 --- .../v2/subcomponents/destination/model/SendDestinationModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt index 2f4e77b25d..14f2d7a777 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/destination/model/SendDestinationModel.kt @@ -104,7 +104,7 @@ internal class SendDestinationModel @Inject constructor( ), ) val params = params as? SendDestinationComponentParams.DestinationBlockParams - if (params?.predefinedAddressValue != null && params.predefinedMemoValue != null) { + if (params?.predefinedAddressValue != null) { _uiState.update( SendDestinationPredefinedStateTransformer( address = params.predefinedAddressValue, From 84070c0990df4450cdddf9a0b0f2209deaf8b04b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Apr 2025 17:11:38 +0400 Subject: [PATCH 2/9] Updated on 2026-08-14 --- features/wallet/impl/build.gradle.kts | 41 ++++++++++--------- .../intents/WalletWarningsClickIntents.kt | 25 ++++++++--- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/features/wallet/impl/build.gradle.kts b/features/wallet/impl/build.gradle.kts index 595cdad4de..da4e888dfe 100644 --- a/features/wallet/impl/build.gradle.kts +++ b/features/wallet/impl/build.gradle.kts @@ -66,33 +66,34 @@ dependencies { implementation(projects.libs.blockchainSdk) /** Domain modules */ - implementation(projects.domain.card) - implementation(projects.domain.demo) - implementation(projects.domain.legacy) - implementation(projects.domain.models) - implementation(projects.domain.settings) - implementation(projects.domain.tokens) - implementation(projects.domain.tokens.models) - implementation(projects.domain.txhistory) - implementation(projects.domain.txhistory.models) - implementation(projects.domain.wallets) - implementation(projects.domain.wallets.models) + implementation(projects.domain.analytics) implementation(projects.domain.appCurrency) implementation(projects.domain.appCurrency.models) implementation(projects.domain.balanceHiding) implementation(projects.domain.balanceHiding.models) - implementation(projects.domain.analytics) - implementation(projects.domain.visa) - implementation(projects.domain.staking.models) - implementation(projects.domain.staking) - implementation(projects.domain.markets.models) + implementation(projects.domain.card) + implementation(projects.domain.demo) implementation(projects.domain.feedback) - implementation(projects.domain.onramp.models) - implementation(projects.domain.onramp) - implementation(projects.domain.promo) - implementation(projects.domain.promo.models) + implementation(projects.domain.legacy) + implementation(projects.domain.markets.models) + implementation(projects.domain.models) + implementation(projects.domain.networks) implementation(projects.domain.nft) implementation(projects.domain.nft.models) + implementation(projects.domain.onramp) + implementation(projects.domain.onramp.models) + implementation(projects.domain.promo) + implementation(projects.domain.promo.models) + implementation(projects.domain.settings) + implementation(projects.domain.staking) + implementation(projects.domain.staking.models) + implementation(projects.domain.tokens) + implementation(projects.domain.tokens.models) + implementation(projects.domain.txhistory) + implementation(projects.domain.txhistory.models) + implementation(projects.domain.visa) + implementation(projects.domain.wallets) + implementation(projects.domain.wallets.models) //TODO: Create api/impl modules for onboarding [REDACTED_JIRA] implementation(projects.features.onboarding) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt index aab061ab81..419db01ebc 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletWarningsClickIntents.kt @@ -12,6 +12,7 @@ import com.tangem.domain.card.SetCardWasScannedUseCase import com.tangem.domain.feedback.GetCardInfoUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.FeedbackEmailType +import com.tangem.domain.networks.multi.MultiNetworkStatusFetcher import com.tangem.domain.promo.ShouldShowSwapPromoWalletUseCase import com.tangem.domain.redux.LegacyAction import com.tangem.domain.redux.ReduxStateHolder @@ -19,6 +20,7 @@ import com.tangem.domain.settings.NeverToSuggestRateAppUseCase import com.tangem.domain.settings.RemindToRateAppLaterUseCase import com.tangem.domain.tokens.FetchTokenListUseCase import com.tangem.domain.tokens.FetchTokenListUseCase.RefreshMode +import com.tangem.domain.tokens.TokensFeatureToggles import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.analytics.TokenSwapPromoAnalyticsEvent import com.tangem.domain.wallets.legacy.UserWalletsListManager.Lockable.UnlockType @@ -101,6 +103,8 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val seedPhraseNotificationUseCase: SeedPhraseNotificationUseCase, private val urlOpener: UrlOpener, + private val tokensFeatureToggles: TokensFeatureToggles, + private val multiNetworkStatusFetcher: MultiNetworkStatusFetcher, ) : BaseWalletClickIntents(), WalletWarningsClickIntents { override fun onAddBackupCardClick() { @@ -149,12 +153,21 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor( ).fold( ifLeft = { Timber.e(it, "Failed to derive public keys") }, ifRight = { - fetchTokenListUseCase( - userWalletId = userWallet.walletId, - mode = RefreshMode.SKIP_CURRENCIES, - currencies = missedAddressCurrencies, - ).onLeft { - Timber.e("Unable to refresh token list: $it") + if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) { + multiNetworkStatusFetcher( + params = MultiNetworkStatusFetcher.Params( + userWalletId = userWallet.walletId, + networks = missedAddressCurrencies.map(CryptoCurrency::network).toSet(), + ), + ) + } else { + fetchTokenListUseCase( + userWalletId = userWallet.walletId, + mode = RefreshMode.SKIP_CURRENCIES, + currencies = missedAddressCurrencies, + ).onLeft { + Timber.e("Unable to refresh token list: $it") + } } }, ) From 92440eee900538647197995d59ecee66b3bacae8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Apr 2025 18:41:20 +0300 Subject: [PATCH 3/9] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 12 +++++++++--- settings.gradle.kts | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index f33bae32b2..4a299587fa 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -1,9 +1,15 @@ [versions] -tangemBlockchainSdk = "releases-5.23-1007" +# Blockchain SDK, Card SDK and Vico artifacts are built in a private namespace and then published to a +# public Maven repository, so anyone can build the app from source +# https://github.com/tangem/blockchain-sdk-kotlin/packages/ +# https://github.com/tangem/tangem-sdk-android/ +# https://github.com/tangem/vico + +tangemBlockchainSdk = "releases-5.23-1015" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "releases-5.23-452" +tangemCardSdk = "releases-5.23-456" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ -tangemVico = "2.0.0-alpha.25-tangem-developments8" +tangemVico = "2.0.0-alpha.25-tangem12" #tangemVico = "0.0.1" # Keep it! - used for local builds ^ diff --git a/settings.gradle.kts b/settings.gradle.kts index cbcae1d8bb..ddcc0c9bc5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -47,7 +47,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/tangem-sdk-android") + url = uri("https://maven.pkg.github.com/tangem/tangem-sdk-android") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") @@ -56,7 +56,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/blst-android") + url = uri("https://maven.pkg.github.com/tangem/blst-android") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") @@ -65,7 +65,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/blockchain-sdk-kotlin") + url = uri("https://maven.pkg.github.com/tangem/blockchain-sdk-kotlin") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") @@ -74,7 +74,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/wallet-core") + url = uri("https://maven.pkg.github.com/tangem/wallet-core") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") @@ -86,7 +86,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/vico") + url = uri("https://maven.pkg.github.com/tangem/vico") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") @@ -97,7 +97,7 @@ dependencyResolutionManagement { } maven { // setting any repository from tangem project allows maven search all packages in the project - url = uri("https://maven.pkg.github.com/tangem-developments/ic4j-agent") + url = uri("https://maven.pkg.github.com/tangem/ic4j-agent") credentials { username = properties.getProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR") password = properties.getProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN") From e482ab8fdedc366880c4b0d5fc59660a58058fb9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Apr 2025 21:40:32 +0000 Subject: [PATCH 4/9] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 32be17375b..4a299587fa 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -1,9 +1,15 @@ [versions] -tangemBlockchainSdk = "release-app_5.22-997" +# Blockchain SDK, Card SDK and Vico artifacts are built in a private namespace and then published to a +# public Maven repository, so anyone can build the app from source +# https://github.com/tangem/blockchain-sdk-kotlin/packages/ +# https://github.com/tangem/tangem-sdk-android/ +# https://github.com/tangem/vico + +tangemBlockchainSdk = "releases-5.23-1015" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "release-app_5.22-440" +tangemCardSdk = "releases-5.23-456" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ -tangemVico = "2.0.0-alpha.25-tangem-developments8" +tangemVico = "2.0.0-alpha.25-tangem12" #tangemVico = "0.0.1" # Keep it! - used for local builds ^ From ccfc8790996422d0e8497c25aebaf7402a3b8ec2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Apr 2025 12:58:13 +0500 Subject: [PATCH 5/9] Updated on 2026-08-14 --- .../v2/subcomponents/notifications/model/NotificationsModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt index b27fefd5e3..e09d7ef110 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt @@ -366,7 +366,7 @@ internal class NotificationsModel @Inject constructor( }, onCloseClick = { modelScope.launch { - buildNotifications() + sendAmountReduceTrigger.triggerIgnoreReduce() } }, ) From 7d349893403202dcf44d61a4359c0486ae4508aa Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 10 Apr 2025 12:58:21 +0500 Subject: [PATCH 6/9] Updated on 2026-08-14 --- .../v2/send/confirm/model/SendConfirmModel.kt | 4 +- .../amount/model/SendAmountModel.kt | 13 +++++ .../send/v2/subcomponents/fee/SendFeeData.kt | 8 +++ .../subcomponents/fee/SendFeeReloadTrigger.kt | 35 ++++++++----- .../v2/subcomponents/fee/di/SendFeeModule.kt | 28 +++++----- .../subcomponents/fee/model/SendFeeModel.kt | 52 ++++++++++++------- .../notifications/model/NotificationsModel.kt | 10 +++- 7 files changed, 102 insertions(+), 48 deletions(-) create mode 100644 features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeData.kt diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt index e09a1175f2..9d8f6b0816 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/confirm/model/SendConfirmModel.kt @@ -51,6 +51,7 @@ import com.tangem.features.send.v2.send.confirm.ui.state.ConfirmUM import com.tangem.features.send.v2.send.ui.state.ButtonsUM import com.tangem.features.send.v2.send.ui.state.SendUM import com.tangem.features.send.v2.subcomponents.destination.ui.state.DestinationUM +import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadListener import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadTrigger import com.tangem.features.send.v2.subcomponents.fee.model.checkAndCalculateSubtractedAmount import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM @@ -94,6 +95,7 @@ internal class SendConfirmModel @Inject constructor( private val isAmountSubtractAvailableUseCase: IsAmountSubtractAvailableUseCase, private val getTxHistoryItemsUseCase: GetTxHistoryItemsUseCase, private val sendFeeCheckReloadTrigger: SendFeeCheckReloadTrigger, + private val sendFeeCheckReloadListener: SendFeeCheckReloadListener, private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter, private val notificationsUpdateTrigger: NotificationsUpdateTrigger, private val alertFactory: SendConfirmAlertFactory, @@ -445,7 +447,7 @@ internal class SendConfirmModel @Inject constructor( } private fun subscribeOnCheckFeeResultUpdates() { - sendFeeCheckReloadTrigger.checkReloadResultFlow.onEach { isFeeResultSuccess -> + sendFeeCheckReloadListener.checkReloadResultFlow.onEach { isFeeResultSuccess -> if (isFeeResultSuccess) { sendIdleTimer = SystemClock.elapsedRealtime() _uiState.update(SendConfirmSendingStateTransformer(isSending = true)) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index 40b5688362..ce05dce8b0 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -26,6 +26,8 @@ import com.tangem.features.send.v2.subcomponents.amount.SendAmountComponentParam import com.tangem.features.send.v2.subcomponents.amount.SendAmountReduceListener import com.tangem.features.send.v2.subcomponents.amount.analytics.SendAmountAnalyticEvents import com.tangem.features.send.v2.subcomponents.amount.analytics.SendAmountAnalyticEvents.SelectedCurrencyType +import com.tangem.features.send.v2.subcomponents.fee.SendFeeData +import com.tangem.features.send.v2.subcomponents.fee.SendFeeReloadTrigger import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.orZero import com.tangem.utils.isNullOrZero @@ -43,6 +45,7 @@ internal class SendAmountModel @Inject constructor( private val router: Router, private val getMinimumTransactionAmountSyncUseCase: GetMinimumTransactionAmountSyncUseCase, private val sendAmountReduceListener: SendAmountReduceListener, + private val feeReloadTrigger: SendFeeReloadTrigger, private val analyticsEventHandler: AnalyticsEventHandler, ) : Model(), AmountScreenClickIntents { @@ -174,6 +177,11 @@ internal class SendAmountModel @Inject constructor( value = reduceTo, ), ) + feeReloadTrigger.triggerUpdate( + feeData = SendFeeData( + amount = (uiState.value as? AmountState.Data)?.amountTextField?.cryptoAmount?.value, + ), + ) } .launchIn(modelScope) } @@ -188,6 +196,11 @@ internal class SendAmountModel @Inject constructor( value = reduceByData, ), ) + feeReloadTrigger.triggerUpdate( + feeData = SendFeeData( + amount = (uiState.value as? AmountState.Data)?.amountTextField?.cryptoAmount?.value, + ), + ) } .launchIn(modelScope) } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeData.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeData.kt new file mode 100644 index 0000000000..7db1e3d289 --- /dev/null +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeData.kt @@ -0,0 +1,8 @@ +package com.tangem.features.send.v2.subcomponents.fee + +import java.math.BigDecimal + +data class SendFeeData( + val amount: BigDecimal?, + val destinationAddress: String? = null, +) \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeReloadTrigger.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeReloadTrigger.kt index 6502eb6fa2..369baf924e 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeReloadTrigger.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/SendFeeReloadTrigger.kt @@ -8,15 +8,24 @@ import javax.inject.Singleton interface SendFeeReloadTrigger { - /** Flow triggers fee reload */ - val reloadTriggerFlow: Flow - /** Trigger fee update */ - suspend fun triggerUpdate() + suspend fun triggerUpdate(feeData: SendFeeData) +} + +interface SendFeeReloadListener { + /** Flow triggers fee reload */ + val reloadTriggerFlow: Flow } interface SendFeeCheckReloadTrigger { + /** Trigger return callback with check result */ + suspend fun callbackCheckResult(isSuccess: Boolean) + /** Trigger fee check reload */ + suspend fun triggerCheckUpdate() +} + +interface SendFeeCheckReloadListener { /** * Flow triggers fee check reload before transaction. * Usually after significant time after fee was updated last time @@ -25,18 +34,16 @@ interface SendFeeCheckReloadTrigger { /** Flow return result of fee check update */ val checkReloadResultFlow: Flow - - /** Trigger return callback with check result */ - suspend fun callbackCheckResult(isSuccess: Boolean) - - /** Trigger fee check reload */ - suspend fun triggerCheckUpdate() } @Singleton -internal class DefaultSendFeeReloadTrigger @Inject constructor() : SendFeeReloadTrigger, SendFeeCheckReloadTrigger { +internal class DefaultSendFeeReloadTrigger @Inject constructor() : + SendFeeReloadTrigger, + SendFeeReloadListener, + SendFeeCheckReloadTrigger, + SendFeeCheckReloadListener { - private val _reloadTriggerFlow = MutableSharedFlow() + private val _reloadTriggerFlow = MutableSharedFlow() override val reloadTriggerFlow = _reloadTriggerFlow.asSharedFlow() private val _checkReloadTriggerFlow = MutableSharedFlow() @@ -45,8 +52,8 @@ internal class DefaultSendFeeReloadTrigger @Inject constructor() : SendFeeReload private val _checkReloadResultFlow = MutableSharedFlow() override val checkReloadResultFlow = _checkReloadResultFlow.asSharedFlow() - override suspend fun triggerUpdate() { - _reloadTriggerFlow.emit(Unit) + override suspend fun triggerUpdate(feeData: SendFeeData) { + _reloadTriggerFlow.emit(feeData) } override suspend fun triggerCheckUpdate() { diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/di/SendFeeModule.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/di/SendFeeModule.kt index 27cc5cacd4..53f687dcea 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/di/SendFeeModule.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/di/SendFeeModule.kt @@ -1,27 +1,29 @@ package com.tangem.features.send.v2.subcomponents.fee.di -import com.tangem.features.send.v2.subcomponents.fee.DefaultSendFeeReloadTrigger -import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadTrigger -import com.tangem.features.send.v2.subcomponents.fee.SendFeeReloadTrigger +import com.tangem.features.send.v2.subcomponents.fee.* +import dagger.Binds import dagger.Module -import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @InstallIn(SingletonComponent::class) @Module -internal object SendFeeModule { +internal interface SendFeeModule { - @Provides + @Binds @Singleton - fun provideSendFeeReloadTrigger(): SendFeeReloadTrigger { - return DefaultSendFeeReloadTrigger() - } + fun provideSendFeeReloadTrigger(impl: DefaultSendFeeReloadTrigger): SendFeeReloadTrigger - @Provides + @Binds @Singleton - fun provideSendFeeCheckReloadTrigger(): SendFeeCheckReloadTrigger { - return DefaultSendFeeReloadTrigger() - } + fun provideSendFeeReloadListener(impl: DefaultSendFeeReloadTrigger): SendFeeReloadListener + + @Binds + @Singleton + fun provideSendFeeCheckReloadTrigger(impl: DefaultSendFeeReloadTrigger): SendFeeCheckReloadTrigger + + @Binds + @Singleton + fun provideSendFeeCheckReloadListener(impl: DefaultSendFeeReloadTrigger): SendFeeCheckReloadListener } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/model/SendFeeModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/model/SendFeeModel.kt index 0b53128a92..6f2014fce0 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/model/SendFeeModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/fee/model/SendFeeModel.kt @@ -14,9 +14,10 @@ import com.tangem.domain.transaction.usecase.IsFeeApproximateUseCase import com.tangem.features.send.v2.common.NavigationUM import com.tangem.features.send.v2.impl.R import com.tangem.features.send.v2.send.ui.state.ButtonsUM +import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadListener import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadTrigger import com.tangem.features.send.v2.subcomponents.fee.SendFeeComponentParams -import com.tangem.features.send.v2.subcomponents.fee.SendFeeReloadTrigger +import com.tangem.features.send.v2.subcomponents.fee.SendFeeReloadListener import com.tangem.features.send.v2.subcomponents.fee.analytics.SendFeeAnalyticEvents import com.tangem.features.send.v2.subcomponents.fee.analytics.SendFeeAnalyticEvents.GasPriceInserter import com.tangem.features.send.v2.subcomponents.fee.model.transformers.* @@ -29,6 +30,7 @@ import com.tangem.utils.coroutines.saveIn import com.tangem.utils.transformer.update import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import java.math.BigDecimal import java.util.Locale import javax.inject.Inject @@ -44,7 +46,8 @@ internal class SendFeeModel @Inject constructor( private val urlOpener: UrlOpener, private val analyticsEventHandler: AnalyticsEventHandler, private val sendFeeAlertFactory: SendFeeAlertFactory, - private val feeReloadTrigger: SendFeeReloadTrigger, + private val feeReloadListener: SendFeeReloadListener, + private val feeCheckReloadListener: SendFeeCheckReloadListener, private val feeCheckReloadTrigger: SendFeeCheckReloadTrigger, ) : Model(), SendFeeClickIntents { @@ -65,14 +68,19 @@ internal class SendFeeModel @Inject constructor( subscribeOnFeeReloadTriggerUpdates() subscribeOnFeeCheckReloadTriggerUpdates() initialState() - loadFee() + feeReload() } fun updateState(state: FeeUM) { _uiState.value = state } - override fun feeReload() = loadFee() + override fun feeReload() { + loadFee( + amountValue = params.sendAmount, + destinationAddress = params.destinationAddress, + ) + } override fun onFeeSelectorClick(feeType: FeeType) { _uiState.update( @@ -152,13 +160,18 @@ internal class SendFeeModel @Inject constructor( } private fun subscribeOnFeeReloadTriggerUpdates() { - feeReloadTrigger.reloadTriggerFlow - .onEach { feeReload() } + feeReloadListener.reloadTriggerFlow + .onEach { (amount, destination) -> + loadFee( + amountValue = amount ?: params.sendAmount, + destinationAddress = destination ?: params.destinationAddress, + ) + } .launchIn(modelScope) } private fun subscribeOnFeeCheckReloadTriggerUpdates() { - feeCheckReloadTrigger.checkReloadTriggerFlow + feeCheckReloadListener.checkReloadTriggerFlow .onEach { checkLoadFee() } .launchIn(modelScope) } @@ -175,13 +188,18 @@ internal class SendFeeModel @Inject constructor( params.callback.onFeeResult(uiState.value) } - private fun loadFee() { + private fun loadFee(amountValue: BigDecimal, destinationAddress: String) { modelScope.launch { val isShowLoading = (uiState.value as? FeeUM.Content)?.feeSelectorUM !is FeeSelectorUM.Content if (isShowLoading) { _uiState.update(SendFeeLoadingTransformer) } - callFeeUseCase().fold( + getFeeUseCase.invoke( + amount = amountValue, + destination = destinationAddress, + userWallet = params.userWallet, + cryptoCurrency = cryptoCurrencyStatus.currency, + ).fold( ifRight = { _uiState.update( SendFeeLoadedTransformer( @@ -206,7 +224,12 @@ internal class SendFeeModel @Inject constructor( private fun checkLoadFee() { modelScope.launch { - callFeeUseCase().fold( + getFeeUseCase.invoke( + amount = params.sendAmount, + destination = params.destinationAddress, + userWallet = params.userWallet, + cryptoCurrency = cryptoCurrencyStatus.currency, + ).fold( ifRight = { sendFeeAlertFactory.getFeeUpdatedAlert( newFee = it, @@ -236,20 +259,13 @@ internal class SendFeeModel @Inject constructor( ifLeft = { feeError -> feeCheckReloadTrigger.callbackCheckResult(false) _uiState.update(SendFeeFailedTransformer(feeError)) - sendFeeAlertFactory.getFeeUnreachableErrorState(::loadFee) + sendFeeAlertFactory.getFeeUnreachableErrorState(::feeReload) updateFeeNotifications() }, ) }.saveIn(feeJobHolder) } - private suspend fun callFeeUseCase() = getFeeUseCase.invoke( - amount = params.sendAmount, - destination = params.destinationAddress, - userWallet = params.userWallet, - cryptoCurrency = cryptoCurrencyStatus.currency, - ) - private fun isFeeApproximate(amountType: AmountType): Boolean { val networkId = feeCryptoCurrencyStatus.currency.network.id return isFeeApproximateUseCase( diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt index e09d7ef110..6775e4a9b6 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt @@ -32,6 +32,7 @@ import com.tangem.domain.tokens.model.warnings.CryptoCurrencyCheck import com.tangem.domain.transaction.usecase.ValidateTransactionUseCase import com.tangem.domain.utils.convertToSdkAmount import com.tangem.features.send.v2.subcomponents.amount.SendAmountReduceTrigger +import com.tangem.features.send.v2.subcomponents.fee.SendFeeData import com.tangem.features.send.v2.subcomponents.fee.SendFeeReloadTrigger import com.tangem.features.send.v2.subcomponents.fee.model.checkAndCalculateSubtractedAmount import com.tangem.features.send.v2.subcomponents.fee.model.checkFeeCoverage @@ -52,7 +53,7 @@ import kotlinx.coroutines.launch import java.math.BigDecimal import javax.inject.Inject -@Suppress("LongParameterList") +@Suppress("LongParameterList", "LargeClass") @Stable @ModelScoped internal class NotificationsModel @Inject constructor( @@ -129,7 +130,12 @@ internal class NotificationsModel @Inject constructor( feeError = feeError, onReload = { modelScope.launch { - sendFeeReloadTrigger.triggerUpdate() + sendFeeReloadTrigger.triggerUpdate( + feeData = SendFeeData( + amount = amountValue, + destinationAddress = destinationAddress, + ), + ) } }, onClick = ::showTokenDetails, From 2c09ed0a59ffc3514f06930026ba5c87992a0a86 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 14 Apr 2025 09:51:09 +0500 Subject: [PATCH 7/9] Updated on 2026-08-14 --- .../com/tangem/features/txhistory/utils/TxHistoryUiManager.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/utils/TxHistoryUiManager.kt b/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/utils/TxHistoryUiManager.kt index 2f4aba1080..c04a88819e 100644 --- a/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/utils/TxHistoryUiManager.kt +++ b/features/txhistory/impl/src/main/kotlin/com/tangem/features/txhistory/utils/TxHistoryUiManager.kt @@ -6,12 +6,14 @@ import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.features.txhistory.converter.TxHistoryItemToTransactionStateConverter import com.tangem.features.txhistory.entity.TxHistoryUM import com.tangem.pagination.Batch +import com.tangem.pagination.PaginationStatus import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.mapLatest import java.util.UUID @@ -23,6 +25,8 @@ internal class TxHistoryUiManager( @OptIn(ExperimentalCoroutinesApi::class) val items: Flow> = state + // filter initial states, since we dont emit loading items as UI items + .filter { it.status !is PaginationStatus.None && it.status !is PaginationStatus.InitialLoading } .mapLatest { state -> state.uiBatches.asSequence() .flatMap { it.data } From 0f297405cef07abede49f69e8fa8a8c16335a90a Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 14 Apr 2025 04:51:33 +0000 Subject: [PATCH 8/9] Updated on 2026-08-14 --- gradle/tangem_dependencies.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/tangem_dependencies.toml b/gradle/tangem_dependencies.toml index 4a299587fa..884ee07a79 100644 --- a/gradle/tangem_dependencies.toml +++ b/gradle/tangem_dependencies.toml @@ -5,9 +5,9 @@ # https://github.com/tangem/tangem-sdk-android/ # https://github.com/tangem/vico -tangemBlockchainSdk = "releases-5.23-1015" +tangemBlockchainSdk = "develop-1014" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds -tangemCardSdk = "releases-5.23-456" +tangemCardSdk = "develop-455" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^ tangemVico = "2.0.0-alpha.25-tangem12" #tangemVico = "0.0.1" # Keep it! - used for local builds ^ From fac23bd05d304dee828ff39eca36063d27ccd288 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 14 Apr 2025 12:48:17 +0300 Subject: [PATCH 9/9] Updated on 2026-08-14 --- .../send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt | 4 +++- .../subcomponents/notifications/model/NotificationsModel.kt | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt index 95cc3bb76a..1adf375c6e 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/confirm/model/NFTSendConfirmModel.kt @@ -27,6 +27,7 @@ import com.tangem.features.send.v2.sendnft.confirm.model.transformers.NFTSendCon import com.tangem.features.send.v2.sendnft.confirm.model.transformers.NFTSendConfirmationNotificationsTransformer import com.tangem.features.send.v2.sendnft.ui.state.NFTSendUM import com.tangem.features.send.v2.subcomponents.destination.ui.state.DestinationUM +import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadListener import com.tangem.features.send.v2.subcomponents.fee.SendFeeCheckReloadTrigger import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeSelectorUM import com.tangem.features.send.v2.subcomponents.fee.ui.state.FeeUM @@ -50,6 +51,7 @@ internal class NFTSendConfirmModel @Inject constructor( private val neverShowTapHelpUseCase: NeverShowTapHelpUseCase, private val notificationsUpdateTrigger: NotificationsUpdateTrigger, private val sendFeeCheckReloadTrigger: SendFeeCheckReloadTrigger, + private val sendFeeCheckReloadListener: SendFeeCheckReloadListener, private val urlOpener: UrlOpener, private val shareManager: ShareManager, private val analyticsEventHandler: AnalyticsEventHandler, @@ -219,7 +221,7 @@ internal class NFTSendConfirmModel @Inject constructor( // } private fun subscribeOnCheckFeeResultUpdates() { - sendFeeCheckReloadTrigger.checkReloadResultFlow.onEach { isFeeResultSuccess -> + sendFeeCheckReloadListener.checkReloadResultFlow.onEach { isFeeResultSuccess -> if (isFeeResultSuccess) { sendIdleTimer = SystemClock.elapsedRealtime() _uiState.update(NFTSendConfirmSendingStateTransformer(isSending = true)) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt index 3fc7b11551..127a253df0 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/notifications/model/NotificationsModel.kt @@ -119,8 +119,8 @@ internal class NotificationsModel @Inject constructor( modelScope.launch { sendFeeReloadTrigger.triggerUpdate( feeData = SendFeeData( - amount = amountValue, - destinationAddress = destinationAddress, + amount = notificationData.amountValue, + destinationAddress = notificationData.destinationAddress, ), ) }