Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-19 16:53:39 +03:00
parent d30abc9aea
commit 4a9062821b
7 changed files with 27 additions and 23 deletions

View file

@ -47,14 +47,15 @@ inline fun <reified T> SegmentedButtons(
selectedColor: Color = TangemTheme.colors.background.action,
dividerColor: Color = TangemTheme.colors.stroke.primary,
showIndication: Boolean = true,
selectedItem: T? = null,
initialSelectedItem: T? = null,
isEnabled: Boolean = true,
crossinline buttonContent: @Composable (T) -> Unit,
) {
if (config.isEmpty() || config.size == 1) return
var selected by remember {
val selectedIndex = if (selectedItem == null) 0 else config.indexOf(selectedItem)
mutableIntStateOf(selectedIndex)
var selectedIndex by remember {
val index = if (initialSelectedItem == null) 0 else config.indexOf(initialSelectedItem)
mutableIntStateOf(index)
}
Row(
@ -69,7 +70,7 @@ inline fun <reified T> SegmentedButtons(
val rightRadius = if (index == config.lastIndex) TangemTheme.dimens.radius26 else TangemTheme.dimens.radius0
val animateColor by animateColorAsState(
targetValue = if (index == selected) selectedColor else color,
targetValue = if (index == selectedIndex) selectedColor else color,
label = "Segmented Button Selected Color Animation",
animationSpec = spring(stiffness = Spring.StiffnessMedium),
)
@ -86,11 +87,12 @@ inline fun <reified T> SegmentedButtons(
),
)
.clickable(
enabled = isEnabled,
interactionSource = remember { MutableInteractionSource() },
indication = if (showIndication) LocalIndication.current else null,
) {
selectedIndex = index
onClick(config[index])
selected = index
},
) {
buttonContent.invoke(config[index])

View file

@ -93,7 +93,7 @@ private fun SegmentSeedBlock(state: SegmentSeedState, modifier: Modifier = Modif
SegmentedButtons(
modifier = modifier.padding(horizontal = TangemTheme.dimens.spacing76),
config = state.seedSegments,
selectedItem = state.selectedSeedType,
initialSelectedItem = state.selectedSeedType,
onClick = {
state.onSelectType(it)
},

View file

@ -48,6 +48,7 @@ internal sealed class SendStates {
val walletBalance: TextReference,
val tokenIconState: TokenIconState,
val segmentedButtonConfig: PersistentList<SendAmountSegmentedButtonsConfig>,
val isSegmentedButtonsEnabled: Boolean,
val amountTextField: SendTextField.AmountField,
val notifications: ImmutableList<SendNotification>,
val appCurrencyCode: String,

View file

@ -42,22 +42,19 @@ internal class SendAmountStateConverter(
isFeeLoading = false,
appCurrencyCode = appCurrency.code,
subtractedFee = null,
segmentedButtonConfig = if (status.value.fiatRate.isNullOrZero()) {
persistentListOf()
} else {
persistentListOf(
SendAmountSegmentedButtonsConfig(
title = stringReference(status.currency.symbol),
iconState = iconStateConverter.convert(status),
isFiat = false,
),
SendAmountSegmentedButtonsConfig(
title = stringReference(appCurrency.code),
iconUrl = appCurrency.iconSmallUrl,
isFiat = true,
),
)
},
segmentedButtonConfig = persistentListOf(
SendAmountSegmentedButtonsConfig(
title = stringReference(status.currency.symbol),
iconState = iconStateConverter.convert(status),
isFiat = false,
),
SendAmountSegmentedButtonsConfig(
title = stringReference(appCurrency.code),
iconUrl = appCurrency.iconSmallUrl,
isFiat = true,
),
),
isSegmentedButtonsEnabled = !status.value.fiatRate.isNullOrZero(),
)
}
}

View file

@ -49,6 +49,7 @@ internal object AmountStatePreviewData {
isError = false,
error = TextReference.EMPTY,
),
isSegmentedButtonsEnabled = true,
)
val fiatAmountState = amountState.copy(

View file

@ -29,6 +29,7 @@ internal fun LazyListScope.buttons(
segmentedButtonConfig: PersistentList<SendAmountSegmentedButtonsConfig>,
clickIntents: SendClickIntents,
isMaxButtonEnabled: Boolean,
isSegmentedButtonsEnabled: Boolean,
) {
item(
key = AMOUNT_BUTTONS_KEY,
@ -48,6 +49,7 @@ internal fun LazyListScope.buttons(
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
clickIntents.onCurrencyChangeClick(it.isFiat)
},
isEnabled = isSegmentedButtonsEnabled,
) {
SendAmountCurrencyButton(it)
}

View file

@ -36,6 +36,7 @@ internal fun SendAmountContent(
segmentedButtonConfig = amountState.segmentedButtonConfig,
clickIntents = clickIntents,
isMaxButtonEnabled = !amountState.isFeeLoading,
isSegmentedButtonsEnabled = amountState.isSegmentedButtonsEnabled,
)
notifications(amountState.notifications)
}