Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-20 14:25:35 +02:00
parent 0979d1b71b
commit d8749a859f
7 changed files with 52 additions and 49 deletions

View file

@ -48,6 +48,7 @@ import com.tangem.features.feed.components.market.details.portfolioblock.Portfol
import com.tangem.features.feed.model.market.details.MarketsTokenDetailsModel
import com.tangem.features.feed.model.market.details.analytics.MarketDetailsAnalyticsEvent
import com.tangem.features.feed.model.market.details.state.TokenNetworksState
import com.tangem.features.feed.ui.LocalIsOpenedInBottomSheet
import com.tangem.features.feed.ui.market.detailed.MarketsTokenDetailsContent
import com.tangem.features.feed.ui.market.detailed.MarketsTokenDetailsTopBar
import kotlinx.coroutines.flow.collectLatest
@ -192,7 +193,11 @@ internal class DefaultMarketsTokenDetailsComponent(
.padding(TangemTheme.dimens2.x2_5),
)
},
type = TangemTopBarType.BottomSheet,
type = if (LocalIsOpenedInBottomSheet.current) {
TangemTopBarType.BottomSheet
} else {
TangemTopBarType.Default
},
)
} else {
MarketsTokenDetailsTopBar(

View file

@ -32,6 +32,7 @@ import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.markets.TokenMarketParams
import com.tangem.domain.news.model.NewsListConfig
import com.tangem.features.feed.model.news.details.NewsDetailsModel
import com.tangem.features.feed.ui.LocalIsOpenedInBottomSheet
import com.tangem.features.feed.ui.news.details.NewsDetailsContent
import com.tangem.features.feed.ui.news.details.state.ArticlesStateUM
import kotlinx.serialization.Serializable
@ -49,7 +50,11 @@ internal class DefaultNewsDetailsComponent(
val state by newsDetailsModel.state.collectAsStateWithLifecycle()
if (LocalRedesignEnabled.current) {
TangemTopBar(
type = TangemTopBarType.BottomSheet,
type = if (LocalIsOpenedInBottomSheet.current) {
TangemTopBarType.BottomSheet
} else {
TangemTopBarType.Default
},
startContent = {
Icon(
imageVector = ImageVector.vectorResource(id = R.drawable.ic_arrow_back_28),

View file

@ -33,6 +33,7 @@ import com.tangem.core.ui.res.LocalRedesignEnabled
import com.tangem.core.ui.res.TangemTheme
import com.tangem.domain.news.model.NewsListConfig
import com.tangem.features.feed.model.news.list.NewsListModel
import com.tangem.features.feed.ui.LocalIsOpenedInBottomSheet
import com.tangem.features.feed.ui.news.list.NewsListContent
import kotlinx.serialization.Serializable
@ -51,7 +52,11 @@ internal class DefaultNewsListComponent(
TangemTopBar(
modifier = Modifier.background(background.copy(alpha = .95f)),
title = resourceReference(R.string.common_news),
type = TangemTopBarType.BottomSheet,
type = if (LocalIsOpenedInBottomSheet.current) {
TangemTopBarType.BottomSheet
} else {
TangemTopBarType.Default
},
startContent = {
Icon(
imageVector = ImageVector.vectorResource(id = R.drawable.ic_arrow_back_28),

View file

@ -21,6 +21,7 @@ import com.tangem.core.ui.ds.topbar.TangemTopBarType
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.markets.TokenMarketParams
import com.tangem.features.feed.model.search.SearchModel
import com.tangem.features.feed.ui.LocalIsOpenedInBottomSheet
import com.tangem.features.feed.ui.search.SearchContent
import com.tangem.features.feed.ui.search.state.SearchCallbacks
@ -50,7 +51,11 @@ internal class DefaultSearchComponent(
}
TangemTopBar(
type = TangemTopBarType.BottomSheet,
type = if (LocalIsOpenedInBottomSheet.current) {
TangemTopBarType.BottomSheet
} else {
TangemTopBarType.Default
},
reserveSlotSpace = false,
content = {
TangemSearchField(

View file

@ -39,6 +39,8 @@ import dev.chrisbanes.haze.rememberHazeState
*/
internal val LocalContentTopFadeHeightOverride = compositionLocalOf<MutableState<Dp?>?> { null }
internal val LocalIsOpenedInBottomSheet = staticCompositionLocalOf { true }
@OptIn(ExperimentalDecomposeApi::class)
@Composable
internal fun EntryContent(
@ -48,22 +50,22 @@ internal fun EntryContent(
onExpandSheet: () -> Unit,
isOpenedInBottomSheet: Boolean,
) {
if (LocalRedesignEnabled.current) {
EntryContentV2(
bottomSheetState = bottomSheetState,
stackState = stackState,
onHeaderSizeChange = onHeaderSizeChange,
onExpandSheet = onExpandSheet,
isOpenedInBottomSheet = isOpenedInBottomSheet,
)
} else {
EntryContentV1(
bottomSheetState = bottomSheetState,
stackState = stackState,
onHeaderSizeChange = onHeaderSizeChange,
onExpandSheet = onExpandSheet,
isOpenedInBottomSheet = isOpenedInBottomSheet,
)
CompositionLocalProvider(LocalIsOpenedInBottomSheet provides isOpenedInBottomSheet) {
if (LocalRedesignEnabled.current) {
EntryContentV2(
bottomSheetState = bottomSheetState,
stackState = stackState,
onHeaderSizeChange = onHeaderSizeChange,
onExpandSheet = onExpandSheet,
)
} else {
EntryContentV1(
bottomSheetState = bottomSheetState,
stackState = stackState,
onHeaderSizeChange = onHeaderSizeChange,
onExpandSheet = onExpandSheet,
)
}
}
}
@ -73,11 +75,11 @@ private fun EntryContentV1(
stackState: State<ChildStack<FeedEntryChildFactory.Child, ComposableModularBottomSheetContentComponent>>,
onHeaderSizeChange: (Dp) -> Unit,
onExpandSheet: () -> Unit,
isOpenedInBottomSheet: Boolean,
) {
val density = LocalDensity.current
val background = LocalMainBottomSheetColor.current.value
val stackAnimation = remember { contentFeedEntryStackAnimation() }
val isOpenedInBottomSheet = LocalIsOpenedInBottomSheet.current
Surface(contentColor = background) {
Scaffold(
@ -135,13 +137,12 @@ private fun EntryContentV2(
stackState: State<ChildStack<FeedEntryChildFactory.Child, ComposableModularBottomSheetContentComponent>>,
onHeaderSizeChange: (Dp) -> Unit,
onExpandSheet: () -> Unit,
isOpenedInBottomSheet: Boolean,
) {
val background = LocalMainBottomSheetColor.current.value
var topBarHeight by remember { mutableStateOf(0.dp) }
val hazeState = rememberHazeState()
val fadeHeightOverride = remember { mutableStateOf<Dp?>(null) }
val statusBarInset = if (isOpenedInBottomSheet) {
val statusBarInset = if (LocalIsOpenedInBottomSheet.current) {
0.dp
} else {
WindowInsets.statusBars.asPaddingValues().calculateTopPadding()
@ -170,7 +171,6 @@ private fun EntryContentV2(
onHeaderSizeChange(dp)
topBarHeight = dp
},
isOpenedInBottomSheet = isOpenedInBottomSheet,
onExpandSheet = onExpandSheet,
)
}
@ -183,12 +183,12 @@ private fun BoxScope.TitleBlock(
bottomSheetState: State<BottomSheetState>,
stackState: State<ChildStack<FeedEntryChildFactory.Child, ComposableModularBottomSheetContentComponent>>,
onTopBarHeightChang: (Dp) -> Unit,
isOpenedInBottomSheet: Boolean,
onExpandSheet: () -> Unit,
modifier: Modifier = Modifier,
) {
val density = LocalDensity.current
val animationAppBar = remember(stackState) { topBarFeedEntryAnimatedContentTransitionSpec(stackState) }
val isOpenedInBottomSheet = LocalIsOpenedInBottomSheet.current
Box(
modifier = modifier

View file

@ -23,6 +23,7 @@ import com.tangem.core.ui.extensions.conditional
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.LocalRedesignEnabled
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.feed.ui.LocalIsOpenedInBottomSheet
import com.tangem.features.feed.ui.feed.state.FeedListSearchBar
@Composable
@ -97,7 +98,7 @@ private fun FeedSearchBarV2(
modifier = modifier,
startContent = startContent,
endContent = endContent,
type = TangemTopBarType.BottomSheet,
type = if (LocalIsOpenedInBottomSheet.current) TangemTopBarType.BottomSheet else TangemTopBarType.Default,
reserveSlotSpace = false,
content = {
Row(

View file

@ -2,37 +2,18 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.ui
import android.content.res.Configuration
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.text.TextAutoSize
import androidx.compose.foundation.text.appendInlineContent
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.Placeholder
import androidx.compose.ui.text.PlaceholderVerticalAlign
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.text.*
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
@ -44,6 +25,7 @@ import androidx.compose.ui.unit.sp
import androidx.compose.ui.util.fastForEach
import com.tangem.common.ui.account.AccountIcon
import com.tangem.common.ui.account.AccountIconUM
import com.tangem.core.ui.R
import com.tangem.core.ui.components.account.AccountIconSize
import com.tangem.core.ui.components.dropdownmenu.TangemDropdownItem
import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenu
@ -72,7 +54,7 @@ internal fun TokenDetailsTopBar(topAppBarUM: TokenDetailsTopAppBarUM, modifier:
startContent = {
TangemTopBarActionContent(
actionUM = TangemTopBarActionUM(
iconRes = CoreUiR.drawable.ic_back_24,
iconRes = R.drawable.ic_arrow_back_28,
onClick = topAppBarUM.onBackClick,
ghostModeProgress = 1f,
),