diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/TokenListItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/TokenListItem.kt index 1a4d6d8dae..34bd4345fa 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/TokenListItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/TokenListItem.kt @@ -8,7 +8,6 @@ import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.fields.SearchBar import com.tangem.core.ui.components.token.TokenItem import com.tangem.core.ui.components.tokenlist.internal.GroupTitleItem -import com.tangem.core.ui.components.tokenlist.internal.NetworkTitleItem import com.tangem.core.ui.components.tokenlist.state.TokensListItemUM import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme @@ -25,9 +24,6 @@ import com.tangem.core.ui.res.TangemTheme @Composable fun TokenListItem(state: TokensListItemUM, isBalanceHidden: Boolean, modifier: Modifier = Modifier) { when (state) { - is TokensListItemUM.NetworkGroupTitle -> { - NetworkTitleItem(networkName = state.name.resolveReference(), modifier = modifier) - } is TokensListItemUM.GroupTitle -> { GroupTitleItem(state, modifier) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/GroupTitleItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/GroupTitleItem.kt index c79e40c723..a3f882b7ba 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/GroupTitleItem.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/GroupTitleItem.kt @@ -1,12 +1,32 @@ package com.tangem.core.ui.components.tokenlist.internal +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider +import com.tangem.core.ui.R import com.tangem.core.ui.components.rows.NetworkTitle import com.tangem.core.ui.components.tokenlist.state.TokensListItemUM +import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreview +import org.burnoutcrew.reorderable.ReorderableLazyListState +import org.burnoutcrew.reorderable.detectReorder +import org.burnoutcrew.reorderable.rememberReorderableLazyListState /** * Group title item @@ -18,14 +38,90 @@ import com.tangem.core.ui.res.TangemTheme */ @Composable fun GroupTitleItem(state: TokensListItemUM.GroupTitle, modifier: Modifier = Modifier) { + BaseGroupTitleItem(text = state.text, modifier = modifier) +} + +/** + * Draggable network group item + * + * @param state state + * @param reorderableTokenListState reorderable token list state + * @param modifier modifier + */ +@Composable +fun DraggableGroupTitleItem( + state: TokensListItemUM.GroupTitle, + reorderableTokenListState: ReorderableLazyListState, + modifier: Modifier = Modifier, +) { + BaseGroupTitleItem( + text = state.text, + modifier = modifier, + action = { DraggableIcon(reorderableTokenListState = reorderableTokenListState) }, + ) +} + +@Composable +private fun BaseGroupTitleItem( + text: TextReference, + modifier: Modifier = Modifier, + action: (@Composable BoxScope.() -> Unit)? = null, +) { NetworkTitle( title = { Text( - text = state.text.resolveReference(), + text = text.resolveReference(), style = TangemTheme.typography.subtitle2, color = TangemTheme.colors.text.tertiary, ) }, modifier = modifier, + action = action, ) -} \ No newline at end of file +} + +@Composable +private fun DraggableIcon(reorderableTokenListState: ReorderableLazyListState) { + Box( + modifier = Modifier.detectReorder(reorderableTokenListState), + contentAlignment = Alignment.Center, + ) { + Icon( + painter = rememberVectorPainter( + image = ImageVector.vectorResource(id = R.drawable.ic_group_drop_24), + ), + contentDescription = null, + tint = TangemTheme.colors.icon.informative, + ) + } +} + +@Preview(showBackground = true, widthDp = 360) +@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun NetworkTitleItemPreview(@PreviewParameter(GroupTitleItemProvider::class) isDraggable: Boolean) { + TangemThemePreview { + val state = TokensListItemUM.GroupTitle( + id = 1, + text = resourceReference( + id = R.string.wallet_network_group_title, + formatArgs = wrappedList(resourceReference(id = R.string.main_tokens)), + ), + ) + + if (isDraggable) { + DraggableGroupTitleItem( + state = state, + reorderableTokenListState = rememberReorderableLazyListState(onMove = { _, _ -> }), + modifier = Modifier.background(color = TangemTheme.colors.background.primary), + ) + } else { + GroupTitleItem( + state = state, + modifier = Modifier.background(color = TangemTheme.colors.background.primary), + ) + } + } +} + +private object GroupTitleItemProvider : CollectionPreviewParameterProvider(collection = listOf(true, false)) \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/NetworkTitleItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/NetworkTitleItem.kt deleted file mode 100644 index 49003dd2f6..0000000000 --- a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/internal/NetworkTitleItem.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.tangem.core.ui.components.tokenlist.internal - -import android.content.res.Configuration -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider -import com.tangem.core.ui.R -import com.tangem.core.ui.components.rows.NetworkTitle -import com.tangem.core.ui.extensions.stringResourceSafe -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.res.TangemThemePreview -import org.burnoutcrew.reorderable.ReorderableLazyListState -import org.burnoutcrew.reorderable.detectReorder -import org.burnoutcrew.reorderable.rememberReorderableLazyListState - -/** - * Network title item - * - * @param networkName network name - * @param modifier modifier - */ -@Composable -internal fun NetworkTitleItem(networkName: String, modifier: Modifier = Modifier) { - BaseNetworkTitleItem(networkName = networkName, modifier = modifier) -} - -/** - * Draggable network title item - * - * @param networkName network name - * @param reorderableTokenListState reorderable token list state - * @param modifier modifier - */ -@Composable -fun DraggableNetworkTitleItem( - networkName: String, - reorderableTokenListState: ReorderableLazyListState, - modifier: Modifier = Modifier, -) { - BaseNetworkTitleItem( - networkName = networkName, - modifier = modifier, - action = { DraggableIcon(reorderableTokenListState = reorderableTokenListState) }, - ) -} - -@Composable -private fun BaseNetworkTitleItem( - networkName: String, - modifier: Modifier = Modifier, - action: (@Composable BoxScope.() -> Unit)? = null, -) { - NetworkTitle( - title = { - Text( - text = stringResourceSafe(id = R.string.wallet_network_group_title, networkName), - style = TangemTheme.typography.subtitle2, - color = TangemTheme.colors.text.tertiary, - ) - }, - modifier = modifier, - action = action, - ) -} - -@Composable -private fun DraggableIcon(reorderableTokenListState: ReorderableLazyListState) { - Box( - modifier = Modifier.detectReorder(reorderableTokenListState), - contentAlignment = Alignment.Center, - ) { - Icon( - painter = rememberVectorPainter( - image = ImageVector.vectorResource(id = R.drawable.ic_group_drop_24), - ), - contentDescription = null, - tint = TangemTheme.colors.icon.informative, - ) - } -} - -@Preview(showBackground = true, widthDp = 360) -@Preview(showBackground = true, widthDp = 360, uiMode = Configuration.UI_MODE_NIGHT_YES) -@Composable -private fun NetworkTitleItemPreview(@PreviewParameter(NetworkTitleItemProvider::class) isDraggable: Boolean) { - TangemThemePreview { - if (isDraggable) { - DraggableNetworkTitleItem( - networkName = "Ethereum", - reorderableTokenListState = rememberReorderableLazyListState(onMove = { _, _ -> }), - modifier = Modifier.background(color = TangemTheme.colors.background.primary), - ) - } else { - NetworkTitleItem( - networkName = "Ethereum", - modifier = Modifier.background(color = TangemTheme.colors.background.primary), - ) - } - } -} - -private object NetworkTitleItemProvider : CollectionPreviewParameterProvider(collection = listOf(true, false)) \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/state/TokensListItemUM.kt b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/state/TokensListItemUM.kt index 23332310aa..9b0e9235ed 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/state/TokensListItemUM.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/tokenlist/state/TokensListItemUM.kt @@ -23,15 +23,6 @@ sealed interface TokensListItemUM { val searchBarUM: SearchBarUM, ) : TokensListItemUM - /** - * Network group title - * - * @property id id - * @property name network group name - */ - @Deprecated("Use GroupTitle instead") // TODO: [REDACTED_JIRA] - data class NetworkGroupTitle(override val id: Int, val name: TextReference) : TokensListItemUM - /** * Group title * diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt index fcff8bb806..614ce24018 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/preview/WalletScreenPreviewData.kt @@ -33,15 +33,9 @@ internal object WalletScreenPreviewData { private val textContentTokensState = WalletTokensListState.ContentState.Content( items = persistentListOf( - TokensListItemUM.NetworkGroupTitle( - id = 1, - name = stringReference("Bitcoin"), - ), + TokensListItemUM.GroupTitle(id = 1, text = stringReference("Network Bitcoin")), TokensListItemUM.Token(state = tokenItemState), - TokensListItemUM.NetworkGroupTitle( - id = 2, - name = stringReference("Ethereum"), - ), + TokensListItemUM.GroupTitle(id = 2, text = stringReference("Network Ethereum")), TokensListItemUM.Token( state = tokenItemState.copy( id = "2", diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt index 8f283624b4..9a09f58f26 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt @@ -31,7 +31,7 @@ import com.tangem.core.ui.components.SecondaryButton import com.tangem.core.ui.components.buttons.actions.ActionButtonConfig import com.tangem.core.ui.components.buttons.actions.RoundedActionButton import com.tangem.core.ui.components.token.TokenItem -import com.tangem.core.ui.components.tokenlist.internal.DraggableNetworkTitleItem +import com.tangem.core.ui.components.tokenlist.internal.DraggableGroupTitleItem import com.tangem.core.ui.event.EventEffect import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.stringResourceSafe @@ -176,10 +176,10 @@ private fun LazyItemScope.DraggableItem( val modifierWithBackground = itemModifier.background(color = TangemTheme.colors.background.primary) when (item) { - is DraggableItem.GroupHeader -> DraggableNetworkTitleItem( - modifier = modifierWithBackground, - networkName = item.networkName, + is DraggableItem.GroupHeader -> DraggableGroupTitleItem( + state = item.groupTitle, reorderableTokenListState = reorderableState, + modifier = modifierWithBackground, ) is DraggableItem.Token -> TokenItem( modifier = modifierWithBackground, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/DraggableItem.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/DraggableItem.kt index 37387e16c8..b3443ebd3f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/DraggableItem.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/DraggableItem.kt @@ -2,6 +2,10 @@ package com.tangem.feature.wallet.presentation.organizetokens.model import androidx.compose.runtime.Immutable import com.tangem.core.ui.components.token.state.TokenItemState +import com.tangem.core.ui.components.tokenlist.state.TokensListItemUM +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.wrappedList +import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.organizetokens.model.DraggableItem.RoundingMode /** @@ -30,7 +34,16 @@ internal sealed class DraggableItem { val networkName: String, override val roundingMode: RoundingMode = RoundingMode.None, override val showShadow: Boolean = false, - ) : DraggableItem() + ) : DraggableItem() { + + val groupTitle = TokensListItemUM.GroupTitle( + id = id, + text = resourceReference( + id = R.string.wallet_network_group_title, + formatArgs = wrappedList(networkName), + ), + ) + } /** * Item for token. diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletTokensListState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletTokensListState.kt index 8dddf4cecc..196ec4d3ba 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletTokensListState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletTokensListState.kt @@ -3,7 +3,8 @@ package com.tangem.feature.wallet.presentation.wallet.state.model import androidx.compose.runtime.Immutable import com.tangem.core.ui.components.token.state.TokenItemState import com.tangem.core.ui.components.tokenlist.state.TokensListItemUM -import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.wrappedList import com.tangem.feature.wallet.impl.R import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -30,7 +31,13 @@ internal sealed class WalletTokensListState { data object Locked : ContentState() { override val items = persistentListOf( - TokensListItemUM.NetworkGroupTitle(id = 42, name = TextReference.Res(id = R.string.main_tokens)), + TokensListItemUM.GroupTitle( + id = 42, + text = resourceReference( + id = R.string.wallet_network_group_title, + formatArgs = wrappedList(resourceReference(id = R.string.main_tokens)), + ), + ), TokensListItemUM.Token(state = TokenItemState.Locked(id = "Locked#1")), ) override val organizeTokensButtonConfig = null diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenListStateConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenListStateConverter.kt index 11f5063820..c3d4c02d9c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenListStateConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TokenListStateConverter.kt @@ -2,7 +2,8 @@ package com.tangem.feature.wallet.presentation.wallet.state.transformers.convert import com.tangem.common.ui.tokens.TokenItemStateConverter import com.tangem.core.ui.components.tokenlist.state.TokensListItemUM -import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.wrappedList import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.common.util.cardTypesResolver import com.tangem.domain.tokens.model.CryptoCurrencyStatus @@ -10,6 +11,7 @@ import com.tangem.domain.tokens.model.NetworkGroup import com.tangem.domain.tokens.model.TokenList import com.tangem.domain.tokens.model.TotalFiatBalance import com.tangem.domain.wallets.models.UserWallet +import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.wallet.state.model.WalletTokensListState import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents import com.tangem.utils.converter.Converter @@ -60,9 +62,12 @@ internal class TokenListStateConverter( } private fun MutableList.addGroup(group: NetworkGroup): List { - val groupTitle = TokensListItemUM.NetworkGroupTitle( + val groupTitle = TokensListItemUM.GroupTitle( id = group.network.hashCode(), - name = stringReference(group.network.name), + text = resourceReference( + id = R.string.wallet_network_group_title, + formatArgs = wrappedList(group.network.name), + ), ) add(groupTitle)