diff --git a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ExpandableState.kt b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ExpandableState.kt new file mode 100644 index 0000000000..34048e6f11 --- /dev/null +++ b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ExpandableState.kt @@ -0,0 +1,6 @@ +package com.tangem.features.managetokens.navigation + +enum class ExpandableState { + EXPANDED, + COLLAPSED, +} \ No newline at end of file diff --git a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensUi.kt b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensUi.kt index 7e5c95da12..f200ab6a3c 100644 --- a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensUi.kt +++ b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/navigation/ManageTokensUi.kt @@ -1,10 +1,12 @@ package com.tangem.features.managetokens.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.State import androidx.compose.ui.unit.Dp interface ManageTokensUi { + @Suppress("TopLevelComposableFunctions") @Composable - fun Content(onHeaderSizeChange: (Dp) -> Unit) + fun Content(onHeaderSizeChange: (Dp) -> Unit, state: State) } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt index 961253bf87..eab841b41f 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/state/previewdata/ManageTokensStatePreviewData.kt @@ -5,7 +5,7 @@ import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.event.consumedEvent import com.tangem.managetokens.presentation.common.state.previewdata.ChooseWalletStatePreviewData -import com.tangem.managetokens.presentation.managetokens.state.AddCustomTokenButton +import com.tangem.managetokens.presentation.managetokens.state.* import com.tangem.managetokens.presentation.managetokens.state.ManageTokensState import com.tangem.managetokens.presentation.managetokens.state.SearchBarState import com.tangem.managetokens.presentation.managetokens.state.TokenItemState diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt index 09ced5cf54..11467bfa98 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/managetokens/viewmodels/ManageTokensViewModel.kt @@ -1,8 +1,6 @@ package com.tangem.managetokens.presentation.managetokens.viewmodels -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.paging.PagingData @@ -21,6 +19,7 @@ import com.tangem.domain.wallets.models.UserWalletId import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase import com.tangem.domain.wallets.usecase.GetWalletsUseCase import com.tangem.domain.wallets.usecase.SelectWalletUseCase +import com.tangem.features.managetokens.navigation.ExpandableState import com.tangem.managetokens.presentation.common.analytics.ManageTokens import com.tangem.managetokens.presentation.common.state.AlertState import com.tangem.managetokens.presentation.common.state.Event @@ -75,6 +74,8 @@ internal class ManageTokensViewModel @Inject constructor( var uiState: ManageTokensState by mutableStateOf(stateFactory.getInitialState(flowOf(PagingData.from(emptyList())))) private set + private var expandableState: ExpandableState = ExpandableState.COLLAPSED + private val currenciesListJobHolder: JobHolder = JobHolder() private val debouncer = Debouncer() @@ -129,10 +130,16 @@ internal class ManageTokensViewModel @Inject constructor( } } + fun setExpandableState(state: State) { + expandableState = state.value + } + private suspend fun subscribeToCurrencies(userWallets: List) { wallets = CopyOnWriteArrayList(userWallets.filter { it.isMultiCurrency && !it.isLocked }) combine(wallets.map { getCurrenciesUseCase.invoke(it.walletId).distinctUntilChanged() }) { + if (expandableState == ExpandableState.EXPANDED) return@combine + allAddedCurrencies.clear() addedCurrenciesByWallet.clear() diff --git a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/ManageTokensUiImpl.kt b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/ManageTokensUiImpl.kt index 3dd460d06f..9bcf70872f 100644 --- a/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/ManageTokensUiImpl.kt +++ b/features/manage-tokens/impl/src/main/java/com/tangem/managetokens/presentation/router/ManageTokensUiImpl.kt @@ -1,8 +1,10 @@ package com.tangem.managetokens.presentation.router import androidx.compose.runtime.Composable +import androidx.compose.runtime.State import androidx.compose.ui.unit.Dp import androidx.hilt.navigation.compose.hiltViewModel +import com.tangem.features.managetokens.navigation.ExpandableState import com.tangem.features.managetokens.navigation.ManageTokensUi import com.tangem.managetokens.presentation.managetokens.ui.ManageTokensScreen import com.tangem.managetokens.presentation.managetokens.viewmodels.ManageTokensViewModel @@ -11,8 +13,9 @@ import javax.inject.Inject internal class ManageTokensUiImpl @Inject constructor() : ManageTokensUi { @Composable - override fun Content(onHeaderSizeChange: (Dp) -> Unit) { + override fun Content(onHeaderSizeChange: (Dp) -> Unit, state: State) { val viewModel = hiltViewModel() + viewModel.setExpandableState(state) ManageTokensScreen( state = viewModel.uiState, 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 54ca84fe4d..5ae3d34992 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 @@ -28,6 +28,7 @@ import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensScree 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 com.tangem.features.managetokens.navigation.ExpandableState import com.tangem.features.managetokens.navigation.ManageTokensUi import com.tangem.features.tokendetails.navigation.TokenDetailsRouter import kotlin.properties.Delegates @@ -62,10 +63,13 @@ internal class DefaultWalletRouter( state = viewModel.uiState.collectAsStateWithLifecycle().value, bottomSheetHeaderHeightProvider = { bottomSheetHeaderHeight }, bottomSheetContent = { + val state = remember { mutableStateOf(ExpandableState.COLLAPSED) } // Manage Tokens manageTokensUi.Content( onHeaderSizeChange = { bottomSheetHeaderHeight = it }, + state = state, ) + viewModel.setExpandableState(state) }, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt index 9cfd2fe858..a8b311b067 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt @@ -58,5 +58,6 @@ internal interface InnerWalletRouter : WalletRouter { /** Open manage tokens screen */ fun openManageTokensScreen() + /** Open scan failed dialog */ fun openScanFailedDialog() } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt index f9e1705b63..e8c3c9114c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/WalletStateController.kt @@ -1,5 +1,6 @@ package com.tangem.feature.wallet.presentation.wallet.state +import androidx.compose.runtime.mutableStateOf import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.event.consumedEvent import com.tangem.domain.wallets.models.UserWalletId @@ -11,6 +12,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.transformers.CloseBot import com.tangem.feature.wallet.presentation.wallet.state.transformers.OpenBottomSheetTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.WalletScreenStateTransformer import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles +import com.tangem.features.managetokens.navigation.ExpandableState import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -86,6 +88,7 @@ internal class WalletStateController @Inject constructor( event = consumedEvent(), isHidingMode = false, manageTokenRedesignToggle = manageTokensFeatureToggles.isRedesignedScreenEnabled, + manageTokensExpandableState = mutableStateOf(ExpandableState.EXPANDED), ) } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt index b4a5a8dc25..5c9424f9ee 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletScreenState.kt @@ -1,10 +1,13 @@ package com.tangem.feature.wallet.presentation.wallet.state.model +import androidx.compose.runtime.MutableState import com.tangem.core.ui.event.StateEvent +import com.tangem.features.managetokens.navigation.ExpandableState import kotlinx.collections.immutable.ImmutableList internal data class WalletScreenState( val onBackClick: () -> Unit, + val manageTokensExpandableState: MutableState, val topBarConfig: WalletTopBarConfig, val selectedWalletIndex: Int, val wallets: ImmutableList, diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt index 803458c2fb..9d6dc72199 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/WalletScreen.kt @@ -53,6 +53,7 @@ import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.VisaTxDe import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.balancesAndLimitsBlock import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.depositButton import com.tangem.feature.wallet.presentation.wallet.ui.utils.changeWalletAnimator +import com.tangem.features.managetokens.navigation.ExpandableState import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.launch @@ -264,6 +265,7 @@ private fun BaseScaffoldManageTokenRedesign( BottomSheetStateEffects( bottomSheetState = bottomSheetState, + state = state, showManageTokensBottomSheet = showManageTokensBottomSheet, alertConfig = alertConfig, keyboardShown = keyboardShown, @@ -370,9 +372,11 @@ private fun BottomSheetScrim(color: Color, visible: Boolean, onDismissRequest: ( } @OptIn(ExperimentalMaterial3Api::class) +@Suppress("CyclomaticComplexMethod") @Composable private fun BottomSheetStateEffects( bottomSheetState: SheetState, + state: WalletScreenState, showManageTokensBottomSheet: Boolean, alertConfig: WalletAlertState?, keyboardShown: State, @@ -437,6 +441,15 @@ private fun BottomSheetStateEffects( } } } + + val isSheetHidden = bottomSheetState.targetValue == SheetValue.PartiallyExpanded + LaunchedEffect(isSheetHidden) { + if (isSheetHidden) { + state.manageTokensExpandableState.value = ExpandableState.COLLAPSED + } else { + state.manageTokensExpandableState.value = ExpandableState.EXPANDED + } + } } /** diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt index 6c4a46d2ee..f710ba4c16 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt @@ -1,5 +1,6 @@ package com.tangem.feature.wallet.presentation.wallet.viewmodels +import androidx.compose.runtime.MutableState import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -26,6 +27,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.transformers.* import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletEventSender import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents +import com.tangem.features.managetokens.navigation.ExpandableState import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.JobHolder @@ -81,6 +83,12 @@ internal class WalletViewModel @Inject constructor( clickIntents.initialize(router, viewModelScope) } + fun setExpandableState(state: MutableState) { + stateHolder.update { + it.copy(manageTokensExpandableState = state) + } + } + fun subscribeToLifecycle(lifecycleOwner: LifecycleOwner) { lifecycleOwner.lifecycle.addObserver(screenLifecycleProvider) }