diff --git a/app/src/main/java/com/tangem/tap/common/compose/extensions/MutableState.kt b/app/src/main/java/com/tangem/tap/common/compose/extensions/MutableState.kt new file mode 100644 index 0000000000..459086b9c3 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/common/compose/extensions/MutableState.kt @@ -0,0 +1,14 @@ +package com.tangem.tap.common.compose.extensions + +import androidx.compose.runtime.MutableState + +/** +[REDACTED_AUTHOR] + */ +fun MutableState>.addAndNotify(value: T) { + this.value = this.value.toMutableList().apply { add(value) } +} + +fun MutableState>.removeAndNotify(value: T) { + this.value = this.value.toMutableList().apply { remove(value) } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt index 7e1e4bee95..79f171b03f 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensAction.kt @@ -28,8 +28,6 @@ sealed class TokensAction : Action { val wallets: List, val derivationStyle: DerivationStyle? ) : TokensAction() - data class SetNonRemovableCurrencies(val wallets: List) : TokensAction() - data class SaveChanges( val addedTokens: List, val addedBlockchains: List diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt index 374f6ad820..007a1e9711 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensReducer.kt @@ -43,13 +43,6 @@ private fun internalReduce(action: Action, state: AppState): TokensState { derivationStyle = action.derivationStyle ) } - is TokensAction.SetNonRemovableCurrencies -> { - tokensState.copy( - nonRemovableBlockchains = action.wallets.toNonCustomBlockchains(tokensState.derivationStyle), - nonRemovableTokens = action.wallets.toTokensContractAddresses(), - ) - } - is TokensAction.AllowToAddTokens -> { tokensState.copy(allowToAdd = action.allow) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt index 5fcc7510f2..ab1b3731a5 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/redux/TokensState.kt @@ -14,8 +14,6 @@ data class TokensState( val addedWallets: List = emptyList(), val addedTokens: List = emptyList(), val addedBlockchains: List = emptyList(), - val nonRemovableTokens: List = emptyList(), - val nonRemovableBlockchains: List = emptyList(), val currencies: List = emptyList(), val searchInput: String? = null, val allowToAdd: Boolean = true, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt index ef87846c21..18dabc7e87 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt @@ -21,6 +21,8 @@ import com.tangem.blockchain.common.Blockchain import com.tangem.domain.common.TapWorkarounds.useOldStyleDerivation import com.tangem.domain.common.extensions.fromNetworkId import com.tangem.tap.common.compose.Keyboard +import com.tangem.tap.common.compose.extensions.addAndNotify +import com.tangem.tap.common.compose.extensions.removeAndNotify import com.tangem.tap.common.compose.keyboardAsState import com.tangem.tap.common.extensions.dispatchDialogShow import com.tangem.tap.common.extensions.pixelsToDp @@ -30,6 +32,7 @@ import com.tangem.tap.features.tokens.redux.ContractAddress import com.tangem.tap.features.tokens.redux.LoadCoinsState import com.tangem.tap.features.tokens.redux.TokenWithBlockchain import com.tangem.tap.features.tokens.redux.TokensState +import com.tangem.tap.features.wallet.redux.models.WalletDialog import com.tangem.tap.store import com.tangem.wallet.R @@ -40,30 +43,30 @@ fun CurrenciesScreen( onNetworkItemClicked: (ContractAddress) -> Unit, onLoadMore: () -> Unit ) { - val context = LocalContext.current + val tokensAddedOnMainScreen = remember { tokensState.value.addedTokens } + val blockchainsAddedOnMainScreen = remember { tokensState.value.addedBlockchains } + val addedTokensState = remember { mutableStateOf(tokensState.value.addedTokens) } val addedBlockchainsState = remember { mutableStateOf(tokensState.value.addedBlockchains) } val isKeyboardOpen by keyboardAsState() val onAddCurrencyToggleClick = { currency: Currency, token: TokenWithBlockchain? -> - if (token != null) { - val mutableList = addedTokensState.value.toMutableList() - if (mutableList.contains(token)) { - mutableList.remove(token) - } else { - mutableList.add(token) - } - addedTokensState.value = mutableList - } else { - val blockchain = Blockchain.fromNetworkId(currency.id) - val mutableList = addedBlockchainsState.value.toMutableList() - if (mutableList.contains(blockchain)) { - mutableList.remove(blockchain) - } else { - blockchain?.let { mutableList.add(blockchain) } - } - addedBlockchainsState.value = mutableList + val blockchain = Blockchain.fromNetworkId(currency.id) + if (blockchain != null && token == null) { + toggleBlockchain( + blockchain, + blockchainsAddedOnMainScreen, + addedBlockchainsState, + addedTokensState, + ) + } else if (token != null) { + toggleToken( + token, + tokensAddedOnMainScreen, + addedTokensState, + tokensState, + ) } } @@ -100,23 +103,11 @@ fun CurrenciesScreen( ListOfCurrencies( header = { if (showHeader) CurrenciesWarning() }, currencies = tokensState.value.currencies, - nonRemovableTokens = tokensState.value.nonRemovableTokens, - nonRemovableBlockchains = tokensState.value.nonRemovableBlockchains, addedTokens = addedTokensState.value, addedBlockchains = addedBlockchainsState.value, allowToAdd = tokensState.value.allowToAdd, onAddCurrencyToggled = { currency, token -> onAddCurrencyToggleClick(currency, token) - token?.let { - if (!tokensState.value.canHandleToken(it)) { - val dialog = AppDialog.SimpleOkDialog( - header = context.getString(R.string.common_warning), - message = context.getString(R.string.alert_manage_tokens_unsupported_message) - ) { onAddCurrencyToggleClick(currency, it) } - store.dispatchDialogShow(dialog) - } - } - }, onNetworkItemClicked = onNetworkItemClicked, onLoadMore = onLoadMore @@ -127,6 +118,68 @@ fun CurrenciesScreen( } } +private fun toggleBlockchain( + blockchain: Blockchain, + blockchainsAddedOnMainScreen: List, + addedBlockchainsState: MutableState>, + addedTokensState: MutableState> +) { + val isTryingToRemove = addedBlockchainsState.value.contains(blockchain) + val isAddedOnMainScreen = blockchainsAddedOnMainScreen.contains(blockchain) + val isTokenWithSameBlockchainFound = addedTokensState.value.any { it.blockchain == blockchain } + + if (isTryingToRemove) { + if (isTokenWithSameBlockchainFound) { + store.dispatchDialogShow(WalletDialog.TokensAreLinkedDialog( + currencyTitle = blockchain.name, + currencySymbol = blockchain.currency + )) + } else { + if (isAddedOnMainScreen) { + store.dispatchDialogShow(WalletDialog.RemoveWalletDialog( + currencyTitle = blockchain.name, + onOk = { addedBlockchainsState.removeAndNotify(blockchain) } + )) + } else { + addedBlockchainsState.removeAndNotify(blockchain) + } + } + } else { + addedBlockchainsState.addAndNotify(blockchain) + } +} + +private fun toggleToken( + token: TokenWithBlockchain, + tokensAddedOnMainScreen: List, + addedTokensState: MutableState>, + tokensState: MutableState, +) { + val isTryingToRemove = addedTokensState.value.contains(token) + val isAddedOnMainScreen = tokensAddedOnMainScreen.contains(token) + val isUnsupportedToken = !tokensState.value.canHandleToken(token) + + if (isTryingToRemove) { + if (isAddedOnMainScreen) { + store.dispatchDialogShow(WalletDialog.RemoveWalletDialog( + currencyTitle = token.token.name, + onOk = { addedTokensState.removeAndNotify(token) } + )) + } else { + addedTokensState.removeAndNotify(token) + } + } else { + if (isUnsupportedToken) { + store.dispatchDialogShow(AppDialog.SimpleOkDialogRes( + headerId = R.string.common_warning, + messageId = R.string.alert_manage_tokens_unsupported_message, + )) + } else { + addedTokensState.addAndNotify(token) + } + } +} + @Composable fun SaveChangesButton(keyboardState: Keyboard, onSaveChanges: () -> Unit) { diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt index 9fd962bce7..5ba1f8b683 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrencyItem.kt @@ -9,8 +9,6 @@ import com.tangem.tap.features.tokens.redux.TokenWithBlockchain @Composable fun CurrencyItem( currency: Currency, - nonRemovableTokens: List, - nonRemovableBlockchains: List, addedTokens: List, addedBlockchains: List, allowToAdd: Boolean, @@ -22,8 +20,6 @@ fun CurrencyItem( if (expanded) { ExpandedCurrencyItem( currency = currency, - nonRemovableTokens = nonRemovableTokens, - nonRemovableBlockchains = nonRemovableBlockchains, addedTokens = addedTokens, addedBlockchains = addedBlockchains, allowToAdd = allowToAdd, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt index ef8c92c104..cecf873bf9 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ExpandedCurrencyItem.kt @@ -28,8 +28,6 @@ import com.tangem.wallet.R @Composable fun ExpandedCurrencyItem( currency: Currency, - nonRemovableTokens: List, - nonRemovableBlockchains: List, addedTokens: List, addedBlockchains: List, allowToAdd: Boolean, @@ -138,17 +136,12 @@ fun ExpandedCurrencyItem( } else { addedBlockchains.contains(blockchain) } - val canBeRemoved = if (contract.address != null) { - !nonRemovableTokens.contains(contract.address) - } else { - !nonRemovableBlockchains.contains(blockchain) - } NetworkItem( currency = currency, contract = contract, - blockchain = blockchain, allowToAdd = allowToAdd, + blockchain = blockchain, + allowToAdd = allowToAdd, added = added, - canBeRemoved = canBeRemoved, onAddCurrencyToggled = onAddCurrencyToggled, onNetworkItemClicked = onNetworkItemClicked, ) diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt index 4892cf5e13..14f36c1dd4 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/ListOfCurrencies.kt @@ -22,8 +22,6 @@ import com.tangem.tap.features.tokens.redux.TokenWithBlockchain fun ListOfCurrencies( header: @Composable () -> Unit, currencies: List, - nonRemovableTokens: List, - nonRemovableBlockchains: List, addedTokens: List, addedBlockchains: List, allowToAdd: Boolean, @@ -58,8 +56,6 @@ fun ListOfCurrencies( itemsIndexed(currencies) { index, currency -> CurrencyItem( currency = currency, - nonRemovableTokens = nonRemovableTokens, - nonRemovableBlockchains = nonRemovableBlockchains, addedTokens = addedTokens, addedBlockchains = addedBlockchains, allowToAdd = allowToAdd, diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt index 9b75a86359..0f45d867bf 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/NetworkItem.kt @@ -35,9 +35,11 @@ import com.tangem.tap.features.tokens.redux.TokenWithBlockchain @OptIn(ExperimentalFoundationApi::class) @Composable fun NetworkItem( - currency: Currency, contract: Contract, - blockchain: Blockchain, allowToAdd: Boolean, - added: Boolean, canBeRemoved: Boolean, + currency: Currency, + contract: Contract, + blockchain: Blockchain, + allowToAdd: Boolean, + added: Boolean, onAddCurrencyToggled: (Currency, TokenWithBlockchain?) -> Unit, onNetworkItemClicked: (ContractAddress) -> Unit ) { @@ -126,7 +128,6 @@ fun NetworkItem( Switch( checked = added, - enabled = canBeRemoved, onCheckedChange = { onAddCurrencyToggled(currencyToSave, tokenWithBlockchain) }, modifier = Modifier.padding(start = 16.dp, end = 16.dp), colors = SwitchDefaults.colors( diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt index 632fbd34ac..e28ced2f06 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/MultiWalletMiddleware.kt @@ -139,7 +139,6 @@ class MultiWalletMiddleware { } if (action.fromScreen == AppScreen.AddTokens) { store.dispatch(WalletAction.MultiWallet.SelectWallet(null)) - store.dispatch(NavigationAction.PopBackTo()) } } is WalletAction.MultiWallet.ShowWalletBackupWarning -> Unit