From 8523e137e98a5f3d45bab80e3f8f942cd93b572e Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 30 Jan 2025 15:13:26 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../transformers/RenameWalletTransformer.kt | 32 ----------- .../transformers/RenameWalletsTransformer.kt | 53 +++++++++++++++++++ .../wallet/viewmodels/WalletViewModel.kt | 4 +- .../viewmodels/WalletsUpdateActionResolver.kt | 46 ++++++++++++---- 4 files changed, 92 insertions(+), 43 deletions(-) delete mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletTransformer.kt create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletTransformer.kt deleted file mode 100644 index f0b5cf9e20..0000000000 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletTransformer.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.tangem.feature.wallet.presentation.wallet.state.transformers - -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState -import timber.log.Timber - -internal class RenameWalletTransformer( - userWalletId: UserWalletId, - private val newName: String, -) : WalletStateTransformer(userWalletId) { - - override fun transform(prevState: WalletState): WalletState { - return when (prevState) { - is WalletState.MultiCurrency.Content -> { - prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) - } - is WalletState.SingleCurrency.Content -> { - prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) - } - is WalletState.Visa.Content -> { - prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) - } - is WalletState.MultiCurrency.Locked, - is WalletState.SingleCurrency.Locked, - is WalletState.Visa.Locked, - -> { - Timber.e("Impossible to rename wallet in locked state") - prevState - } - } - } -} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt new file mode 100644 index 0000000000..9dd8ccb8f9 --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/RenameWalletsTransformer.kt @@ -0,0 +1,53 @@ +package com.tangem.feature.wallet.presentation.wallet.state.transformers + +import com.tangem.domain.wallets.models.UserWallet +import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState +import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState +import kotlinx.collections.immutable.toImmutableList +import timber.log.Timber + +/** + * Transformer that renames wallets + * + * @property renamedWallets renamed wallets + */ +internal class RenameWalletsTransformer( + private val renamedWallets: List, +) : WalletScreenStateTransformer { + + override fun transform(prevState: WalletScreenState): WalletScreenState { + return prevState.copy( + wallets = prevState.wallets.map { walletState -> + val renamedWallet = renamedWallets.firstOrNull { it.walletId == walletState.walletCardState.id } + + if (renamedWallet != null) { + transform(prevState = walletState, newName = renamedWallet.name) + } else { + walletState + } + } + .toImmutableList(), + ) + } + + private fun transform(prevState: WalletState, newName: String): WalletState { + return when (prevState) { + is WalletState.MultiCurrency.Content -> { + prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) + } + is WalletState.SingleCurrency.Content -> { + prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) + } + is WalletState.Visa.Content -> { + prevState.copy(walletCardState = prevState.walletCardState.copySealed(title = newName)) + } + is WalletState.MultiCurrency.Locked, + is WalletState.SingleCurrency.Locked, + is WalletState.Visa.Locked, + -> { + Timber.e("Impossible to rename wallet in locked state") + prevState + } + } + } +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 1d56ea3290..f06a3d46c4 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -308,8 +308,8 @@ internal class WalletViewModel @Inject constructor( ), ) } - is WalletsUpdateActionResolver.Action.UpdateWalletName -> { - stateHolder.update(transformer = RenameWalletTransformer(action.selectedWalletId, action.name)) + is WalletsUpdateActionResolver.Action.RenameWallets -> { + stateHolder.update(transformer = RenameWalletsTransformer(renamedWallets = action.renamedWallets)) } is WalletsUpdateActionResolver.Action.Unknown -> { Timber.w("Unable to perform action: $action") diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolver.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolver.kt index 324b2fc7ca..2328a63d3c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolver.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletsUpdateActionResolver.kt @@ -67,6 +67,9 @@ internal class WalletsUpdateActionResolver @Inject constructor( selectedWallet = selectedWallet, ) } + isAnyWalletNameChanged(state, wallets) -> { + getRenameWalletsAction(state, wallets) + } else -> getUpdateSelectedWalletAction(state, wallets, selectedWallet) } } @@ -121,15 +124,35 @@ internal class WalletsUpdateActionResolver @Inject constructor( return state.getPrevSelectedWallet().id != selectedWallet.walletId } + private fun isAnyWalletNameChanged(state: WalletScreenState, wallets: List): Boolean { + val prevWallets = state.wallets.map { it.walletCardState.id to it.walletCardState.title } + val newWallets = wallets.map { it.walletId to it.name } + + val prevWalletsIds = prevWallets.map { it.first } + val newWalletsIds = newWallets.map { it.first } + + val isAnyNameChanged = (newWallets - prevWallets.toSet()).isNotEmpty() + + return prevWalletsIds != newWalletsIds && isAnyNameChanged + } + + private fun getRenameWalletsAction(state: WalletScreenState, wallets: List): Action.RenameWallets { + val prevWallets = state.wallets.map { it.walletCardState.id to it.walletCardState.title } + val newWallets = wallets.map { it.walletId to it.name } + + val renamedWallets = newWallets - prevWallets.toSet() + + return Action.RenameWallets( + renamedWallets = wallets.filter { wallet -> renamedWallets.any { it.first == wallet.walletId } }, + ) + } + private fun getUpdateSelectedWalletAction( state: WalletScreenState, wallets: List, selectedWallet: UserWallet, ): Action { return when { - isSelectedWalletNameChanged(state, selectedWallet) -> { - Action.UpdateWalletName(selectedWalletId = selectedWallet.walletId, name = selectedWallet.name) - } isSelectedWalletUnlocked(state, selectedWallet) -> { Action.UnlockWallet( selectedWallet = selectedWallet, @@ -143,10 +166,6 @@ internal class WalletsUpdateActionResolver @Inject constructor( } } - private fun isSelectedWalletNameChanged(state: WalletScreenState, selectedWallet: UserWallet): Boolean { - return state.getPrevSelectedWallet().title != selectedWallet.name - } - private fun isSelectedWalletUnlocked(state: WalletScreenState, selectedWallet: UserWallet): Boolean { return state.isSelectedWalletLocked() && !selectedWallet.isLocked } @@ -215,10 +234,19 @@ internal class WalletsUpdateActionResolver @Inject constructor( } } - data class UpdateWalletName(val selectedWalletId: UserWalletId, val name: String) : Action() { + /** + * Rename wallets + * + * @property renamedWallets renamed wallets + */ + data class RenameWallets(val renamedWallets: List) : Action() { override fun toString(): String { - return "UpdateWalletName(selectedWalletId = $selectedWalletId, name = $name)" + return """ + RenameWallets( + renamedWallets = ${renamedWallets.joinToString { it.walletId.toString() }} + ) + """.trimIndent() } }