diff --git a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt index ac3b9c779e..3c9fb7b2a9 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/SettingsDomainModule.kt @@ -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) } } \ No newline at end of file diff --git a/domain/settings/build.gradle.kts b/domain/settings/build.gradle.kts index 00cd0a439e..0c8b0de6e1 100644 --- a/domain/settings/build.gradle.kts +++ b/domain/settings/build.gradle.kts @@ -5,5 +5,6 @@ plugins { dependencies { implementation(deps.kotlin.coroutines) + implementation(deps.arrow.core) implementation(projects.domain.balanceHiding.models) } \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/IsSendTapHelpEnabledUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/IsSendTapHelpEnabledUseCase.kt index 1e828a0bc6..cb59249538 100644 --- a/domain/settings/src/main/java/com/tangem/domain/settings/IsSendTapHelpEnabledUseCase.kt +++ b/domain/settings/src/main/java/com/tangem/domain/settings/IsSendTapHelpEnabledUseCase.kt @@ -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() } } \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/NeverShowTapHelpUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/NeverShowTapHelpUseCase.kt new file mode 100644 index 0000000000..603c9d7402 --- /dev/null +++ b/domain/settings/src/main/java/com/tangem/domain/settings/NeverShowTapHelpUseCase.kt @@ -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) + } +} \ No newline at end of file diff --git a/domain/settings/src/main/java/com/tangem/domain/settings/NeverToShowTapHelpUseCase.kt b/domain/settings/src/main/java/com/tangem/domain/settings/NeverToShowTapHelpUseCase.kt deleted file mode 100644 index bf72970303..0000000000 --- a/domain/settings/src/main/java/com/tangem/domain/settings/NeverToShowTapHelpUseCase.kt +++ /dev/null @@ -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) -} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt new file mode 100644 index 0000000000..8423ec20eb --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/AmountStatePreviewData.kt @@ -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), + ) +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/FeeStatePreviewData.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/FeeStatePreviewData.kt new file mode 100644 index 0000000000..7cec508963 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/FeeStatePreviewData.kt @@ -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(), + ) +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/RecipientStatePreviewData.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/RecipientStatePreviewData.kt new file mode 100644 index 0000000000..f3008dc000 --- /dev/null +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/previewdata/RecipientStatePreviewData.kt @@ -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, + ) +} \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt index 1213f43797..26c0380dd5 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/AmountBlock.kt @@ -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" -} \ No newline at end of file +} + +// 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 { + override val values: Sequence + get() = sequenceOf( + AmountStatePreviewData.amountState, + ) +} +// endregion \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt index 13ff8cab42..11c2b5d8de 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt @@ -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 ) } } -} \ No newline at end of file +} + +// 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 { + + override val values: Sequence + get() = sequenceOf( + FeeStatePreviewData.feeState, + ) +} +// endregion \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/RecipientBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/RecipientBlock.kt index 7169e38f49..473d043d35 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/RecipientBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/RecipientBlock.kt @@ -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), ) } -} \ No newline at end of file +} + +// 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 { + + override val values: Sequence + get() = sequenceOf( + RecipientStatePreviewData.recipientState, + ) +} +// endregion \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt index 588ea6b0a2..bc74ced905 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/viewmodel/SendViewModel.kt @@ -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() }