From 0bbb95db9793800bef82f196713d0a6d6b5dbebf Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 26 Sep 2023 12:23:07 +0300 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values-ru/strings.xml | 1 + core/res/src/main/res/values/strings.xml | 1 + .../chooseaddress/ChooseAddressBottomSheet.kt | 57 +++++++++++++++++++ .../ChooseAddressBottomSheetConfig.kt | 9 +++ .../DefaultWalletManagersFacade.kt | 10 +++- .../walletmanager/WalletManagersFacade.kt | 4 +- .../wallets/usecase/GetExploreUrlUseCase.kt | 9 ++- .../state/factory/TokenDetailsStateFactory.kt | 22 +++++++ .../tokendetails/ui/TokenDetailsScreen.kt | 16 +++++- .../viewmodels/TokenDetailsViewModel.kt | 23 ++++++++ 10 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheet.kt create mode 100644 core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheetConfig.kt diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 2a4a4d51d7..ae7cbf8d96 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -584,4 +584,5 @@ Сканировать карту Используйте %s или отсканируйте карту для входа в приложение C возвращением! + Выберите адрес diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 1788e649be..784650d7a8 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -609,4 +609,5 @@ Scan card Use %s or scan a card to access the app Welcome back! + Choose address diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheet.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheet.kt new file mode 100644 index 0000000000..adcdb176c1 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheet.kt @@ -0,0 +1,57 @@ +package com.tangem.core.ui.components.bottomsheets.chooseaddress + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import com.tangem.core.ui.R +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.tangem.core.ui.components.SecondaryButton +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.core.ui.res.TangemTheme + +@Composable +fun ChooseAddressBottomSheet(config: TangemBottomSheetConfig) { + if (config.content is ChooseAddressBottomSheetConfig && config.isShow) { + TangemBottomSheet(config) { content -> + ChooseAddressBottomSheetContent( + content = content as ChooseAddressBottomSheetConfig, + ) + } + } +} + +@Composable +private fun ChooseAddressBottomSheetContent(content: ChooseAddressBottomSheetConfig) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding( + start = TangemTheme.dimens.spacing24, + top = TangemTheme.dimens.spacing24, + end = TangemTheme.dimens.spacing24, + bottom = TangemTheme.dimens.spacing16, + ), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(space = TangemTheme.dimens.spacing24), + ) { + Text( + text = stringResource(id = R.string.token_details_choose_address), + color = TangemTheme.colors.text.secondary, + textAlign = TextAlign.Center, + style = TangemTheme.typography.body2, + ) + content.addressModels.forEach { addressModel -> + SecondaryButton( + text = addressModel.type.name, + onClick = { content.onClick(addressModel) }, + ) + } + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheetConfig.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheetConfig.kt new file mode 100644 index 0000000000..27984d9852 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/chooseaddress/ChooseAddressBottomSheetConfig.kt @@ -0,0 +1,9 @@ +package com.tangem.core.ui.components.bottomsheets.chooseaddress + +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel + +class ChooseAddressBottomSheetConfig( + val addressModels: List, + val onClick: (AddressModel) -> Unit, +) : TangemBottomSheetConfigContent \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt index 1155237c4e..31d72a5476 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/DefaultWalletManagersFacade.kt @@ -8,6 +8,7 @@ import com.tangem.blockchain.common.BlockchainSdkError import com.tangem.blockchain.common.WalletManager import com.tangem.blockchain.common.address.Address import com.tangem.blockchain.common.txhistory.TransactionHistoryRequest +import com.tangem.blockchain.common.address.AddressType import com.tangem.blockchain.extensions.Result import com.tangem.crypto.hdWallet.DerivationPath import com.tangem.datasource.config.ConfigManager @@ -55,7 +56,11 @@ class DefaultWalletManagersFacade( return getAndUpdateWalletManager(userWallet, blockchain, derivationPath, extraTokens) } - override suspend fun getExploreUrl(userWalletId: UserWalletId, network: Network): String { + override suspend fun getExploreUrl( + userWalletId: UserWalletId, + network: Network, + addressType: AddressType, + ): String { val userWallet = getUserWallet(userWalletId) val blockchain = Blockchain.fromId(network.id.value) @@ -69,7 +74,8 @@ class DefaultWalletManagersFacade( "Unable to get a wallet manager for blockchain: $blockchain" } - return walletManager.wallet.getExploreUrl() + val address = walletManager.wallet.addresses.find { it.type == addressType }?.value + return walletManager.wallet.getExploreUrl(address) } override suspend fun getTxHistoryState(userWalletId: UserWalletId, network: Network): TxHistoryState { diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt index 2e8872700a..9ec947d51e 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/WalletManagersFacade.kt @@ -7,6 +7,7 @@ import com.tangem.blockchain.common.address.Address import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network import com.tangem.domain.tokens.model.warnings.CryptoCurrencyWarning +import com.tangem.blockchain.common.address.AddressType import com.tangem.domain.txhistory.models.PaginationWrapper import com.tangem.domain.txhistory.models.TxHistoryItem import com.tangem.domain.txhistory.models.TxHistoryState @@ -40,10 +41,11 @@ interface WalletManagersFacade { * * @param userWalletId The ID of the user's wallet. * @param network The network. + * @param addressType Address type. * * @return The network explorer URL, maybe empty if the wallet manager was not found. * */ - suspend fun getExploreUrl(userWalletId: UserWalletId, network: Network): String + suspend fun getExploreUrl(userWalletId: UserWalletId, network: Network, addressType: AddressType): String /** * Returns transactions count diff --git a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/GetExploreUrlUseCase.kt b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/GetExploreUrlUseCase.kt index 67af34a16d..cc29827d31 100644 --- a/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/GetExploreUrlUseCase.kt +++ b/domain/wallets/src/main/java/com/tangem/domain/wallets/usecase/GetExploreUrlUseCase.kt @@ -2,6 +2,7 @@ package com.tangem.domain.wallets.usecase import arrow.core.raise.catch import com.tangem.domain.tokens.model.Network +import com.tangem.blockchain.common.address.AddressType import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.models.UserWalletId @@ -9,8 +10,12 @@ import com.tangem.domain.wallets.models.UserWalletId class GetExploreUrlUseCase(private val walletsManagersFacade: WalletManagersFacade) { // FIXME: Handle error - suspend operator fun invoke(userWalletId: UserWalletId, network: Network): String { - return catch({ walletsManagersFacade.getExploreUrl(userWalletId, network) }) { + suspend operator fun invoke( + userWalletId: UserWalletId, + network: Network, + addressType: AddressType = AddressType.Default, + ): String { + return catch({ walletsManagersFacade.getExploreUrl(userWalletId, network, addressType) }) { "" } } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt index 4e016eb152..ea24b9d9f5 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt @@ -5,6 +5,7 @@ import arrow.core.Either import com.tangem.blockchain.common.address.Address import com.tangem.common.Provider import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +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.domain.appcurrency.model.AppCurrency @@ -164,6 +165,27 @@ internal class TokenDetailsStateFactory( ) } + fun getStateWithChooseAddressBottomSheet( + addresses: List
, + onAddressTypeClick: (AddressModel) -> Unit, + ): TokenDetailsState { + return currentStateProvider().copy( + bottomSheetConfig = TangemBottomSheetConfig( + isShow = true, + onDismissRequest = clickIntents::onDismissBottomSheet, + content = ChooseAddressBottomSheetConfig( + addressModels = addresses.map { + AddressModel( + value = it.value, + type = AddressModel.Type.valueOf(it.type.name), + ) + }, + onClick = onAddressTypeClick, + ), + ), + ) + } + fun getStateWithClosedBottomSheet(): TokenDetailsState { val state = currentStateProvider() return state.copy( diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/TokenDetailsScreen.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/TokenDetailsScreen.kt index 9ab8a4487f..7a7d535d15 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/TokenDetailsScreen.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/TokenDetailsScreen.kt @@ -17,7 +17,10 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.util.fastForEach import androidx.paging.compose.collectAsLazyPagingItems +import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheet +import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheet +import com.tangem.core.ui.components.bottomsheets.tokenreceive.TokenReceiveBottomSheetConfig import com.tangem.core.ui.components.marketprice.MarketPriceBlock import com.tangem.core.ui.components.marketprice.MarketPriceBlockState import com.tangem.core.ui.components.notifications.Notification @@ -109,9 +112,16 @@ internal fun TokenDetailsScreen(state: TokenDetailsState) { TokenDetailsDialogs(state = state) state.bottomSheetConfig?.let { config -> - TokenReceiveBottomSheet( - config = config, - ) + if (config.isShow) { + when (config.content) { + is TokenReceiveBottomSheetConfig -> { + TokenReceiveBottomSheet(config = config) + } + is ChooseAddressBottomSheetConfig -> { + ChooseAddressBottomSheet(config = config) + } + } + } } } } diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 61a52ba80f..f36c50c61a 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.* import androidx.paging.cachedIn import arrow.core.getOrElse +import com.tangem.blockchain.common.address.AddressType import com.tangem.common.Provider import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency @@ -299,11 +300,33 @@ internal class TokenDetailsViewModel @Inject constructor( } override fun onExploreClick() { + viewModelScope.launch(dispatchers.io) { + val addresses = walletManagersFacade.getAddress( + userWalletId = wallet.walletId, + network = cryptoCurrency.network, + ) + + if (addresses.size == 1) { + openUrl(AddressType.Default) + } else { + uiState = stateFactory.getStateWithChooseAddressBottomSheet( + addresses = addresses, + onAddressTypeClick = { + openUrl(AddressType.valueOf(it.type.name)) + uiState = stateFactory.getStateWithClosedBottomSheet() + }, + ) + } + } + } + + private fun openUrl(addressType: AddressType) { viewModelScope.launch { router.openUrl( url = getExploreUrlUseCase( userWalletId = wallet.walletId, network = cryptoCurrency.network, + addressType = addressType, ), ) }