Updated on 2026-08-14

This commit is contained in:
Tangem 2023-12-15 11:52:00 +04:00
parent d64c12eb8e
commit 43c8cb47a4
6 changed files with 99 additions and 62 deletions

View file

@ -1,11 +1,14 @@
package com.tangem.feature.wallet.presentation.wallet.state2
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.event.consumedEvent
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.presentation.wallet.state.components.WalletTopBarConfig
import com.tangem.feature.wallet.presentation.wallet.state2.model.NOT_INITIALIZED_WALLET_INDEX
import com.tangem.feature.wallet.presentation.wallet.state2.model.WalletScreenState
import com.tangem.feature.wallet.presentation.wallet.state2.model.WalletState
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.CloseBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.OpenBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.WalletScreenStateTransformer
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.MutableStateFlow
@ -47,6 +50,16 @@ internal class WalletStateController @Inject constructor() {
return with(value) { wallets[selectedWalletIndex].walletCardState.id }
}
fun showBottomSheet(content: TangemBottomSheetConfigContent, userWalletId: UserWalletId = getSelectedWalletId()) {
update(
OpenBottomSheetTransformer(
userWalletId = userWalletId,
content = content,
onDismissBottomSheet = { update(CloseBottomSheetTransformer(userWalletId)) },
),
)
}
private fun getInitialState(): WalletScreenState {
return WalletScreenState(
onBackClick = {},

View file

@ -1,8 +1,22 @@
package com.tangem.feature.wallet.presentation.wallet.viewmodels.intents
import arrow.core.getOrElse
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
import com.tangem.core.ui.extensions.stringReference
import com.tangem.domain.tokens.GetPrimaryCurrencyStatusUpdatesUseCase
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.presentation.wallet.state.WalletEvent
import com.tangem.feature.wallet.presentation.wallet.state2.WalletStateController
import com.tangem.feature.wallet.presentation.wallet.state2.utils.WalletEventSender
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
internal interface VisaWalletIntents {
@ -12,12 +26,52 @@ internal interface VisaWalletIntents {
fun onBalancesAndLimitsClick()
}
@ViewModelScoped
internal class VisaWalletIntentsImplementor @Inject constructor(
private val eventSender: WalletEventSender,
) : VisaWalletIntents {
private val stateController: WalletStateController,
private val getPrimaryCurrencyUseCase: GetPrimaryCurrencyStatusUpdatesUseCase,
private val dispatchers: CoroutineDispatcherProvider,
) : BaseWalletClickIntents(), VisaWalletIntents {
override fun onDepositClick() {
eventSender.send(WalletEvent.ShowToast(stringReference(value = "Not implemented yet")))
val userWalletId = stateController.getSelectedWalletId()
viewModelScope.launch(dispatchers.main) {
val currencyStatus = getPrimaryCurrencyStatus(userWalletId) ?: return@launch
createReceiveBottomSheetContent(currencyStatus)?.let { content ->
stateController.showBottomSheet(content)
}
}
}
private suspend fun getPrimaryCurrencyStatus(userWalletId: UserWalletId): CryptoCurrencyStatus? {
return getPrimaryCurrencyUseCase(userWalletId)
.firstOrNull()
?.getOrElse {
Timber.e("Failed to get primary currency $it")
null
}
}
private fun createReceiveBottomSheetContent(currencyStatus: CryptoCurrencyStatus): TangemBottomSheetConfigContent? {
val currency = currencyStatus.currency
val addresses = currencyStatus.value.networkAddress?.availableAddresses
if (addresses == null) {
Timber.e("Addresses should not be null")
return null
}
return TokenReceiveBottomSheetConfig(
name = currency.name,
symbol = currency.symbol,
network = currency.network.name,
addresses = addresses.mapToAddressModels(currency).toImmutableList(),
onCopyClick = { /* no-op */ },
onShareClick = { /* no-op */ },
)
}
override fun onBalancesAndLimitsClick() {

View file

@ -56,6 +56,7 @@ internal class WalletClickIntentsV2 @Inject constructor(
warningsClickIntentsImplementer.initialize(router, coroutineScope)
currencyActionsClickIntentsImplementor.initialize(router, coroutineScope)
contentClickIntentsImplementor.initialize(router, coroutineScope)
visaWalletIntentsImplementor.initialize(router, coroutineScope)
}
fun onWalletChange(index: Int) {

View file

@ -15,8 +15,6 @@ import com.tangem.feature.wallet.presentation.wallet.analytics.PortfolioEvent
import com.tangem.feature.wallet.presentation.wallet.domain.unwrap
import com.tangem.feature.wallet.presentation.wallet.state.ActionsBottomSheetConfig
import com.tangem.feature.wallet.presentation.wallet.state2.WalletStateController
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.CloseBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.OpenBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.converter.MultiWalletCurrencyActionsConverter
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.hilt.android.scopes.ViewModelScoped
@ -89,21 +87,14 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
}
private fun showActionsBottomSheet(tokenActionsState: TokenActionsState, userWallet: UserWallet) {
stateHolder.update(
OpenBottomSheetTransformer(
userWalletId = userWallet.walletId,
content = ActionsBottomSheetConfig(
actions = MultiWalletCurrencyActionsConverter(
userWallet = userWallet,
clickIntents = currencyActionsClickIntentsImplementor,
).convert(tokenActionsState),
),
onDismissBottomSheet = {
stateHolder.update(
CloseBottomSheetTransformer(userWalletId = userWallet.walletId),
)
},
stateHolder.showBottomSheet(
ActionsBottomSheetConfig(
actions = MultiWalletCurrencyActionsConverter(
userWallet = userWallet,
clickIntents = currencyActionsClickIntentsImplementor,
).convert(tokenActionsState),
),
userWallet.walletId,
)
}

View file

@ -35,7 +35,6 @@ import com.tangem.feature.wallet.presentation.wallet.state.WalletAlertState
import com.tangem.feature.wallet.presentation.wallet.state.WalletEvent
import com.tangem.feature.wallet.presentation.wallet.state2.WalletStateController
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.CloseBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.OpenBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.utils.WalletEventSender
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.hilt.android.scopes.ViewModelScoped
@ -141,22 +140,15 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
event = TokenScreenAnalyticsEvent.ButtonReceive(cryptoCurrencyStatus.currency.symbol),
)
viewModelScope.launch(dispatchers.main) {
analyticsEventHandler.send(event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened)
analyticsEventHandler.send(event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened)
stateHolder.update(
OpenBottomSheetTransformer(
userWalletId = userWalletId,
content = createReceiveBottomSheetContent(
currency = cryptoCurrencyStatus.currency,
addresses = cryptoCurrencyStatus.value.networkAddress?.availableAddresses ?: return@launch,
),
onDismissBottomSheet = {
stateHolder.update(CloseBottomSheetTransformer(userWalletId = userWalletId))
},
),
)
}
stateHolder.showBottomSheet(
createReceiveBottomSheetContent(
currency = cryptoCurrencyStatus.currency,
addresses = cryptoCurrencyStatus.value.networkAddress?.availableAddresses ?: return,
),
userWalletId,
)
}
private fun createReceiveBottomSheetContent(
@ -350,25 +342,18 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
addresses: Set<NetworkAddress.Address>,
currency: CryptoCurrency,
) {
stateHolder.update(
OpenBottomSheetTransformer(
userWalletId = userWalletId,
content = ChooseAddressBottomSheetConfig(
addressModels = addresses.mapToAddressModels(currency).toImmutableList(),
onClick = {
onAddressTypeSelected(
userWalletId = userWalletId,
currency = currency,
addressModel = it,
)
},
),
onDismissBottomSheet = {
stateHolder.update(
CloseBottomSheetTransformer(userWalletId = userWalletId),
stateHolder.showBottomSheet(
ChooseAddressBottomSheetConfig(
addressModels = addresses.mapToAddressModels(currency).toImmutableList(),
onClick = {
onAddressTypeSelected(
userWalletId = userWalletId,
currency = currency,
addressModel = it,
)
},
),
userWalletId,
)
}

View file

@ -34,7 +34,6 @@ import com.tangem.feature.wallet.presentation.wallet.state.WalletAlertState
import com.tangem.feature.wallet.presentation.wallet.state.WalletEvent
import com.tangem.feature.wallet.presentation.wallet.state2.WalletStateController
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.CloseBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.OpenBottomSheetTransformer
import com.tangem.feature.wallet.presentation.wallet.state2.utils.WalletEventSender
import com.tangem.operations.derivation.ExtendedPublicKeysMap
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -212,17 +211,11 @@ internal class WalletWarningsClickIntentsImplementer @Inject constructor(
class DerivationData(val derivations: Pair<ByteArrayKey, List<DerivationPath>>)
override fun onOpenUnlockWalletsBottomSheetClick() {
stateHolder.update(
OpenBottomSheetTransformer(
content = requireNotNull(stateHolder.getSelectedWallet().bottomSheetConfig).content,
userWalletId = stateHolder.getSelectedWalletId(),
onDismissBottomSheet = {
stateHolder.update(
CloseBottomSheetTransformer(userWalletId = stateHolder.getSelectedWalletId()),
)
},
),
)
val config = requireNotNull(stateHolder.getSelectedWallet().bottomSheetConfig) {
"Impossible to open unlock wallet bottom sheet if it's null"
}
stateHolder.showBottomSheet(config.content)
}
override fun onUnlockWalletClick() {