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,
),
)
}