diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state2/WalletStateController.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state2/WalletStateController.kt index 0d959ba38b..8002fef454 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state2/WalletStateController.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state2/WalletStateController.kt @@ -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 = {}, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/VisaWalletIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/VisaWalletIntents.kt index 8c59693e18..f9860215e1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/VisaWalletIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/VisaWalletIntents.kt @@ -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() { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletClickIntentsV2.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletClickIntentsV2.kt index 7ea396e96d..f6f2ce1e0f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletClickIntentsV2.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletClickIntentsV2.kt @@ -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) { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt index 99ae15c6b3..6768550c5a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletContentClickIntents.kt @@ -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, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletCurrencyActionsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletCurrencyActionsClickIntents.kt index b4cdcf340d..192ff6d7ab 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletCurrencyActionsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletCurrencyActionsClickIntents.kt @@ -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, 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, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt index 1efbeaba58..b433801e19 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletWarningsClickIntents.kt @@ -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>) 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() {