From e8b81f400dc60ba54d3e992ab62e0c07150cadc8 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 6 Jun 2023 14:06:14 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../presentation/common/WalletPreviewData.kt | 16 ++++ .../common/state/NetworkGroupState.kt | 23 +++++ .../common/state/TokenListState.kt | 19 ---- .../organizetokens/OrganizeTokensScreen.kt | 88 +++++++++++++++++++ .../OrganizeTokensStateHolder.kt | 20 +++++ .../organizetokens/OrganizeTokensViewModel.kt | 22 +++++ .../router/DefaultWalletRouter.kt | 8 +- 7 files changed, 176 insertions(+), 20 deletions(-) create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/NetworkGroupState.kt create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index 619f57d8bb..40817e750e 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -4,6 +4,8 @@ import com.tangem.core.ui.R import com.tangem.feature.wallet.presentation.common.state.NetworkGroupState import com.tangem.feature.wallet.presentation.common.state.TokenItemState import com.tangem.feature.wallet.presentation.common.state.TokenItemState.TokenOptionsState +import com.tangem.feature.wallet.presentation.common.state.TokenListState +import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensStateHolder import com.tangem.feature.wallet.presentation.wallet.state.WalletCardState import com.tangem.feature.wallet.presentation.wallet.state.WalletStateHolder import kotlinx.collections.immutable.persistentListOf @@ -105,6 +107,20 @@ internal object WalletPreviewData { val loadingTokenItemState = TokenItemState.Loading(id = UUID.randomUUID().toString()) + val organizeTokensState = OrganizeTokensStateHolder( + tokens = TokenListState.GroupedByNetwork( + groups = persistentListOf(), + ), + header = OrganizeTokensStateHolder.HeaderConfig( + onSortByBalanceClick = {}, + onGroupByNetworkClick = {}, + ), + actions = OrganizeTokensStateHolder.ActionsConfig( + onApplyClick = {}, + onCancelClick = {}, + ), + ) + private val draggableTokenList = persistentListOf( tokenItemDragState.copy( id = "token_1", diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/NetworkGroupState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/NetworkGroupState.kt new file mode 100644 index 0000000000..c34fdd126d --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/NetworkGroupState.kt @@ -0,0 +1,23 @@ +package com.tangem.feature.wallet.presentation.common.state + +import androidx.compose.runtime.Immutable +import kotlinx.collections.immutable.ImmutableList + +@Immutable +internal sealed interface NetworkGroupState { + val id: String + val networkName: String + val tokens: ImmutableList + + data class Draggable( + override val id: String, + override val networkName: String, + override val tokens: ImmutableList, + ) : NetworkGroupState + + data class Content( + override val id: String, + override val networkName: String, + override val tokens: ImmutableList, + ) : NetworkGroupState +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenListState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenListState.kt index c504d1c81e..fe3b7fba46 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenListState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenListState.kt @@ -13,23 +13,4 @@ internal sealed interface TokenListState { data class Ungrouped( val tokens: ImmutableList, ) : TokenListState -} - -@Immutable -internal sealed interface NetworkGroupState { - val id: String - val networkName: String - val tokens: ImmutableList - - data class Draggable( - override val id: String, - override val networkName: String, - override val tokens: ImmutableList, - ) : NetworkGroupState - - data class Content( - override val id: String, - override val networkName: String, - override val tokens: ImmutableList, - ) : NetworkGroupState } \ No newline at end of file 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 new file mode 100644 index 0000000000..e626eb0029 --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensScreen.kt @@ -0,0 +1,88 @@ +// TODO: Remove after components implementation +@file:Suppress("UNUSED_PARAMETER") + +package com.tangem.feature.wallet.presentation.organizetokens + +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.tangem.core.ui.res.TangemTheme +import com.tangem.feature.wallet.presentation.common.WalletPreviewData +import com.tangem.feature.wallet.presentation.common.state.TokenListState + +@Composable +internal fun OrganizeTokensScreen(state: OrganizeTokensStateHolder) { + Scaffold( + topBar = { + TopBar(state.header) + }, + content = { paddingValues -> + TokenList( + state = state.tokens, + modifier = Modifier.padding(paddingValues), + ) + }, + floatingActionButtonPosition = FabPosition.Center, + floatingActionButton = { + Actions(state.actions) + }, + contentColor = TangemTheme.colors.background.primary, + ) +} + +@Composable +private fun TokenList(state: TokenListState, modifier: Modifier = Modifier) { + when (state) { + is TokenListState.GroupedByNetwork -> { + /* [REDACTED_TODO_COMMENT] */ + } + is TokenListState.Ungrouped -> { + /* [REDACTED_TODO_COMMENT] */ + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun TopBar(config: OrganizeTokensStateHolder.HeaderConfig, modifier: Modifier = Modifier) { + TopAppBar( + title = { + Text( + text = "Organize tokens", // TODO: Move to resources + style = TangemTheme.typography.subtitle1, + color = TangemTheme.colors.text.primary1, + maxLines = 1, + ) + }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = TangemTheme.colors.background.secondary, + titleContentColor = TangemTheme.colors.text.primary1, + ), + ) +} + +@Composable +private fun Actions(config: OrganizeTokensStateHolder.ActionsConfig, modifier: Modifier = Modifier) { + // TODO: Implement list apply and cancel actions +} + +// region Preview + +@Preview(showBackground = true, widthDp = 360) +@Composable +private fun OrganizeTokensScreenPreview_Light() { + TangemTheme { + OrganizeTokensScreen(state = WalletPreviewData.organizeTokensState) + } +} + +@Preview(showBackground = true, widthDp = 360) +@Composable +private fun OrganizeTokensScreenPreview_Dark() { + TangemTheme(isDark = true) { + OrganizeTokensScreen(state = WalletPreviewData.organizeTokensState) + } +} +// endregion Preview \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt new file mode 100644 index 0000000000..b9a8e797cb --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt @@ -0,0 +1,20 @@ +package com.tangem.feature.wallet.presentation.organizetokens + +import com.tangem.feature.wallet.presentation.common.state.TokenListState + +internal data class OrganizeTokensStateHolder( + val tokens: TokenListState, + val header: HeaderConfig, + val actions: ActionsConfig, +) { + + data class HeaderConfig( + val onSortByBalanceClick: () -> Unit, + val onGroupByNetworkClick: () -> Unit, + ) + + data class ActionsConfig( + val onApplyClick: () -> Unit, + val onCancelClick: () -> Unit, + ) +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt new file mode 100644 index 0000000000..16f726eab1 --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt @@ -0,0 +1,22 @@ +package com.tangem.feature.wallet.presentation.organizetokens + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import com.tangem.feature.wallet.presentation.common.WalletPreviewData +import com.tangem.feature.wallet.presentation.router.InnerWalletRouter +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlin.properties.Delegates + +@HiltViewModel +internal class OrganizeTokensViewModel @Inject constructor() : ViewModel() { + + var router: InnerWalletRouter by Delegates.notNull() + + var uiState: OrganizeTokensStateHolder by mutableStateOf(getInitialState()) + private set + + private fun getInitialState(): OrganizeTokensStateHolder = WalletPreviewData.organizeTokensState +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 74751d0c6b..f2768ed116 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -10,6 +10,8 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.wallet.presentation.WalletFragment +import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensScreen +import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensViewModel import com.tangem.feature.wallet.presentation.wallet.ui.WalletScreen import com.tangem.feature.wallet.presentation.wallet.viewmodels.WalletViewModel import kotlin.properties.Delegates @@ -35,7 +37,11 @@ internal class DefaultWalletRouter : InnerWalletRouter { composable(WalletScreens.ORGANIZE_TOKENS.name) { BackHandler(onBack = ::popBackStack) - // TODO: Add OrganizeTokensScreen + + val viewModel: OrganizeTokensViewModel = hiltViewModel() + .apply { router = this@DefaultWalletRouter } + + OrganizeTokensScreen(state = viewModel.uiState) } } }