Updated on 2026-08-14

This commit is contained in:
Tangem 2024-02-07 12:04:41 +03:00
commit 7421163341
8 changed files with 80 additions and 28 deletions

View file

@ -46,6 +46,9 @@ dependencies {
implementation(projects.core.utils)
implementation(projects.core.navigation)
/** Common */
implementation(projects.common)
/** Libs */
implementation(projects.libs.crypto)
@ -62,6 +65,8 @@ dependencies {
implementation(projects.domain.txhistory.models)
implementation(projects.domain.transaction)
implementation(projects.domain.card)
implementation(projects.domain.balanceHiding)
implementation(projects.domain.balanceHiding.models)
/** Feature modules */
implementation(projects.features.send.api)

View file

@ -95,6 +95,7 @@ internal class SendStateFactory(
currentState = MutableStateFlow(SendUiStateType.None),
event = consumedEvent(),
isEditingDisabled = false,
isBalanceHidden = false,
)
fun getReadyState(): SendUiState {
@ -115,6 +116,10 @@ internal class SendStateFactory(
isEditingDisabled = true,
)
}
fun getOnHideBalanceState(isBalanceHidden: Boolean): SendUiState {
return currentStateProvider().copy(isBalanceHidden = isBalanceHidden)
}
//endregion
//region amount state clicks

View file

@ -34,6 +34,7 @@ internal data class SendUiState(
val sendState: SendStates.SendState = SendStates.SendState(),
val recipientList: MutableStateFlow<PagingData<SendRecipientListContent>> = MutableStateFlow(PagingData.empty()),
val currentState: StateFlow<SendUiStateType>,
val isBalanceHidden: Boolean,
val event: StateEvent<SendEvent>,
)

View file

@ -90,17 +90,18 @@ private fun SendScreenContent(
) { state ->
when (state) {
SendUiStateType.Amount -> SendAmountContent(
uiState.amountState,
uiState.clickIntents,
amountState = uiState.amountState,
isBalanceHiding = uiState.isBalanceHidden,
clickIntents = uiState.clickIntents,
)
SendUiStateType.Recipient -> SendRecipientContent(
uiState.recipientState,
uiState.clickIntents,
recipientList,
uiState = uiState.recipientState,
clickIntents = uiState.clickIntents,
recipientList = recipientList,
)
SendUiStateType.Fee -> SendSpeedAndFeeContent(
uiState.feeState,
uiState.clickIntents,
state = uiState.feeState,
clickIntents = uiState.clickIntents,
)
SendUiStateType.Send -> SendContent(uiState)
else -> Unit

View file

@ -1,5 +1,6 @@
package com.tangem.features.send.impl.presentation.ui.amount
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
@ -11,13 +12,18 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.style.TextAlign
import com.tangem.common.Strings.STARS
import com.tangem.core.ui.components.currency.tokenicon.TokenIcon
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.send.impl.presentation.state.SendStates
@Composable
internal fun AmountFieldContainer(amountState: SendStates.AmountState, modifier: Modifier = Modifier) {
internal fun AmountFieldContainer(
amountState: SendStates.AmountState,
isBalanceHiding: Boolean,
modifier: Modifier = Modifier,
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier
@ -37,14 +43,21 @@ internal fun AmountFieldContainer(amountState: SendStates.AmountState, modifier:
modifier = Modifier
.padding(top = TangemTheme.dimens.spacing14),
)
Text(
text = amountState.walletBalance.resolveReference(),
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
textAlign = TextAlign.Center,
modifier = Modifier
.padding(top = TangemTheme.dimens.spacing2),
)
val balance = if (isBalanceHiding) STARS else amountState.walletBalance.resolveReference()
AnimatedContent(
targetState = balance,
label = "Hide Balance Animation",
) {
Text(
text = it,
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.tertiary,
textAlign = TextAlign.Center,
modifier = Modifier
.padding(top = TangemTheme.dimens.spacing2),
)
}
TokenIcon(
state = amountState.tokenIconState,
modifier = Modifier

View file

@ -22,13 +22,17 @@ import com.tangem.features.send.impl.presentation.state.amount.SendAmountSegment
import com.tangem.features.send.impl.presentation.viewmodel.SendClickIntents
@Composable
internal fun SendAmountContent(amountState: SendStates.AmountState?, clickIntents: SendClickIntents) {
internal fun SendAmountContent(
amountState: SendStates.AmountState?,
isBalanceHiding: Boolean,
clickIntents: SendClickIntents,
) {
if (amountState == null) return
Column(
modifier = Modifier
.background(TangemTheme.colors.background.tertiary),
) {
AmountFieldContainer(amountState = amountState)
AmountFieldContainer(amountState = amountState, isBalanceHiding = isBalanceHiding)
Row(
modifier = Modifier
.padding(

View file

@ -1,5 +1,6 @@
package com.tangem.features.send.impl.presentation.ui.send
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
@ -17,6 +18,7 @@ import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import com.tangem.common.Strings
import com.tangem.core.ui.components.inputrow.InputRowDefault
import com.tangem.core.ui.components.inputrow.InputRowImage
import com.tangem.core.ui.components.inputrow.InputRowRecipientDefault
@ -65,6 +67,7 @@ internal fun SendContent(uiState: SendUiState) {
FromWallet(
walletName = amountState.walletName,
walletBalance = amountState.walletBalance.resolveReference(),
isBalanceHidden = uiState.isBalanceHidden,
)
}
RecipientBlock(
@ -91,7 +94,7 @@ internal fun SendContent(uiState: SendUiState) {
}
@Composable
private fun FromWallet(walletName: String, walletBalance: String) {
private fun FromWallet(walletName: String, walletBalance: String, isBalanceHidden: Boolean) {
Column(
modifier = Modifier
.fillMaxWidth()
@ -110,15 +113,21 @@ private fun FromWallet(walletName: String, walletBalance: String) {
style = TangemTheme.typography.caption2,
color = TangemTheme.colors.text.secondary,
)
Text(
text = walletBalance,
style = TangemTheme.typography.body2,
color = TangemTheme.colors.text.primary1,
modifier = Modifier
.padding(
top = TangemTheme.dimens.spacing8,
),
)
val balance = if (isBalanceHidden) Strings.STARS else walletBalance
AnimatedContent(
targetState = balance,
label = "Hide Balance Animation",
) {
Text(
text = it,
style = TangemTheme.typography.body2,
color = TangemTheme.colors.text.primary1,
modifier = Modifier
.padding(
top = TangemTheme.dimens.spacing8,
),
)
}
}
}

View file

@ -13,6 +13,7 @@ import com.tangem.common.extensions.isZero
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
import com.tangem.domain.redux.LegacyAction
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.*
@ -74,6 +75,7 @@ internal class SendViewModel @Inject constructor(
private val walletManagersFacade: WalletManagersFacade,
private val reduxStateHolder: ReduxStateHolder,
private val isAmountSubtractAvailableUseCase: IsAmountSubtractAvailableUseCase,
private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
currencyChecksRepository: CurrencyChecksRepository,
isFeeApproximateUseCase: IsFeeApproximateUseCase,
getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase,
@ -163,6 +165,7 @@ internal class SendViewModel @Inject constructor(
override fun onCreate(owner: LifecycleOwner) {
subscribeOnCurrencyStatusUpdates(owner)
onStateActive()
subscribeOnBalanceHidden(owner)
}
fun setRouter(router: InnerSendRouter, stateRouter: StateRouter) {
@ -189,6 +192,17 @@ internal class SendViewModel @Inject constructor(
}
}
private fun subscribeOnBalanceHidden(owner: LifecycleOwner) {
getBalanceHidingSettingsUseCase()
.flowWithLifecycle(owner.lifecycle)
.conflate()
.distinctUntilChanged()
.onEach {
uiState = stateFactory.getOnHideBalanceState(isBalanceHidden = it.isBalanceHidden)
}
.launchIn(viewModelScope)
}
private fun getCurrenciesStatusUpdates(owner: LifecycleOwner, wallet: UserWallet) {
val isSingleWallet = wallet.scanResponse.walletData?.token != null && !wallet.isMultiCurrency