Updated on 2026-08-14
This commit is contained in:
parent
e22349c6e3
commit
8523e137e9
4 changed files with 92 additions and 43 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue