diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkStatusFactory.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkStatusFactory.kt index dd60f99866..8c55506020 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkStatusFactory.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkStatusFactory.kt @@ -26,6 +26,7 @@ internal class NetworkStatusFactory { is UpdateWalletManagerResult.NoAccount -> NetworkStatus.NoAccount( address = getNetworkAddress(result.defaultAddress, result.addresses), amountToCreateAccount = result.amountToCreateAccount, + errorMessage = result.errorMessage, ) is UpdateWalletManagerResult.Verified -> NetworkStatus.Verified( address = getNetworkAddress(result.defaultAddress, result.addresses), diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index bf2e77df79..1155237c4e 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -180,7 +180,7 @@ class DefaultWalletManagersFacade( resultFactory.getResult(walletManager) } catch (e: BlockchainSdkError.AccountNotFound) { - resultFactory.getNoAccountResult(walletManager) + resultFactory.getNoAccountResult(walletManager = walletManager, customMessage = e.customMessage) } catch (e: Throwable) { Timber.w(e, "Unable to update a wallet manager for: ${walletManager.wallet.blockchain}") diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/model/UpdateWalletManagerResult.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/model/UpdateWalletManagerResult.kt index 4ad842a7dd..ae14d752e1 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/model/UpdateWalletManagerResult.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/model/UpdateWalletManagerResult.kt @@ -19,5 +19,6 @@ sealed class UpdateWalletManagerResult { val defaultAddress: String, val addresses: Set, val amountToCreateAccount: BigDecimal, + val errorMessage: String, ) : UpdateWalletManagerResult() } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/UpdateWalletManagerResultFactory.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/UpdateWalletManagerResultFactory.kt index 874e412e3f..3cd76649cd 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/UpdateWalletManagerResultFactory.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/UpdateWalletManagerResultFactory.kt @@ -37,7 +37,7 @@ internal class UpdateWalletManagerResultFactory { ) } - fun getNoAccountResult(walletManager: WalletManager): UpdateWalletManagerResult { + fun getNoAccountResult(walletManager: WalletManager, customMessage: String): UpdateWalletManagerResult { val wallet = walletManager.wallet val blockchain = wallet.blockchain val firstWalletToken = wallet.getTokens().firstOrNull() @@ -51,6 +51,7 @@ internal class UpdateWalletManagerResultFactory { defaultAddress = wallet.address, addresses = getAvailableAddresses(wallet.addresses), amountToCreateAccount = amountToCreateAccount, + errorMessage = customMessage, ) } } diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrencyStatus.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrencyStatus.kt index a838b45b10..c09cdcd3cc 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrencyStatus.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrencyStatus.kt @@ -59,8 +59,18 @@ data class CryptoCurrencyStatus( /** Represents a state where the cryptocurrency's derivation is missed. */ object MissedDerivation : Status(isError = true) - /** Represents a state where there is no account associated with the cryptocurrency. */ - object NoAccount : Status(isError = false) + /** + * Represents a state where there is no account associated with the cryptocurrency + * + * @property errorMessage error message + */ + data class NoAccount(val errorMessage: String) : Status(isError = false) { + + override val amount: BigDecimal = BigDecimal.ZERO + override val fiatAmount: BigDecimal = BigDecimal.ZERO + override val fiatRate: BigDecimal = BigDecimal.ZERO + override val priceChange: BigDecimal = BigDecimal.ZERO + } /** * Represents a Loaded state of a cryptocurrency with complete information. diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/NetworkStatus.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/NetworkStatus.kt index 97838a8889..45f8faf7d8 100644 --- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/NetworkStatus.kt +++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/NetworkStatus.kt @@ -51,9 +51,11 @@ data class NetworkStatus( * * @property address Network addresses. * @property amountToCreateAccount The amount required to create an account within the network. + * @property errorMessage error message */ data class NoAccount( val address: NetworkAddress, val amountToCreateAccount: BigDecimal, + val errorMessage: String, ) : Status() } \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt index 90687996b9..b3f38c96b4 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/operations/CurrencyStatusOperations.kt @@ -20,7 +20,7 @@ internal class CurrencyStatusOperations( null -> CryptoCurrencyStatus.Loading is NetworkStatus.MissedDerivation -> CryptoCurrencyStatus.MissedDerivation is NetworkStatus.Unreachable -> CryptoCurrencyStatus.Unreachable - is NetworkStatus.NoAccount -> CryptoCurrencyStatus.NoAccount + is NetworkStatus.NoAccount -> CryptoCurrencyStatus.NoAccount(errorMessage = status.errorMessage) is NetworkStatus.Verified -> createStatus(status) } } diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockNetworks.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockNetworks.kt index 78517832f3..8404ce4ed4 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockNetworks.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockNetworks.kt @@ -51,6 +51,7 @@ internal object MockNetworks { value = NetworkStatus.NoAccount( amountToCreateAccount = amountToCreateAccount, address = NetworkAddress.Single(defaultAddress = "mock"), + errorMessage = "", ), ) diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockTokensStates.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockTokensStates.kt index 4dd52cf2a3..2ffefd3f10 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockTokensStates.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/mock/MockTokensStates.kt @@ -39,22 +39,22 @@ internal object MockTokensStates { val tokenState7 = CryptoCurrencyStatus( currency = MockTokens.token7, - value = CryptoCurrencyStatus.NoAccount, + value = CryptoCurrencyStatus.NoAccount(errorMessage = ""), ) val tokenState8 = CryptoCurrencyStatus( currency = MockTokens.token8, - value = CryptoCurrencyStatus.NoAccount, + value = CryptoCurrencyStatus.NoAccount(errorMessage = ""), ) val tokenState9 = CryptoCurrencyStatus( currency = MockTokens.token9, - value = CryptoCurrencyStatus.NoAccount, + value = CryptoCurrencyStatus.NoAccount(errorMessage = ""), ) val tokenState10 = CryptoCurrencyStatus( currency = MockTokens.token10, - value = CryptoCurrencyStatus.NoAccount, + value = CryptoCurrencyStatus.NoAccount(errorMessage = ""), ) val failedTokenStates = nonEmptyListOf( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt index 5a7fc06b24..7d09dfba03 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt @@ -25,10 +25,10 @@ internal class CryptoCurrencyStatusToTokenItemConverter( is CryptoCurrencyStatus.Loaded, is CryptoCurrencyStatus.Custom, is CryptoCurrencyStatus.NoQuote, + is CryptoCurrencyStatus.NoAccount, -> value.mapToTokenItemState() // TODO: Add other token item states, currently not designed is CryptoCurrencyStatus.MissedDerivation, - is CryptoCurrencyStatus.NoAccount, is CryptoCurrencyStatus.Unreachable, is CryptoCurrencyStatus.NoAmount, -> value.mapToUnreachableTokenItemState() diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletNotificationsListFactory.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletNotificationsListFactory.kt index 21de9b5e10..d891658958 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletNotificationsListFactory.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletNotificationsListFactory.kt @@ -159,13 +159,10 @@ internal class WalletNotificationsListFactory( condition = cryptoCurrencyList.hasUnreachableNetworks(), ) - // TODO: [REDACTED_JIRA] - addIf( - element = WalletNotification.Warning.TopUpNote( - errorMessage = "To activate card top up it with at least 1 XLM", - ), - condition = cryptoCurrencyList.hasNoAccountStatus(), - ) + val errorMessage = cryptoCurrencyList.geNoAccountStatusMessage() + if (errorMessage != null) { + add(element = WalletNotification.Warning.TopUpNote(errorMessage = errorMessage)) + } addIf( element = WalletNotification.Warning.NumberOfSignedHashesIncorrect, @@ -182,8 +179,12 @@ internal class WalletNotificationsListFactory( return any { it.value is CryptoCurrencyStatus.Unreachable } } - private fun List.hasNoAccountStatus(): Boolean { - return any { it.value is CryptoCurrencyStatus.NoAccount } + private fun List.geNoAccountStatusMessage(): String? { + return this + .map(CryptoCurrencyStatus::value) + .filterIsInstance() + .firstOrNull() + ?.errorMessage } private fun checkSignedHashes(