Updated on 2026-08-14

This commit is contained in:
Tangem 2024-03-01 09:00:22 +01:00
parent 1ffa785bc0
commit e910d4cb3e
11 changed files with 56 additions and 6 deletions

View file

@ -0,0 +1,6 @@
package com.tangem.features.managetokens.navigation
enum class ExpandableState {
EXPANDED,
COLLAPSED,
}

View file

@ -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<ExpandableState>)
}

View file

@ -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

View file

@ -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>) {
expandableState = state.value
}
private suspend fun subscribeToCurrencies(userWallets: List<UserWallet>) {
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()

View file

@ -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<ExpandableState>) {
val viewModel = hiltViewModel<ManageTokensViewModel>()
viewModel.setExpandableState(state)
ManageTokensScreen(
state = viewModel.uiState,

View file

@ -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)
},
)
}

View file

@ -58,5 +58,6 @@ internal interface InnerWalletRouter : WalletRouter {
/** Open manage tokens screen */
fun openManageTokensScreen()
/** Open scan failed dialog */
fun openScanFailedDialog()
}

View file

@ -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),
)
}
}

View file

@ -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<ExpandableState>,
val topBarConfig: WalletTopBarConfig,
val selectedWalletIndex: Int,
val wallets: ImmutableList<WalletState>,

View file

@ -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<Keyboard>,
@ -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
}
}
}
/**

View file

@ -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<ExpandableState>) {
stateHolder.update {
it.copy(manageTokensExpandableState = state)
}
}
fun subscribeToLifecycle(lifecycleOwner: LifecycleOwner) {
lifecycleOwner.lifecycle.addObserver(screenLifecycleProvider)
}