Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-17 13:29:44 +03:00
parent e8a2b10e6f
commit c1900053f7
27 changed files with 270 additions and 107 deletions

View file

@ -9,11 +9,11 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.common.ui.amountScreen.ui.amountField
import com.tangem.common.ui.amountScreen.ui.buttons
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.preview.AmountScreenClickIntentsStub
import com.tangem.common.ui.amountScreen.preview.AmountStatePreviewData
import com.tangem.common.ui.amountScreen.ui.amountField
import com.tangem.common.ui.amountScreen.ui.buttons
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
@ -25,6 +25,8 @@ import com.tangem.core.ui.res.TangemThemePreview
*/
@Composable
fun AmountScreenContent(amountState: AmountState, isBalanceHiding: Boolean, clickIntents: AmountScreenClickIntents) {
if (amountState !is AmountState.Data) return
// Do not put fillMaxSize() in here
LazyColumn(
modifier = Modifier

View file

@ -5,21 +5,24 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.Transformer
/**
* Selected currency change from crypto currency to app currency and vice versa
*
* @property cryptoCurrencyStatusProvider current cryptocurrency status provider
* @property cryptoCurrencyStatus current cryptocurrency status
* @property value is crypto currency or app currency
*/
class AmountCurrencyTransformer(
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
) : Transformer<AmountState, Boolean> {
override fun transform(prevState: AmountState, value: Boolean): AmountState {
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val value: Boolean,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
val amountTextField = prevState.amountTextField
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
val isValidFiatRate = cryptoCurrencyStatus.value.fiatRate.isNullOrZero()
val isDoneActionEnabled = prevState.isPrimaryButtonEnabled

View file

@ -6,8 +6,10 @@ import com.tangem.utils.transformer.Transformer
/**
* Dismisses indication on pasted value
*/
class AmountPastedTriggerDismissTransformer : Transformer<AmountState, Boolean> {
override fun transform(prevState: AmountState, value: Boolean): AmountState {
class AmountPastedTriggerDismissTransformer : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
return prevState.copy(
amountTextField = prevState.amountTextField.copy(
isValuePasted = false,

View file

@ -8,7 +8,6 @@ import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.Transformer
import java.math.BigDecimal
@ -16,13 +15,16 @@ import java.math.BigDecimal
/**
* Reduces amount by specific value
*
* @property cryptoCurrencyStatusProvider current cryptocurrency status provider
* @property cryptoCurrencyStatus current cryptocurrency status
* @property value reduced by value
*/
class AmountReduceByTransformer(
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
) : Transformer<AmountState, AmountReduceByTransformer.ReduceByData> {
override fun transform(prevState: AmountState, value: ReduceByData): AmountState {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val value: ReduceByData,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
val amountTextField = prevState.amountTextField
val cryptoDecimals = amountTextField.cryptoAmount.decimals
val fiatDecimals = amountTextField.fiatAmount.decimals

View file

@ -8,7 +8,6 @@ import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.Transformer
import java.math.BigDecimal
@ -16,13 +15,16 @@ import java.math.BigDecimal
/**
* Reduces amount to specific value
*
* @property cryptoCurrencyStatusProvider current cryptocurrency status provider
* @property cryptoCurrencyStatus current cryptocurrency status
* @property value reduced to value
*/
class AmountReduceToTransformer(
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
) : Transformer<AmountState, BigDecimal> {
override fun transform(prevState: AmountState, value: BigDecimal): AmountState {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val value: BigDecimal,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
val amountTextField = prevState.amountTextField
val cryptoDecimals = amountTextField.cryptoAmount.decimals
val fiatDecimals = amountTextField.fiatAmount.decimals

View file

@ -52,7 +52,7 @@ class AmountStateConverter(
val crypto = formatCryptoAmount(status.value.amount, status.currency.symbol, status.currency.decimals)
val noFeeRate = status.value.fiatRate.isNullOrZero()
return AmountState(
return AmountState.Data(
walletName = userWallet.name,
walletBalance = resourceReference(R.string.send_wallet_balance_format, wrappedList(crypto, fiat)),
tokenIconState = iconStateConverter.convert(status),

View file

@ -9,7 +9,6 @@ import com.tangem.common.ui.amountScreen.utils.getFiatValue
import com.tangem.common.ui.amountScreen.utils.getKeyboardAction
import com.tangem.core.ui.utils.parseToBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.Transformer
import java.math.BigDecimal
@ -17,14 +16,17 @@ import java.math.BigDecimal
/**
* Amount value change
*
* @property cryptoCurrencyStatusProvider current cryptocurrency status provider
* @property cryptoCurrencyStatus current cryptocurrency status
* @property value amount value
*/
class AmountFieldChangeTransformer(
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
) : Transformer<AmountState, String> {
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
private val value: String,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
override fun transform(prevState: AmountState, value: String): AmountState {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
val amountTextField = prevState.amountTextField
if (value.isEmpty()) return prevState.emptyState()
@ -67,7 +69,7 @@ class AmountFieldChangeTransformer(
)
}
private fun AmountState.emptyState(): AmountState {
private fun AmountState.Data.emptyState(): AmountState.Data {
return copy(
isPrimaryButtonEnabled = false,
amountTextField = amountTextField.copy(

View file

@ -6,7 +6,6 @@ import androidx.compose.ui.text.input.KeyboardType
import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.utils.Provider
import com.tangem.utils.isNullOrZero
import com.tangem.utils.transformer.Transformer
import java.math.RoundingMode
@ -14,14 +13,15 @@ import java.math.RoundingMode
/**
* Selects maximum amount value
*
* @property cryptoCurrencyStatusProvider current cryptocurrency status provider
* @property cryptoCurrencyStatus current cryptocurrency status
*/
class AmountFieldMaxAmountTransformer(
private val cryptoCurrencyStatusProvider: Provider<CryptoCurrencyStatus>,
) : Transformer<AmountState, Unit> {
private val cryptoCurrencyStatus: CryptoCurrencyStatus,
) : Transformer<AmountState> {
override fun transform(prevState: AmountState): AmountState {
if (prevState !is AmountState.Data) return prevState
override fun transform(prevState: AmountState, value: Unit): AmountState {
val cryptoCurrencyStatus = cryptoCurrencyStatusProvider()
val amountTextField = prevState.amountTextField
val cryptoDecimals = amountTextField.cryptoAmount.decimals

View file

@ -5,28 +5,36 @@ import com.tangem.core.ui.components.currency.tokenicon.TokenIconState
import com.tangem.core.ui.extensions.TextReference
import kotlinx.collections.immutable.PersistentList
/**
* Model for amount state
*
* @param isPrimaryButtonEnabled indicates if next state button enabled
* @param walletName user wallet name
* @param walletBalance user crypto currency balance in wallet
* @param tokenIconState crypto currency icon state
* @param segmentedButtonConfig currency switcher config
* @param selectedButton selected currency index
* @param isSegmentedButtonsEnabled indicates if currency switches is enabled
* @param amountTextField amount field state
* @param appCurrencyCode app currency code
*/
/** Model for amount state */
@Stable
data class AmountState(
val isPrimaryButtonEnabled: Boolean,
val walletName: String,
val walletBalance: TextReference,
val tokenIconState: TokenIconState,
val segmentedButtonConfig: PersistentList<AmountSegmentedButtonsConfig>,
val selectedButton: Int,
val isSegmentedButtonsEnabled: Boolean,
val amountTextField: AmountFieldModel,
val appCurrencyCode: String,
)
sealed class AmountState {
abstract val isPrimaryButtonEnabled: Boolean
/**
* @param isPrimaryButtonEnabled indicates if next state button enabled
* @param walletName user wallet name
* @param walletBalance user crypto currency balance in wallet
* @param tokenIconState crypto currency icon state
* @param segmentedButtonConfig currency switcher config
* @param selectedButton selected currency index
* @param isSegmentedButtonsEnabled indicates if currency switches is enabled
* @param amountTextField amount field state
* @param appCurrencyCode app currency code
*/
data class Data(
override val isPrimaryButtonEnabled: Boolean,
val walletName: String,
val walletBalance: TextReference,
val tokenIconState: TokenIconState,
val segmentedButtonConfig: PersistentList<AmountSegmentedButtonsConfig>,
val selectedButton: Int,
val isSegmentedButtonsEnabled: Boolean,
val amountTextField: AmountFieldModel,
val appCurrencyCode: String,
) : AmountState()
data class Empty(
override val isPrimaryButtonEnabled: Boolean = false,
) : AmountState()
}

View file

@ -15,7 +15,7 @@ import java.math.BigDecimal
object AmountStatePreviewData {
val amountState = AmountState(
val amountState = AmountState.Data(
isPrimaryButtonEnabled = false,
walletName = "Family Wallet",
walletBalance = stringReference("2 130,88 USDT (2 129,92 \$)"),

View file

@ -21,7 +21,7 @@ import com.tangem.utils.Strings.STARS
private const val AMOUNT_FIELD_KEY = "amountFieldKey"
internal fun LazyListScope.amountField(
amountState: AmountState,
amountState: AmountState.Data,
isBalanceHiding: Boolean,
modifier: Modifier = Modifier,
) {