diff --git a/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt index b9cfccbc58..a8cb6b030d 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/NFTDomainModule.kt @@ -3,6 +3,7 @@ package com.tangem.tap.di.domain import com.tangem.domain.nft.* import com.tangem.domain.nft.repository.NFTRepository import com.tangem.domain.tokens.repository.CurrenciesRepository +import com.tangem.domain.tokens.repository.NetworksRepository import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.Module import dagger.Provides @@ -58,4 +59,11 @@ internal object NFTDomainModule { ): FilterNFTAvailableNetworksUseCase = FilterNFTAvailableNetworksUseCase( dispatchers = dispatchers, ) + + @Provides + @Singleton + fun providesGetNFTNetworkStatusUseCase(networksRepository: NetworksRepository): GetNFTNetworkStatusUseCase = + GetNFTNetworkStatusUseCase( + networksRepository = networksRepository, + ) } \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/chooseaddress/ChooseAddressBottomSheetConfig.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/chooseaddress/ChooseAddressBottomSheetConfig.kt index cd34d703e9..becc21a447 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/chooseaddress/ChooseAddressBottomSheetConfig.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/chooseaddress/ChooseAddressBottomSheetConfig.kt @@ -1,10 +1,27 @@ package com.tangem.common.ui.bottomsheet.chooseaddress import com.tangem.common.ui.bottomsheet.receive.AddressModel +import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig +import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkAddress import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList class ChooseAddressBottomSheetConfig( val addressModels: ImmutableList, val onClick: (AddressModel) -> Unit, -) : TangemBottomSheetConfigContent \ No newline at end of file +) : TangemBottomSheetConfigContent { + constructor( + asset: TokenReceiveBottomSheetConfig.Asset, + network: Network, + networkAddress: NetworkAddress, + onClick: (AddressModel) -> Unit, + ) : this( + addressModels = networkAddress.availableAddresses + .mapToAddressModels(asset, network) + .toImmutableList(), + onClick = onClick, + ) +} \ No newline at end of file diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressMappers.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressMappers.kt index e5d3092126..42f67f45d9 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressMappers.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressMappers.kt @@ -1,6 +1,9 @@ package com.tangem.common.ui.bottomsheet.receive +import com.tangem.core.ui.R import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.combinedReference +import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.Network @@ -12,18 +15,48 @@ private const val DEL_ADDRESS_NAME = "Main" private const val LEGACY_ADDRESS_NAME = "Legacy" private const val DEFAULT_ADDRESS_NAME = "Default" -fun Set.mapToAddressModels(currency: CryptoCurrency): List = this - .sortedBy { it.type.ordinal } - .map { address -> - AddressModel( - displayName = currency.network.getAddressDisplayName(address.type), - value = address.value, - type = when (address.type) { - NetworkAddress.Address.Type.Primary -> AddressModel.Type.Default - NetworkAddress.Address.Type.Secondary -> AddressModel.Type.Legacy - }, - ) - } +fun Set.mapToAddressModels(cryptoCurrency: CryptoCurrency) = mapToAddressModels( + stringReference("${cryptoCurrency.name} (${cryptoCurrency.symbol})"), + cryptoCurrency.network, +) + +fun Set.mapToAddressModels( + asset: TokenReceiveBottomSheetConfig.Asset, + network: Network, +): List = when (asset) { + is TokenReceiveBottomSheetConfig.Asset.Currency -> mapToAddressModels( + stringReference("${asset.name} (${asset.symbol})"), + network, + ) + is TokenReceiveBottomSheetConfig.Asset.NFT -> mapToAddressModels( + resourceReference(R.string.common_nft), + network, + ) +} + +private fun Set.mapToAddressModels(name: TextReference, network: Network): List = + this + .sortedBy { it.type.ordinal } + .map { address -> + val displayName = network.getAddressDisplayName(address.type) + AddressModel( + displayName = displayName, + fullName = if (this.size < 2) { + name + } else { + combinedReference( + displayName, + stringReference(" "), + name, + ) + }, + value = address.value, + type = when (address.type) { + NetworkAddress.Address.Type.Primary -> AddressModel.Type.Default + NetworkAddress.Address.Type.Secondary -> AddressModel.Type.Legacy + }, + ) + } private fun Network.getAddressDisplayName(addressType: NetworkAddress.Address.Type): TextReference { return when (id.value) { diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressModel.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressModel.kt index b520e6ff03..847cc47d2b 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressModel.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/AddressModel.kt @@ -4,6 +4,7 @@ import com.tangem.core.ui.extensions.TextReference data class AddressModel( val displayName: TextReference, + val fullName: TextReference, val value: String, val type: Type, ) { diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheet.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheet.kt index a212153bfa..f6024e6f93 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheet.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheet.kt @@ -67,7 +67,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi QrCodeContent(content = content, onAddressChange = { selectedAddress = it }) Info( - currency = content.symbol, + symbol = content.asset.displaySymbol, network = content.network, showMemoDisclaimer = content.showMemoDisclaimer, ) @@ -82,7 +82,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi } @Composable -private fun Info(currency: String, network: String, showMemoDisclaimer: Boolean, modifier: Modifier = Modifier) { +private fun Info(symbol: TextReference, network: String, showMemoDisclaimer: Boolean, modifier: Modifier = Modifier) { Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, @@ -104,7 +104,7 @@ private fun Info(currency: String, network: String, showMemoDisclaimer: Boolean, config = NotificationConfig( title = resourceReference( R.string.receive_bottom_sheet_warning_title, - wrappedList(currency, network), + wrappedList(symbol.resolveReference(), network), ), subtitle = resourceReference(R.string.receive_bottom_sheet_warning_message_description), iconResId = R.drawable.ic_alert_circle_24, @@ -189,9 +189,8 @@ private fun QrCodePage(content: TokenReceiveBottomSheetConfig, qrCodePainter: Pa ) { Text( text = stringResourceSafe( - R.string.receive_bottom_sheet_warning_message, - getName(content = content, index = currentIndex), - content.symbol, + R.string.receive_bottom_sheet_warning_message_compact, + content.addresses[currentIndex].fullName.resolveReference(), content.network, ), color = TangemTheme.colors.text.primary1, @@ -215,15 +214,6 @@ private fun QrCodePage(content: TokenReceiveBottomSheetConfig, qrCodePainter: Pa } } -@Composable -private fun getName(content: TokenReceiveBottomSheetConfig, index: Int): String { - return if (content.addresses.size < 2) { - content.name - } else { - "${content.addresses[index].displayName.resolveReference()} ${content.name}" - } -} - @Composable private fun Buttons( snackbarHostState: SnackbarHostState, @@ -291,12 +281,18 @@ private fun Preview_TokenReceiveBottomSheet( private class TokenReceiveBottomSheetConfigPreviewProvider : PreviewParameterProvider { val address = AddressModel( displayName = stringReference("Address 1"), + fullName = combinedReference( + stringReference("Address 1"), + stringReference(" Stellar"), + ), value = "0xe5178c7d4d0e861ed2e9414e045b501226b0de8d", type = AddressModel.Type.Default, ) private val baseConfig = TokenReceiveBottomSheetConfig( - name = "Stellar", - symbol = "XLM", + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = "Stellar", + symbol = "XLM", + ), network = "Ethereum", addresses = persistentListOf(address), showMemoDisclaimer = false, diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheetConfig.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheetConfig.kt index 463dc32fc4..382d977c74 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheetConfig.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/receive/TokenReceiveBottomSheetConfig.kt @@ -1,14 +1,51 @@ package com.tangem.common.ui.bottomsheet.receive +import androidx.compose.runtime.Immutable +import com.tangem.core.ui.R import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent +import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkAddress import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList data class TokenReceiveBottomSheetConfig( - val name: String, - val symbol: String, + val asset: Asset, val network: String, val addresses: ImmutableList, val showMemoDisclaimer: Boolean, val onCopyClick: (String) -> Unit, val onShareClick: (String) -> Unit, -) : TangemBottomSheetConfigContent \ No newline at end of file +) : TangemBottomSheetConfigContent { + + constructor( + asset: Asset, + network: Network, + networkAddress: NetworkAddress, + showMemoDisclaimer: Boolean, + onCopyClick: (String) -> Unit, + onShareClick: (String) -> Unit, + ) : this( + asset = asset, + network = network.name, + addresses = networkAddress.availableAddresses + .mapToAddressModels(asset, network) + .toImmutableList(), + showMemoDisclaimer = showMemoDisclaimer, + onCopyClick = onCopyClick, + onShareClick = onShareClick, + ) + + @Immutable + sealed class Asset { + abstract val displaySymbol: TextReference + data class Currency(val name: String, val symbol: String) : Asset() { + override val displaySymbol = stringReference(symbol) + } + data object NFT : Asset() { + override val displaySymbol = resourceReference(R.string.common_nft) + } + } +} \ No newline at end of file diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 22cf05d7e5..0eba9dda01 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -116,6 +116,7 @@ Create %1$s (%2$s) Custom + NFT %d day %d days @@ -649,6 +650,7 @@ Camera access denied No memo required %1$s (%2$s) on %3$s network + %1$s on %2$s network Sending any other currency will result in its irreversible loss. Send only %s to this address. Sending any other currency will result in its irreversible loss. Send only %1$s on the %2$s network diff --git a/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworkStatusUseCase.kt b/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworkStatusUseCase.kt new file mode 100644 index 0000000000..4d0771cde1 --- /dev/null +++ b/domain/nft/src/main/kotlin/com/tangem/domain/nft/GetNFTNetworkStatusUseCase.kt @@ -0,0 +1,15 @@ +package com.tangem.domain.nft + +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkStatus +import com.tangem.domain.tokens.repository.NetworksRepository +import com.tangem.domain.wallets.models.UserWalletId + +class GetNFTNetworkStatusUseCase( + private val networksRepository: NetworksRepository, +) { + + suspend operator fun invoke(userWalletId: UserWalletId, network: Network): NetworkStatus? = networksRepository + .getNetworkStatusesSync(userWalletId, setOf(network), false) + .firstOrNull { it.network == network } +} \ No newline at end of file diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt index 1e67919846..61cae107f4 100644 --- a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt +++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/impl/model/TokenActionsHandler.kt @@ -102,12 +102,12 @@ internal class TokenActionsHandler @AssistedInject constructor( } }, content = TokenReceiveBottomSheetConfig( - name = currency.name, - symbol = currency.symbol, - network = currency.network.name, - addresses = networkAddress.availableAddresses - .mapToAddressModels(currency) - .toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = networkAddress, showMemoDisclaimer = currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = {}, onShareClick = {}, diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/entity/transformer/ShowReceiveBottomSheetTransformer.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/entity/transformer/ShowReceiveBottomSheetTransformer.kt new file mode 100644 index 0000000000..4fc0f0de2d --- /dev/null +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/entity/transformer/ShowReceiveBottomSheetTransformer.kt @@ -0,0 +1,32 @@ +package com.tangem.features.nft.receive.entity.transformer + +import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig +import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkAddress +import com.tangem.features.nft.receive.entity.NFTReceiveUM +import com.tangem.utils.transformer.Transformer + +internal class ShowReceiveBottomSheetTransformer( + private val network: Network, + private val networkAddress: NetworkAddress, + private val onDismissBottomSheet: () -> Unit, + private val onCopyClick: (String) -> Unit, + private val onShareClick: (String) -> Unit, +) : Transformer { + + override fun transform(prevState: NFTReceiveUM): NFTReceiveUM = prevState.copy( + bottomSheetConfig = TangemBottomSheetConfig( + isShown = true, + onDismissRequest = onDismissBottomSheet, + content = TokenReceiveBottomSheetConfig( + asset = TokenReceiveBottomSheetConfig.Asset.NFT, + network = network, + networkAddress = networkAddress, + showMemoDisclaimer = network.transactionExtrasType != Network.TransactionExtrasType.NONE, + onCopyClick = onCopyClick, + onShareClick = onShareClick, + ), + ), + ) +} \ No newline at end of file diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt index 2e1b50b3c7..dc0eefd9b3 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/model/NFTReceiveModel.kt @@ -4,15 +4,20 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router +import com.tangem.core.navigation.share.ShareManager +import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.core.ui.components.fields.InputManager import com.tangem.core.ui.components.fields.entity.SearchBarUM import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.nft.FilterNFTAvailableNetworksUseCase import com.tangem.domain.nft.GetNFTAvailableNetworksUseCase +import com.tangem.domain.nft.GetNFTNetworkStatusUseCase import com.tangem.domain.tokens.model.Network +import com.tangem.domain.tokens.model.NetworkStatus import com.tangem.features.nft.component.NFTReceiveComponent import com.tangem.features.nft.impl.R import com.tangem.features.nft.receive.entity.NFTReceiveUM +import com.tangem.features.nft.receive.entity.transformer.ShowReceiveBottomSheetTransformer import com.tangem.features.nft.receive.entity.transformer.ToggleSearchBarTransformer import com.tangem.features.nft.receive.entity.transformer.UpdateDataStateTransformer import com.tangem.features.nft.receive.entity.transformer.UpdateSearchQueryTransformer @@ -22,6 +27,7 @@ import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject +@Suppress("LongParameterList") @ModelScoped internal class NFTReceiveModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, @@ -29,6 +35,9 @@ internal class NFTReceiveModel @Inject constructor( private val searchManager: InputManager, private val getNFTAvailableNetworksUseCase: GetNFTAvailableNetworksUseCase, private val filterNFTAvailableNetworksUseCase: FilterNFTAvailableNetworksUseCase, + private val getNFTNetworkStatusUseCase: GetNFTNetworkStatusUseCase, + private val clipboardManager: ClipboardManager, + private val shareManager: ShareManager, paramsContainer: ParamsContainer, ) : Model() { @@ -89,9 +98,47 @@ internal class NFTReceiveModel @Inject constructor( } } - @Suppress("UnusedPrivateMember") + private fun onReceiveBottomSheetDismiss() { + _state.update { + it.copy( + bottomSheetConfig = it.bottomSheetConfig?.copy(isShown = false), + ) + } + } + private fun onNetworkClick(network: Network) { - // TODO show receive bottom sheet + modelScope.launch { + val networkStatus = getNFTNetworkStatusUseCase.invoke( + userWalletId = params.userWalletId, + network = network, + ) ?: return@launch + + when (val value = networkStatus.value) { + is NetworkStatus.Verified -> { + _state.update { + ShowReceiveBottomSheetTransformer( + network = network, + networkAddress = value.address, + onDismissBottomSheet = ::onReceiveBottomSheetDismiss, + onCopyClick = ::onCopyClick, + onShareClick = ::onShareClick, + ).transform(it) + } + } + is NetworkStatus.MissedDerivation, + is NetworkStatus.NoAccount, + is NetworkStatus.Unreachable, + -> Unit + } + } + } + + private fun onCopyClick(text: String) { + clipboardManager.setText(text = text, isSensitive = true) + } + + private fun onShareClick(text: String) { + shareManager.shareText(text = text) } private fun navigateBack() { diff --git a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/ui/NFTReceive.kt b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/ui/NFTReceive.kt index 326d77da63..69acaeef22 100644 --- a/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/ui/NFTReceive.kt +++ b/features/nft/impl/src/main/kotlin/com/tangem/features/nft/receive/ui/NFTReceive.kt @@ -6,8 +6,11 @@ import androidx.compose.foundation.layout.* import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheet +import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig import com.tangem.core.ui.components.appbar.TangemTopAppBar import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM +import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.fields.SearchBar import com.tangem.core.ui.components.fields.TangemSearchBarDefaults import com.tangem.core.ui.extensions.stringResourceSafe @@ -63,4 +66,17 @@ internal fun NFTReceive(state: NFTReceiveUM, modifier: Modifier = Modifier) { } }, ) + + ShowBottomSheet(state.bottomSheetConfig) +} + +@Composable +private fun ShowBottomSheet(bottomSheetConfig: TangemBottomSheetConfig?) { + if (bottomSheetConfig != null) { + when (bottomSheetConfig.content) { + is TokenReceiveBottomSheetConfig -> { + TokenReceiveBottomSheet(config = bottomSheetConfig) + } + } + } } \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt index 959dcbe305..f51e0f6df5 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/note/impl/child/topup/model/OnboardingNoteTopUpModel.kt @@ -1,5 +1,6 @@ package com.tangem.features.onboarding.v2.note.impl.child.topup.model +import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig import com.tangem.core.analytics.Analytics import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model @@ -8,8 +9,6 @@ import com.tangem.core.navigation.share.ShareManager import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig -import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig -import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels import com.tangem.core.ui.format.bigdecimal.crypto import com.tangem.core.ui.format.bigdecimal.format import com.tangem.domain.card.repository.CardRepository @@ -30,7 +29,6 @@ import com.tangem.features.onboarding.v2.note.impl.child.topup.OnboardingNoteTop import com.tangem.features.onboarding.v2.note.impl.child.topup.ui.state.OnboardingNoteTopUpUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.extensions.isPositive -import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject @@ -223,12 +221,12 @@ internal class OnboardingNoteTopUpModel @Inject constructor( isShown = true, onDismissRequest = uiState.value.onDismissBottomSheet, content = TokenReceiveBottomSheetConfig( - name = currencyStatus.currency.name, - symbol = currencyStatus.currency.symbol, - network = currencyStatus.currency.network.name, - addresses = networkAddress.availableAddresses - .mapToAddressModels(currencyStatus.currency) - .toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currencyStatus.currency.name, + symbol = currencyStatus.currency.symbol, + ), + network = currencyStatus.currency.network, + networkAddress = networkAddress, showMemoDisclaimer = currencyStatus.currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = { diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt index 0c7a4c59a2..bfbd7e56c8 100644 --- a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/twin/impl/model/OnboardingTwinModel.kt @@ -16,7 +16,6 @@ import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig -import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.toWrappedList import com.tangem.core.ui.format.bigdecimal.crypto @@ -51,7 +50,6 @@ import com.tangem.sdk.extensions.localizedDescriptionRes import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder import com.tangem.utils.coroutines.saveIn -import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.firstOrNull @@ -370,12 +368,12 @@ internal class OnboardingTwinModel @Inject constructor( } }, content = TokenReceiveBottomSheetConfig( - name = currency.name, - symbol = currency.symbol, - network = currency.network.name, - addresses = networkAddress.availableAddresses - .mapToAddressModels(currency) - .toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = networkAddress, showMemoDisclaimer = currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = {}, 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 980eac8c0f..04b691db1a 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 @@ -6,7 +6,6 @@ import com.tangem.common.ui.tokens.getUnavailabilityReasonText import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.common.ui.bottomsheet.chooseaddress.ChooseAddressBottomSheetConfig import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig -import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenuItem import com.tangem.core.ui.components.transactions.state.TransactionState import com.tangem.core.ui.components.transactions.state.TxHistoryState @@ -267,10 +266,12 @@ internal class TokenDetailsStateFactory( isShown = true, onDismissRequest = clickIntents::onDismissBottomSheet, content = TokenReceiveBottomSheetConfig( - name = currency.name, - symbol = currency.symbol, - network = currency.network.name, - addresses = networkAddress.availableAddresses.mapToAddressModels(currency).toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = networkAddress, showMemoDisclaimer = currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = onCopyClick, onShareClick = onShareClick, @@ -288,7 +289,12 @@ internal class TokenDetailsStateFactory( isShown = true, onDismissRequest = clickIntents::onDismissBottomSheet, content = ChooseAddressBottomSheetConfig( - addressModels = networkAddress.availableAddresses.mapToAddressModels(currency).toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = networkAddress, onClick = clickIntents::onAddressTypeSelected, ), ), diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt index ce71b37760..9068f9a7f1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/WalletCurrencyActionsClickIntents.kt @@ -169,7 +169,7 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( stateHolder.showBottomSheet( createReceiveBottomSheetContent( currency = cryptoCurrencyStatus.currency, - addresses = cryptoCurrencyStatus.value.networkAddress?.availableAddresses ?: return, + addresses = cryptoCurrencyStatus.value.networkAddress ?: return, ), userWalletId, ) @@ -189,13 +189,15 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( private fun createReceiveBottomSheetContent( currency: CryptoCurrency, - addresses: Set, + addresses: NetworkAddress, ): TangemBottomSheetConfigContent { return TokenReceiveBottomSheetConfig( - name = currency.name, - symbol = currency.symbol, - network = currency.network.name, - addresses = addresses.mapToAddressModels(currency).toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = addresses, showMemoDisclaimer = currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = { analyticsEventHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(currency.symbol)) @@ -488,7 +490,7 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( when (val addresses = currencyStatus.value.networkAddress) { is NetworkAddress.Selectable -> { - showChooseAddressBottomSheet(userWalletId, addresses.availableAddresses, currencyStatus.currency) + showChooseAddressBottomSheet(userWalletId, addresses, currencyStatus.currency) } is NetworkAddress.Single -> { router.openUrl( @@ -506,12 +508,17 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor( private fun showChooseAddressBottomSheet( userWalletId: UserWalletId, - addresses: Set, + addresses: NetworkAddress, currency: CryptoCurrency, ) { stateHolder.showBottomSheet( ChooseAddressBottomSheetConfig( - addressModels = addresses.mapToAddressModels(currency).toImmutableList(), + asset = TokenReceiveBottomSheetConfig.Asset.Currency( + name = currency.name, + symbol = currency.symbol, + ), + network = currency.network, + networkAddress = addresses, onClick = { onAddressTypeSelected( userWalletId = userWalletId,