Updated on 2026-08-14
This commit is contained in:
parent
1ffa785bc0
commit
e910d4cb3e
11 changed files with 56 additions and 6 deletions
|
|
@ -0,0 +1,6 @@
|
|||
package com.tangem.features.managetokens.navigation
|
||||
|
||||
enum class ExpandableState {
|
||||
EXPANDED,
|
||||
COLLAPSED,
|
||||
}
|
||||
|
|
@ -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>)
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,5 +58,6 @@ internal interface InnerWalletRouter : WalletRouter {
|
|||
/** Open manage tokens screen */
|
||||
fun openManageTokensScreen()
|
||||
|
||||
/** Open scan failed dialog */
|
||||
fun openScanFailedDialog()
|
||||
}
|
||||
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue