Updated on 2026-08-14
This commit is contained in:
parent
e8a2b10e6f
commit
c1900053f7
27 changed files with 270 additions and 107 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
@ -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 \$)"),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue