From 9bcc68222d392c01b53c85e0247cd336a4016fd3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 7 Jul 2026 17:40:34 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../core/ui/ds/tabs/TangemSegmentedPicker.kt | 6 +++++ .../portfolioblock/ui/PortfolioBlock.kt | 19 ++++++++++++--- .../feed/ui/market/list/components/Options.kt | 8 ++++++- .../ui/components/TokenDetailsBalanceBlock.kt | 24 ++++++++++++------- .../wallet/ui/components/WalletItemBlocks.kt | 10 +++++++- .../ui/components/common/WalletBalance.kt | 17 ++++++++++++- .../ui/components/common/WalletTopBar.kt | 16 +++++++++---- 7 files changed, 81 insertions(+), 19 deletions(-) diff --git a/core/ui/src/main/java/com/tangem/core/ui/ds/tabs/TangemSegmentedPicker.kt b/core/ui/src/main/java/com/tangem/core/ui/ds/tabs/TangemSegmentedPicker.kt index e8cf99da89..54d5069530 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/ds/tabs/TangemSegmentedPicker.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/ds/tabs/TangemSegmentedPicker.kt @@ -29,6 +29,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachIndexed import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreviewRedesign import com.tangem.utils.extensions.indexOfFirstOrNull @@ -281,6 +283,7 @@ private fun Segment( modifier: Modifier = Modifier, minSegmentWidth: Dp = Dp.Unspecified, ) { + val hapticManager = LocalHapticManager.current Box( modifier = modifier .defaultMinSize(minWidth = minSegmentWidth) @@ -288,6 +291,9 @@ private fun Segment( indication = null, interactionSource = remember { MutableInteractionSource() }, ) { + if (selectedIndex.value != index) { + hapticManager.perform(TangemHapticEffect.View.SegmentTick) + } selectedIndex.value = index onClick() }, diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolioblock/ui/PortfolioBlock.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolioblock/ui/PortfolioBlock.kt index 22a447786c..77df065ac6 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolioblock/ui/PortfolioBlock.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/components/market/details/portfolioblock/ui/PortfolioBlock.kt @@ -35,6 +35,8 @@ import com.tangem.core.ui.ds.row.TangemRowContainer import com.tangem.core.ui.ds.row.TangemRowLayoutId import com.tangem.core.ui.ds2.fade.TangemFade import com.tangem.core.ui.extensions.* +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.res.LocalWindowSize import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreviewRedesign @@ -96,6 +98,7 @@ internal fun PortfolioBlock(state: PortfolioBlockUM, modifier: Modifier = Modifi @Composable private fun ContentBlock(state: PortfolioBlockUM.Content, modifier: Modifier = Modifier) { + val hapticManager = LocalHapticManager.current FloatingCard(modifier = modifier) { TangemRowContainer(modifier = Modifier.clickableSingle(onClick = state.onRowClick)) { Text( @@ -128,7 +131,10 @@ private fun ContentBlock(state: PortfolioBlockUM.Content, modifier: Modifier = M iconPosition = TangemButtonIconPosition.Start, shape = TangemButtonShape.Rounded, size = TangemButtonSize.X9, - onClick = state.onAddFundsClick, + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + state.onAddFundsClick() + }, ), ) @@ -144,7 +150,10 @@ private fun ContentBlock(state: PortfolioBlockUM.Content, modifier: Modifier = M ), shape = TangemButtonShape.Rounded, size = TangemButtonSize.X9, - onClick = state.onRowClick, + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + state.onRowClick() + }, ), ) } @@ -153,6 +162,7 @@ private fun ContentBlock(state: PortfolioBlockUM.Content, modifier: Modifier = M @Composable private fun AddTokenBlock(state: PortfolioBlockUM.AddToken, modifier: Modifier = Modifier) { + val hapticManager = LocalHapticManager.current FloatingCard(modifier = modifier) { Row( modifier = Modifier @@ -189,7 +199,10 @@ private fun AddTokenBlock(state: PortfolioBlockUM.AddToken, modifier: Modifier = text = resourceReference(R.string.common_add), shape = TangemButtonShape.Rounded, size = TangemButtonSize.X9, - onClick = state.onAddClick, + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + state.onAddClick() + }, ), ) } diff --git a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/ui/market/list/components/Options.kt b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/ui/market/list/components/Options.kt index 104d4fef3f..a69b65bd57 100644 --- a/features/feed/impl/src/main/kotlin/com/tangem/features/feed/ui/market/list/components/Options.kt +++ b/features/feed/impl/src/main/kotlin/com/tangem/features/feed/ui/market/list/components/Options.kt @@ -19,6 +19,8 @@ import com.tangem.core.ui.ds.image.TangemIconUM import com.tangem.core.ui.ds.tabs.TangemSegmentUM import com.tangem.core.ui.ds.tabs.TangemSegmentedPicker import com.tangem.core.ui.extensions.resolveReference +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.res.LocalRedesignEnabled import com.tangem.core.ui.res.TangemTheme import com.tangem.features.feed.impl.R @@ -117,6 +119,7 @@ private fun OptionsV2( modifier: Modifier = Modifier, ) { var isShowDropdownMenu by rememberSaveable { mutableStateOf(false) } + val hapticManager = LocalHapticManager.current val segmentItems = remember { persistentListOf( @@ -147,7 +150,10 @@ private fun OptionsV2( horizontalArrangement = Arrangement.SpaceBetween, ) { PrimaryInverseTangemButton( - onClick = { isShowDropdownMenu = true }, + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + isShowDropdownMenu = true + }, iconPosition = RedesignTangemButtonIconPosition.End, tangemIconUM = TangemIconUM.Icon( iconRes = R.drawable.ic_chewron_down_20, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt index a74d169214..427c7c7b30 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenDetailsBalanceBlock.kt @@ -14,11 +14,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider @@ -35,11 +35,9 @@ import com.tangem.core.ui.ds.button.TangemButtonType import com.tangem.core.ui.ds.button.TangemButtonUM import com.tangem.core.ui.ds.button.action.ActionButtons import com.tangem.core.ui.ds.image.TangemIconUM -import com.tangem.core.ui.extensions.TextReference -import com.tangem.core.ui.extensions.orMaskWithStars -import com.tangem.core.ui.extensions.resolveAnnotatedReference -import com.tangem.core.ui.extensions.resolveReference -import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.* +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreviewRedesign import com.tangem.core.ui.test.TokenDetailsScreenTestTags @@ -47,6 +45,7 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenBala import com.tangem.feature.tokendetails.presentation.tokendetails.state.TokenDetailsBalanceBlockUM import com.tangem.features.tokendetails.impl.R import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentList private val CurrencyIconSize: Dp = 70.dp private val NetworkBadgeSize: Dp = 24.dp @@ -90,16 +89,25 @@ internal fun TokenDetailsBalanceBlock( } if (!balanceBlockUM.isBalanceZeroContent()) { SpacerH(TangemTheme.dimens2.x10) + val hapticManager = LocalHapticManager.current val buttons = remember( balanceBlockUM.addFundsButton, balanceBlockUM.swapButton, balanceBlockUM.transferButton, + hapticManager, ) { persistentListOf( balanceBlockUM.addFundsButton, balanceBlockUM.swapButton, balanceBlockUM.transferButton, - ) + ).map { button -> + button.copy( + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + button.onClick() + }, + ) + }.toPersistentList() } ActionButtons(buttons = buttons) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/WalletItemBlocks.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/WalletItemBlocks.kt index 05924d40c5..31d053f08a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/WalletItemBlocks.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/WalletItemBlocks.kt @@ -5,6 +5,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import com.tangem.core.ui.ds.button.TangemButton import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.test.MainScreenTestTags import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.wallet.state.model.WalletUM @@ -31,13 +33,19 @@ internal fun LazyListScope.organizeTokens2(state: WalletUM, itemModifier: Modifi key = "OrganizeTokensButton", contentType = "OrganizeTokensButton", ) { + val hapticManager = LocalHapticManager.current val testTag = if (organizeButton.text == resourceReference(R.string.main_add_and_manage_tokens)) { MainScreenTestTags.ADD_AND_MANAGE_BUTTON } else { MainScreenTestTags.ORGANIZE_TOKENS_BUTTON } TangemButton( - buttonUM = organizeButton, + buttonUM = organizeButton.copy( + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + organizeButton.onClick() + }, + ), modifier = itemModifier.testTag(testTag), ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletBalance.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletBalance.kt index 562d21f546..ceb9e0f51b 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletBalance.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletBalance.kt @@ -12,6 +12,7 @@ import androidx.compose.foundation.text.TextAutoSize import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -37,6 +38,8 @@ import com.tangem.core.ui.ds.topbar.collapsing.TangemCollapsingAppBarBehavior import com.tangem.core.ui.ds.topbar.collapsing.rememberTangemExitUntilCollapsedScrollBehavior import com.tangem.core.ui.ds.topbar.collapsing.snapToExitUntilCollapsed import com.tangem.core.ui.extensions.* +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.LocalHapticManager import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreviewRedesign import com.tangem.core.ui.test.MainScreenTestTags @@ -47,6 +50,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletAdditiona import com.tangem.feature.wallet.presentation.wallet.state.model.WalletBalanceUM import com.tangem.utils.StringsSigns import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList private const val MIN_SCALE = 0.75f private const val MAX_SCALE = 1f @@ -64,6 +68,17 @@ internal fun WalletBalance( val alpha = 1f - collapsedFraction val scale = alpha.coerceIn(MIN_SCALE, MAX_SCALE) val density = LocalDensity.current + val hapticManager = LocalHapticManager.current + val hapticButtons = remember(buttons, hapticManager) { + buttons.map { button -> + button.copy( + onClick = { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + button.onClick() + }, + ) + }.toImmutableList() + } Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -99,7 +114,7 @@ internal fun WalletBalance( } } SpacerH(TangemTheme.dimens2.x2) - ActionButtons(buttons, modifier = Modifier.fillMaxWidth()) + ActionButtons(buttons = hapticButtons, modifier = Modifier.fillMaxWidth()) SpacerH(TangemTheme.dimens2.x6) } } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletTopBar.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletTopBar.kt index b03fc85b81..da656845e9 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletTopBar.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/common/WalletTopBar.kt @@ -28,10 +28,8 @@ import com.tangem.core.ui.ds.topbar.collapsing.rememberTangemExitUntilCollapsedS import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.orMaskWithStars import com.tangem.core.ui.extensions.stringReference -import com.tangem.core.ui.res.LocalRootBackgroundColor -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.res.TangemThemePreview -import com.tangem.core.ui.res.TangemThemePreviewRedesign +import com.tangem.core.ui.haptic.TangemHapticEffect +import com.tangem.core.ui.res.* import com.tangem.core.ui.test.MainScreenTestTags import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.presentation.common.WalletPreviewDataLegacy @@ -58,6 +56,7 @@ internal fun WalletTopBar( isBalanceHidden: Boolean, behavior: TangemCollapsingAppBarBehavior, ) { + val hapticManager = LocalHapticManager.current Surface( color = Color.Unspecified, contentColor = Color.Unspecified, @@ -95,7 +94,14 @@ internal fun WalletTopBar( ) { topBarConfig.endActions.forEach { action -> TangemTopBarActionContent( - action, + action.copy( + onClick = action.onClick?.let { onClick -> + { + hapticManager.perform(TangemHapticEffect.View.ContextClick) + onClick() + } + }, + ), modifier = Modifier.testTag(MainScreenTestTags.MORE_BUTTON), ) }