Updated on 2026-08-14

This commit is contained in:
Tangem 2025-01-30 15:13:26 +03:00
parent e22349c6e3
commit 8523e137e9
4 changed files with 92 additions and 43 deletions

View file

@ -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
}
}
}
}

View file

@ -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<UserWallet>,
) : 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
}
}
}
}

View file

@ -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")

View file

@ -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<UserWallet>): 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<UserWallet>): 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<UserWallet>,
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<UserWallet>) : Action() {
override fun toString(): String {
return "UpdateWalletName(selectedWalletId = $selectedWalletId, name = $name)"
return """
RenameWallets(
renamedWallets = ${renamedWallets.joinToString { it.walletId.toString() }}
)
""".trimIndent()
}
}