Updated on 2026-08-14

This commit is contained in:
Tangem 2024-03-25 19:10:52 +05:00
parent 36f8179235
commit 35ea6dfe3c
12 changed files with 286 additions and 23 deletions

View file

@ -137,7 +137,7 @@ internal object SettingsDomainModule {
@Provides
@ViewModelScoped
fun provideNeverToShowTapHelpUseCase(settingsRepository: SettingsRepository): NeverToShowTapHelpUseCase {
return NeverToShowTapHelpUseCase(settingsRepository = settingsRepository)
fun provideNeverShowTapHelpUseCase(settingsRepository: SettingsRepository): NeverShowTapHelpUseCase {
return NeverShowTapHelpUseCase(settingsRepository = settingsRepository)
}
}

View file

@ -5,5 +5,6 @@ plugins {
dependencies {
implementation(deps.kotlin.coroutines)
implementation(deps.arrow.core)
implementation(projects.domain.balanceHiding.models)
}

View file

@ -1,5 +1,6 @@
package com.tangem.domain.settings
import arrow.core.Either
import com.tangem.domain.settings.repositories.SettingsRepository
/**
@ -9,5 +10,5 @@ import com.tangem.domain.settings.repositories.SettingsRepository
*/
class IsSendTapHelpEnabledUseCase(private val settingsRepository: SettingsRepository) {
suspend operator fun invoke(): Boolean = settingsRepository.isSendTapHelpPreviewEnabled()
suspend operator fun invoke() = Either.catch { settingsRepository.isSendTapHelpPreviewEnabled() }
}

View file

@ -0,0 +1,16 @@
package com.tangem.domain.settings
import arrow.core.Either
import com.tangem.domain.settings.repositories.SettingsRepository
/**
* Never to show tap help
*
* @property settingsRepository settings repository
*/
class NeverShowTapHelpUseCase(private val settingsRepository: SettingsRepository) {
suspend operator fun invoke() = Either.catch {
settingsRepository.setSendTapHelpPreviewAvailability(isEnabled = false)
}
}

View file

@ -1,13 +0,0 @@
package com.tangem.domain.settings
import com.tangem.domain.settings.repositories.SettingsRepository
/**
* Never to show tap help
*
* @property settingsRepository settings repository
*/
class NeverToShowTapHelpUseCase(private val settingsRepository: SettingsRepository) {
suspend operator fun invoke() = settingsRepository.setSendTapHelpPreviewAvailability(isEnabled = false)
}

View file

@ -0,0 +1,53 @@
package com.tangem.features.send.impl.presentation.state.previewdata
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import com.tangem.core.ui.components.currency.tokenicon.TokenIconState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.domain.tokens.model.Amount
import com.tangem.domain.tokens.model.AmountType
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.SendUiStateType
import com.tangem.features.send.impl.presentation.state.fields.SendTextField
import kotlinx.collections.immutable.persistentListOf
import java.math.BigDecimal
internal object AmountStatePreviewData {
val amountState = SendStates.AmountState(
type = SendUiStateType.Amount,
isPrimaryButtonEnabled = false,
walletName = "Wallet",
walletBalance = stringReference("123.123"),
tokenIconState = TokenIconState.Loading,
segmentedButtonConfig = persistentListOf(),
amountTextField = SendTextField.AmountField(
value = "123.123123123123123123",
onValueChange = {},
keyboardOptions = KeyboardOptions.Default,
keyboardActions = KeyboardActions.Default,
cryptoAmount = Amount(
currencySymbol = "ETH",
value = BigDecimal(123.123),
decimals = 18,
type = AmountType.CoinType,
),
fiatAmount = Amount(
currencySymbol = "$",
value = BigDecimal(123.123),
decimals = 2,
type = AmountType.CoinType,
),
isFiatValue = false,
fiatValue = "123.123",
isFiatUnavailable = false,
isError = false,
error = TextReference.EMPTY,
),
)
val fiatAmountState = amountState.copy(
amountTextField = amountState.amountTextField.copy(isFiatValue = true),
)
}

View file

@ -0,0 +1,52 @@
package com.tangem.features.send.impl.presentation.state.previewdata
import com.tangem.blockchain.common.Amount
import com.tangem.blockchain.common.AmountType.Coin
import com.tangem.blockchain.common.transaction.Fee
import com.tangem.blockchain.common.transaction.TransactionFee
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.SendUiStateType
import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState
import com.tangem.features.send.impl.presentation.state.fee.FeeType
import kotlinx.collections.immutable.persistentListOf
import java.math.BigDecimal
internal object FeeStatePreviewData {
val feeState = SendStates.FeeState(
type = SendUiStateType.Amount,
isPrimaryButtonEnabled = false,
feeSelectorState = FeeSelectorState.Content(
fees = TransactionFee.Single(
normal = Fee.Common(
amount = Amount(
currencySymbol = "ETH",
value = BigDecimal(123.123),
decimals = 18,
type = Coin,
),
),
),
selectedFee = FeeType.Market,
customValues = persistentListOf(),
),
fee = Fee.Common(
amount = Amount(
currencySymbol = "ETH",
value = BigDecimal(123.123),
decimals = 18,
type = Coin,
),
),
rate = null,
appCurrency = AppCurrency(
code = "USD",
name = "USD",
symbol = "$",
iconSmallUrl = null,
iconMediumUrl = null,
),
isFeeApproximate = false,
notifications = persistentListOf(),
)
}

View file

@ -0,0 +1,28 @@
package com.tangem.features.send.impl.presentation.state.previewdata
import androidx.compose.foundation.text.KeyboardOptions
import com.tangem.core.ui.extensions.stringReference
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.fields.SendTextField
import kotlinx.collections.immutable.persistentListOf
internal object RecipientStatePreviewData {
val recipientState = SendStates.RecipientState(
addressTextField = SendTextField.RecipientAddress(
value = "0x23948239805671983476598176",
onValueChange = {},
keyboardOptions = KeyboardOptions.Default,
placeholder = stringReference("Placeholder"),
label = stringReference("Recipient"),
isError = false,
error = null,
),
memoTextField = null,
recent = persistentListOf(),
wallets = persistentListOf(),
network = "Ethereum",
isValidating = false,
isPrimaryButtonEnabled = true,
)
}

View file

@ -11,10 +11,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.core.ui.components.ResizableText
import com.tangem.core.ui.components.currency.tokenicon.TokenIcon
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.previewdata.AmountStatePreviewData
@Composable
internal fun AmountBlock(
@ -75,4 +79,43 @@ internal fun AmountBlock(
private fun getAmountWithSymbol(amount: String, symbol: String): String {
return "$amount $symbol"
}
}
// region Preview
@Preview
@Composable
private fun AmountBlockPreview_Light(
@PreviewParameter(AmountBlockPreviewProvider::class) value: SendStates.AmountState,
) {
TangemTheme {
AmountBlock(
amountState = value,
isSuccess = false,
isEditingDisabled = false,
onClick = {},
)
}
}
@Preview
@Composable
private fun AmountBlockPreview_Dark(
@PreviewParameter(AmountBlockPreviewProvider::class) value: SendStates.AmountState,
) {
TangemTheme(isDark = true) {
AmountBlock(
amountState = value,
isSuccess = true,
isEditingDisabled = false,
onClick = {},
)
}
}
private class AmountBlockPreviewProvider : PreviewParameterProvider<SendStates.AmountState> {
override val values: Sequence<SendStates.AmountState>
get() = sequenceOf(
AmountStatePreviewData.amountState,
)
}
// endregion

View file

@ -15,6 +15,9 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.core.ui.components.atoms.text.EllipsisText
import com.tangem.core.ui.components.atoms.text.TextEllipsis
import com.tangem.core.ui.res.TangemTheme
@ -23,6 +26,7 @@ import com.tangem.features.send.impl.R
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.fee.FeeSelectorState
import com.tangem.features.send.impl.presentation.state.fee.FeeType
import com.tangem.features.send.impl.presentation.state.previewdata.FeeStatePreviewData
@Composable
internal fun FeeBlock(feeState: SendStates.FeeState, isSuccess: Boolean, onClick: () -> Unit) {
@ -93,4 +97,38 @@ internal fun FeeBlock(feeState: SendStates.FeeState, isSuccess: Boolean, onClick
)
}
}
}
}
// region Preview
@Preview
@Composable
private fun FeeBlockPreview_Light(@PreviewParameter(FeeBlockPreviewProvider::class) value: SendStates.FeeState) {
TangemTheme {
FeeBlock(
feeState = value,
isSuccess = true,
onClick = {},
)
}
}
@Preview
@Composable
private fun FeeBlockPreview_Dark(@PreviewParameter(FeeBlockPreviewProvider::class) value: SendStates.FeeState) {
TangemTheme(isDark = true) {
FeeBlock(
feeState = value,
isSuccess = true,
onClick = {},
)
}
}
private class FeeBlockPreviewProvider : PreviewParameterProvider<SendStates.FeeState> {
override val values: Sequence<SendStates.FeeState>
get() = sequenceOf(
FeeStatePreviewData.feeState,
)
}
// endregion

View file

@ -10,11 +10,15 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.tangem.core.ui.components.icons.identicon.IdentIcon
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.send.impl.presentation.state.SendStates
import com.tangem.features.send.impl.presentation.state.fields.SendTextField
import com.tangem.features.send.impl.presentation.state.previewdata.RecipientStatePreviewData
@Composable
internal fun RecipientBlock(
@ -88,4 +92,44 @@ private fun MemoBlock(memo: SendTextField.RecipientMemo?) {
modifier = Modifier.padding(top = TangemTheme.dimens.spacing8),
)
}
}
}
// region Preview
@Preview
@Composable
private fun RecipientBlockPreview_Light(
@PreviewParameter(RecipientBlockPreviewProvider::class) value: SendStates.RecipientState,
) {
TangemTheme {
RecipientBlock(
recipientState = value,
isSuccess = true,
isEditingDisabled = false,
onClick = {},
)
}
}
@Preview
@Composable
private fun RecipientBlockPreview_Dark(
@PreviewParameter(RecipientBlockPreviewProvider::class) value: SendStates.RecipientState,
) {
TangemTheme(isDark = true) {
RecipientBlock(
recipientState = value,
isSuccess = true,
isEditingDisabled = false,
onClick = {},
)
}
}
private class RecipientBlockPreviewProvider : PreviewParameterProvider<SendStates.RecipientState> {
override val values: Sequence<SendStates.RecipientState>
get() = sequenceOf(
RecipientStatePreviewData.recipientState,
)
}
// endregion

View file

@ -17,7 +17,7 @@ import com.tangem.domain.qrscanning.usecases.ParseQrCodeUseCase
import com.tangem.domain.redux.LegacyAction
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.settings.IsSendTapHelpEnabledUseCase
import com.tangem.domain.settings.NeverToShowTapHelpUseCase
import com.tangem.domain.settings.NeverShowTapHelpUseCase
import com.tangem.domain.tokens.*
import com.tangem.domain.tokens.error.CurrencyStatusError
import com.tangem.domain.tokens.model.CryptoCurrency
@ -88,7 +88,7 @@ internal class SendViewModel @Inject constructor(
private val analyticsEventHandler: AnalyticsEventHandler,
private val parseQrCodeUseCase: ParseQrCodeUseCase,
private val isSendTapHelpEnabledUseCase: IsSendTapHelpEnabledUseCase,
private val neverToShowTapHelpUseCase: NeverToShowTapHelpUseCase,
private val neverShowTapHelpUseCase: NeverShowTapHelpUseCase,
currencyChecksRepository: CurrencyChecksRepository,
isFeeApproximateUseCase: IsFeeApproximateUseCase,
getExplorerTransactionUrlUseCase: GetExplorerTransactionUrlUseCase,
@ -295,7 +295,7 @@ internal class SendViewModel @Inject constructor(
private fun getTapHelpPreviewAvailability() {
viewModelScope.launch(dispatchers.main) {
isTapHelpPreviewEnabled = isSendTapHelpEnabledUseCase()
isTapHelpPreviewEnabled = isSendTapHelpEnabledUseCase().getOrElse { false }
}
}
@ -831,7 +831,7 @@ internal class SendViewModel @Inject constructor(
private fun setNeverToShowTapHelp() {
viewModelScope.launch(dispatchers.main) {
neverToShowTapHelpUseCase()
neverShowTapHelpUseCase()
}
uiState = stateFactory.getHiddenTapHelpState()
}