Updated on 2026-08-14

This commit is contained in:
Tangem 2023-11-30 10:36:39 +04:00
parent 536dcb4f3e
commit ed5d5b1b33
23 changed files with 269 additions and 187 deletions

View file

@ -19,6 +19,7 @@ import com.tangem.core.navigation.AppScreen
import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
import com.tangem.core.ui.components.transactions.state.TxHistoryState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.WrappedList
@ -42,10 +43,7 @@ import com.tangem.domain.settings.*
import com.tangem.domain.tokens.*
import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.legacy.TradeCryptoAction
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.NetworkGroup
import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.tokens.model.*
import com.tangem.domain.tokens.models.analytics.TokenReceiveAnalyticsEvent
import com.tangem.domain.tokens.models.analytics.TokenScreenAnalyticsEvent
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
@ -689,20 +687,11 @@ internal class WalletViewModel @Inject constructor(
}
override fun onReceiveClick(cryptoCurrencyStatus: CryptoCurrencyStatus) {
val state = uiState as? WalletState.ContentState ?: return
analyticsEventsHandler.send(
event = TokenScreenAnalyticsEvent.ButtonReceive(cryptoCurrencyStatus.currency.symbol),
)
viewModelScope.launch(dispatchers.io) {
val userWallet = getWallet(index = state.walletsListConfig.selectedWalletIndex)
val addresses = walletManagersFacade.getAddress(
userWalletId = userWallet.walletId,
network = cryptoCurrencyStatus.currency.network,
)
analyticsEventsHandler.send(event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened)
val currency = cryptoCurrencyStatus.currency
@ -711,12 +700,11 @@ internal class WalletViewModel @Inject constructor(
name = currency.name,
symbol = currency.symbol,
network = currency.network.name,
addresses = addresses.map {
AddressModel(
value = it.value,
type = AddressModel.Type.valueOf(it.type.name),
)
},
addresses = cryptoCurrencyStatus.value.networkAddress
?.availableAddresses
?.mapToAddressModels(currency)
.orEmpty()
.toImmutableList(),
onCopyClick = {
analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(currency.symbol))
},
@ -821,41 +809,39 @@ internal class WalletViewModel @Inject constructor(
private fun openExplorer() {
val state = uiState as? WalletState.ContentState ?: return
val currency = singleWalletCryptoCurrencyStatus?.currency ?: return
val currencyStatus = singleWalletCryptoCurrencyStatus ?: return
val currency = currencyStatus.currency
viewModelScope.launch(dispatchers.main) {
val userWalletId = getWallet(state.walletsListConfig.selectedWalletIndex).walletId
val addresses = walletManagersFacade.getAddress(userWalletId = userWalletId, network = currency.network)
if (addresses.size == 1) {
router.openUrl(
url = getExploreUrlUseCase(
userWalletId = userWalletId,
currency = currency,
addressType = AddressType.Default,
),
)
} else {
uiState = stateFactory.getStateWithOpenWalletBottomSheet(
ChooseAddressBottomSheetConfig(
addressModels = addresses
.map { address ->
AddressModel(
value = address.value,
type = AddressModel.Type.valueOf(address.type.name),
when (val addresses = currencyStatus.value.networkAddress) {
is NetworkAddress.Selectable -> {
uiState = stateFactory.getStateWithOpenWalletBottomSheet(
ChooseAddressBottomSheetConfig(
addressModels = addresses.availableAddresses
.mapToAddressModels(currency)
.toImmutableList(),
onClick = {
onAddressTypeSelected(
userWalletId = userWalletId,
currency = currency,
addressModel = it,
)
}
.toImmutableList(),
onClick = {
onAddressTypeSelected(
userWalletId = userWalletId,
currency = currency,
addressModel = it,
)
},
),
)
},
),
)
}
is NetworkAddress.Single -> {
router.openUrl(
url = getExploreUrlUseCase(
userWalletId = userWalletId,
currency = currency,
addressType = AddressType.Default,
),
)
}
null -> Unit
}
}
}

View file

@ -1,12 +1,12 @@
package com.tangem.feature.wallet.presentation.wallet.viewmodels.intents
import com.tangem.blockchain.common.address.Address
import com.tangem.blockchain.common.address.AddressType
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
import com.tangem.core.ui.extensions.WrappedList
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
@ -20,6 +20,7 @@ import com.tangem.domain.tokens.RemoveCurrencyUseCase
import com.tangem.domain.tokens.legacy.TradeCryptoAction
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.NetworkAddress
import com.tangem.domain.tokens.models.analytics.TokenReceiveAnalyticsEvent
import com.tangem.domain.tokens.models.analytics.TokenScreenAnalyticsEvent
import com.tangem.domain.walletconnect.WalletConnectActions
@ -141,15 +142,15 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
)
viewModelScope.launch(dispatchers.main) {
val currency = cryptoCurrencyStatus.currency
val addresses = walletManagersFacade.getAddress(userWalletId = userWalletId, network = currency.network)
analyticsEventHandler.send(event = TokenReceiveAnalyticsEvent.ReceiveScreenOpened)
stateHolder.update(
OpenBottomSheetTransformer(
userWalletId = userWalletId,
content = createReceiveBottomSheetContent(currency, addresses),
content = createReceiveBottomSheetContent(
currency = cryptoCurrencyStatus.currency,
addresses = cryptoCurrencyStatus.value.networkAddress?.availableAddresses ?: return@launch,
),
onDismissBottomSheet = {
stateHolder.update(CloseBottomSheetTransformer(userWalletId = userWalletId))
},
@ -160,18 +161,13 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
private fun createReceiveBottomSheetContent(
currency: CryptoCurrency,
addresses: List<Address>,
addresses: Set<NetworkAddress.Address>,
): TangemBottomSheetConfigContent {
return TokenReceiveBottomSheetConfig(
name = currency.name,
symbol = currency.symbol,
network = currency.network.name,
addresses = addresses.map { address ->
AddressModel(
value = address.value,
type = AddressModel.Type.valueOf(address.type.name),
)
},
addresses = addresses.mapToAddressModels(currency).toImmutableList(),
onCopyClick = {
analyticsEventHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(currency.symbol))
},
@ -329,40 +325,36 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
val userWalletId = stateHolder.getSelectedWalletId()
viewModelScope.launch(dispatchers.main) {
val currency = getPrimaryCurrencyStatusUpdatesUseCase.unwrap(userWalletId)?.currency ?: return@launch
val addresses = walletManagersFacade.getAddress(userWalletId = userWalletId, network = currency.network)
val currencyStatus = getPrimaryCurrencyStatusUpdatesUseCase.unwrap(userWalletId) ?: return@launch
if (addresses.size == 1) {
router.openUrl(
url = getExploreUrlUseCase(
userWalletId = userWalletId,
currency = currency,
addressType = AddressType.Default,
),
)
} else {
showChooseAddressBottomSheet(userWalletId, addresses, currency)
when (val addresses = currencyStatus.value.networkAddress) {
is NetworkAddress.Selectable -> {
showChooseAddressBottomSheet(userWalletId, addresses.availableAddresses, currencyStatus.currency)
}
is NetworkAddress.Single -> {
router.openUrl(
url = getExploreUrlUseCase(
userWalletId = userWalletId,
currency = currencyStatus.currency,
addressType = AddressType.Default,
),
)
}
null -> Unit
}
}
}
private fun showChooseAddressBottomSheet(
userWalletId: UserWalletId,
addresses: List<Address>,
addresses: Set<NetworkAddress.Address>,
currency: CryptoCurrency,
) {
stateHolder.update(
OpenBottomSheetTransformer(
userWalletId = userWalletId,
content = ChooseAddressBottomSheetConfig(
addressModels = addresses
.map { address ->
AddressModel(
value = address.value,
type = AddressModel.Type.valueOf(address.type.name),
)
}
.toImmutableList(),
addressModels = addresses.mapToAddressModels(currency).toImmutableList(),
onClick = {
onAddressTypeSelected(
userWalletId = userWalletId,