diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 368cbca8bf..ce3e6d97ca 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -183,6 +183,7 @@
Add
Add to portfolio
Add token
+ Added
Address
All
Allow
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/rows/BlockchainRow.kt b/core/ui/src/main/java/com/tangem/core/ui/components/rows/BlockchainRow.kt
index d89d6710c1..4e74046e6c 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/rows/BlockchainRow.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/rows/BlockchainRow.kt
@@ -27,15 +27,20 @@ private const val DISABLED_ICON_ALPHA = 0.4f
* [Figma Component](https://www.figma.com/design/14ISV23YB1yVW1uNVwqrKv/Android?node-id=2737-2800&t=ewlXfWwbDnRhjw4B-4)
* */
@Composable
-fun BlockchainRow(model: BlockchainRowUM, modifier: Modifier = Modifier, action: @Composable BoxScope.() -> Unit) {
+fun BlockchainRow(
+ model: BlockchainRowUM,
+ modifier: Modifier = Modifier,
+ itemPadding: PaddingValues = PaddingValues(
+ top = TangemTheme.dimens.spacing8,
+ bottom = TangemTheme.dimens.spacing8,
+ start = TangemTheme.dimens.spacing8,
+ ),
+ action: @Composable BoxScope.() -> Unit,
+) {
RowContentContainer(
modifier = modifier
.heightIn(min = TangemTheme.dimens.size52)
- .padding(
- top = TangemTheme.dimens.spacing8,
- bottom = TangemTheme.dimens.spacing8,
- start = TangemTheme.dimens.spacing8,
- ),
+ .padding(itemPadding),
icon = {
RowIcon(
resId = model.iconResId,
@@ -58,7 +63,7 @@ fun BlockchainRow(model: BlockchainRowUM, modifier: Modifier = Modifier, action:
}
@Composable
-private fun RowIcon(
+fun RowIcon(
@DrawableRes resId: Int,
isColored: Boolean,
showAccentBadge: Boolean,
diff --git a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenMarketInfo.kt b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenMarketInfo.kt
index 97a9008aa1..5354432e4c 100644
--- a/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenMarketInfo.kt
+++ b/domain/markets/models/src/main/kotlin/com/tangem/domain/markets/TokenMarketInfo.kt
@@ -1,5 +1,6 @@
package com.tangem.domain.markets
+import kotlinx.serialization.Serializable
import org.joda.time.DateTime
import java.math.BigDecimal
@@ -18,6 +19,8 @@ data class TokenMarketInfo(
val pricePerformance: PricePerformance?,
val exchangesAmount: Int?,
) {
+
+ @Serializable
data class Network(
val networkId: String,
val exchangeable: Boolean,
diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ChooseNetworkComponent.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ChooseNetworkComponent.kt
new file mode 100644
index 0000000000..3ab91ac88c
--- /dev/null
+++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ChooseNetworkComponent.kt
@@ -0,0 +1,57 @@
+package com.tangem.features.markets.portfolio.add.impl
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import com.tangem.core.decompose.context.AppComponentContext
+import com.tangem.core.decompose.factory.ComponentFactory
+import com.tangem.core.ui.decompose.ComposableContentComponent
+import com.tangem.domain.markets.TokenMarketInfo
+import com.tangem.features.markets.portfolio.add.impl.ui.ChooseNetworkContent
+import com.tangem.features.markets.portfolio.add.impl.ui.state.ChooseNetworkUM
+import com.tangem.features.markets.portfolio.impl.model.BlockchainRowUMConverter
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import kotlinx.collections.immutable.toPersistentList
+
+internal class ChooseNetworkComponent @AssistedInject constructor(
+ @Assisted context: AppComponentContext,
+ @Assisted private val params: Params,
+) : AppComponentContext by context, ComposableContentComponent {
+
+ private val state by lazy {
+ val converter = BlockchainRowUMConverter(
+ alreadyAddedNetworks = params.alreadyAdded.mapTo(mutableSetOf()) { it.networkId },
+ )
+ val allAvailableNetworks = params.allAvailable.map { it to true }
+ ChooseNetworkUM(
+ networks = converter.convertList(allAvailableNetworks).toPersistentList(),
+ onNetworkClick = onNetworkClick@{ row ->
+ val network = params.allAvailable
+ .find { it.networkId == row.id }
+ ?: return@onNetworkClick
+ params.callbacks.onNetworkSelected(network)
+ },
+ )
+ }
+
+ @Composable
+ override fun Content(modifier: Modifier) {
+ ChooseNetworkContent(state)
+ }
+
+ data class Params(
+ val alreadyAdded: Set,
+ val allAvailable: List,
+ val callbacks: Callbacks,
+ )
+
+ interface Callbacks {
+ fun onNetworkSelected(network: TokenMarketInfo.Network)
+ }
+
+ @AssistedFactory
+ interface Factory : ComponentFactory {
+ override fun create(context: AppComponentContext, params: Params): ChooseNetworkComponent
+ }
+}
\ No newline at end of file
diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/ChooseNetworkContent.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/ChooseNetworkContent.kt
new file mode 100644
index 0000000000..e2f26ae35b
--- /dev/null
+++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/ChooseNetworkContent.kt
@@ -0,0 +1,110 @@
+package com.tangem.features.markets.portfolio.add.impl.ui
+
+import android.content.res.Configuration
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.key
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.tooling.preview.PreviewParameter
+import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import androidx.compose.ui.util.fastForEachIndexed
+import com.tangem.core.ui.components.label.Label
+import com.tangem.core.ui.components.label.entity.LabelStyle
+import com.tangem.core.ui.components.label.entity.LabelUM
+import com.tangem.core.ui.components.rows.BlockchainRow
+import com.tangem.core.ui.components.rows.model.BlockchainRowUM
+import com.tangem.core.ui.extensions.resourceReference
+import com.tangem.core.ui.res.TangemTheme
+import com.tangem.core.ui.res.TangemThemePreview
+import com.tangem.features.markets.impl.R
+import com.tangem.features.markets.portfolio.add.impl.ui.state.ChooseNetworkUM
+import kotlinx.collections.immutable.persistentListOf
+import java.util.UUID
+
+private const val DISABLED_ALPHA = 0.4f
+
+@Composable
+internal fun ChooseNetworkContent(state: ChooseNetworkUM, modifier: Modifier = Modifier) {
+ Column(
+ modifier = modifier
+ .fillMaxWidth()
+ .clip(RoundedCornerShape(TangemTheme.dimens.radius14))
+ .background(TangemTheme.colors.background.action),
+ ) {
+ state.networks.fastForEachIndexed { index, model ->
+ key(model.id) {
+ BlockchainRow(
+ model = model,
+ itemPadding = PaddingValues(
+ horizontal = TangemTheme.dimens.spacing12,
+ vertical = TangemTheme.dimens.spacing14,
+ ),
+ modifier = Modifier
+ .fillMaxWidth()
+ .clickable(enabled = model.isEnabled, onClick = { state.onNetworkClick(model) }),
+ ) {
+ if (!model.isEnabled) {
+ Label(
+ modifier = Modifier.alpha(DISABLED_ALPHA),
+ state = LabelUM(
+ text = resourceReference(R.string.common_added),
+ style = LabelStyle.REGULAR,
+ ),
+ )
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+@Preview(showBackground = true, widthDp = 360)
+@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES)
+private fun Preview(@PreviewParameter(ChooseNetworkContentProvider::class) content: ChooseNetworkUM) {
+ TangemThemePreview {
+ ChooseNetworkContent(
+ state = content,
+ )
+ }
+}
+
+internal class ChooseNetworkContentProvider : PreviewParameterProvider {
+
+ private val blockchainRow = BlockchainRowUM(
+ id = UUID.randomUUID().toString(),
+ name = "Etherium 3",
+ type = "TEST",
+ iconResId = R.drawable.img_eth_22,
+ isMainNetwork = false,
+ isSelected = true,
+ isEnabled = true,
+ )
+
+ override val values: Sequence
+ get() = sequenceOf(
+ ChooseNetworkUM(
+ onNetworkClick = {},
+ networks = persistentListOf(
+ blockchainRow.copy(
+ type = "MAIN",
+ isMainNetwork = true,
+ ),
+ blockchainRow.copy(
+ iconResId = R.drawable.ic_bsc_16,
+ isEnabled = false,
+ ),
+ blockchainRow.copy(iconResId = R.drawable.img_polygon_22),
+ blockchainRow.copy(iconResId = R.drawable.img_optimism_22),
+ ),
+ ),
+ )
+}
\ No newline at end of file
diff --git a/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/state/ChooseNetworkUM.kt b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/state/ChooseNetworkUM.kt
new file mode 100644
index 0000000000..8e27218757
--- /dev/null
+++ b/features/markets/impl/src/main/kotlin/com/tangem/features/markets/portfolio/add/impl/ui/state/ChooseNetworkUM.kt
@@ -0,0 +1,9 @@
+package com.tangem.features.markets.portfolio.add.impl.ui.state
+
+import com.tangem.core.ui.components.rows.model.BlockchainRowUM
+import kotlinx.collections.immutable.ImmutableList
+
+data class ChooseNetworkUM(
+ val networks: ImmutableList,
+ val onNetworkClick: (BlockchainRowUM) -> Unit,
+)
\ No newline at end of file