diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/models/SupportBlockchainType.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/models/SupportBlockchainType.kt new file mode 100644 index 0000000000..27215046bd --- /dev/null +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/models/SupportBlockchainType.kt @@ -0,0 +1,6 @@ +package com.tangem.tap.features.customtoken.impl.presentation.models + +internal enum class SupportBlockchainType { + + SUPPORTED, UNSUPPORTED, UNABLE_TO_DETERMINE +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt index 4444aeea64..1c016c4993 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/CustomTokenRouter.kt @@ -20,4 +20,6 @@ internal interface CustomTokenRouter { * @param blockchain blockchain to show alert */ fun openUnsupportedNetworkAlert(blockchain: Blockchain) + + fun showGenericErrorAlertAndPopBack() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt index af1ebb8795..6391cc840f 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt @@ -27,4 +27,13 @@ internal class DefaultCustomTokenRouter : CustomTokenRouter { ) store.dispatchDialogShow(alert) } + + override fun showGenericErrorAlertAndPopBack() { + val alert = AppDialog.SimpleOkDialogRes( + headerId = R.string.common_error, + messageId = R.string.common_unknown_error, + onOk = { store.dispatch(NavigationAction.PopBackTo()) }, + ) + store.dispatchDialogShow(alert) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt index b15a5fdee5..9fdc0581da 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt @@ -697,14 +697,19 @@ internal class AddCustomTokenViewModel @Inject constructor( return derivationNetwork.derivationPath(derivationStyle) } - private fun isUnsupportedBlockchain(blockchain: Blockchain): Boolean { + private fun getSupportBlockchainType(blockchain: Blockchain): SupportBlockchainType { return getSelectedWalletSyncUseCase().fold( - ifLeft = { false }, + ifLeft = { SupportBlockchainType.UNABLE_TO_DETERMINE }, ifRight = { - !it.scanResponse.card.canHandleBlockchain( + val canHandleBlockchain = it.scanResponse.card.canHandleBlockchain( blockchain = blockchain, cardTypesResolver = it.scanResponse.cardTypesResolver, ) + if (canHandleBlockchain) { + SupportBlockchainType.SUPPORTED + } else { + SupportBlockchainType.UNSUPPORTED + } }, ) } @@ -824,9 +829,18 @@ internal class AddCustomTokenViewModel @Inject constructor( fun onAddCustomTokenClick() { if (!isNetworkSelected()) return val blockchain = uiState.form.networkSelectorField.selectedItem.blockchain - if (isUnsupportedBlockchain(blockchain)) { - featureRouter.openUnsupportedNetworkAlert(blockchain) - return + when (getSupportBlockchainType(blockchain)) { + SupportBlockchainType.SUPPORTED -> { + /* no-op */ + } + SupportBlockchainType.UNSUPPORTED -> { + featureRouter.openUnsupportedNetworkAlert(blockchain) + return + } + SupportBlockchainType.UNABLE_TO_DETERMINE -> { + featureRouter.showGenericErrorAlertAndPopBack() + return + } } val currency = when (getCustomTokenType()) { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt index 15f39a8914..27418f3d01 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt @@ -50,6 +50,15 @@ internal class DefaultTokensListRouter : TokensListRouter { store.dispatchDialogShow(alert) } + override fun showGenericErrorAlertAndPopBack() { + val alert = AppDialog.SimpleOkDialogRes( + headerId = R.string.common_error, + messageId = R.string.common_unknown_error, + onOk = { store.dispatch(NavigationAction.PopBackTo()) }, + ) + store.dispatchDialogShow(alert) + } + override fun openNetworkTokensNotSupportAlert(networkName: String) { store.dispatchDialogShow( AppDialog.SimpleOkDialogRes( diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt index 8347f59a2e..34b5379b48 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/TokensListRouter.kt @@ -36,6 +36,8 @@ internal interface TokensListRouter { */ fun openUnsupportedNetworkAlert(blockchain: Blockchain) + fun showGenericErrorAlertAndPopBack() + /** * Open alert with unsupported networks tokens error */ diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt index 2464c82a17..0fa1976240 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt @@ -29,6 +29,7 @@ import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase import com.tangem.tap.common.extensions.dispatchWithMain import com.tangem.tap.common.extensions.fullNameWithoutTestnet import com.tangem.tap.common.extensions.getNetworkName +import com.tangem.tap.features.customtoken.impl.presentation.models.SupportBlockchainType import com.tangem.tap.features.tokens.impl.domain.TokensListInteractor import com.tangem.tap.features.tokens.impl.domain.models.Token import com.tangem.tap.features.tokens.impl.domain.models.Token.Network @@ -380,12 +381,18 @@ internal class TokensListViewModel @Inject constructor( toggledNetwork.changeToggleState() } } else { - if (isUnsupportedBlockchain(blockchain)) { - router.openUnsupportedNetworkAlert(blockchain) - } else { - analyticsSender.sendWhenBlockchainAdded(blockchain) - changedBlockchainList.add(blockchain) - toggledNetwork.changeToggleState() + when (getSupportBlockchainType(blockchain)) { + SupportBlockchainType.SUPPORTED -> { + analyticsSender.sendWhenBlockchainAdded(blockchain) + changedBlockchainList.add(blockchain) + toggledNetwork.changeToggleState() + } + SupportBlockchainType.UNSUPPORTED -> { + router.openUnsupportedNetworkAlert(blockchain) + } + SupportBlockchainType.UNABLE_TO_DETERMINE -> { + router.showGenericErrorAlertAndPopBack() + } } } } @@ -469,14 +476,19 @@ internal class TokensListViewModel @Inject constructor( ) } - private fun isUnsupportedBlockchain(blockchain: Blockchain): Boolean { + private fun getSupportBlockchainType(blockchain: Blockchain): SupportBlockchainType { return getSelectedWalletSyncUseCase().fold( - ifLeft = { false }, + ifLeft = { SupportBlockchainType.UNABLE_TO_DETERMINE }, ifRight = { - !it.scanResponse.card.canHandleBlockchain( + val canHandleBlockchain = it.scanResponse.card.canHandleBlockchain( blockchain = blockchain, cardTypesResolver = it.scanResponse.cardTypesResolver, ) + if (canHandleBlockchain) { + SupportBlockchainType.SUPPORTED + } else { + SupportBlockchainType.UNSUPPORTED + } }, ) }