From e86615242b20702413120cf89117db6eb18abd50 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 18 Sep 2024 11:39:10 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../components/inputrow/InputRowImageBase.kt | 6 +++-- .../components/inputrow/InputRowImageInfo.kt | 3 +++ .../inputrow/InputRowImageSelector.kt | 3 +++ .../inputrow/inner/InputRowAsyncImage.kt | 10 ++++++-- .../res/drawable/ic_staking_filled_18.xml | 9 +++++++ .../ui/StakingClaimRewardsValidatorContent.kt | 1 + .../ui/StakingInitialInfoContent.kt | 1 + .../ui/StakingValidatorListContent.kt | 6 ++--- .../ui/ValidatorImagePlaceholder.kt | 25 +++++++++++++++++++ .../presentation/ui/block/ValidatorBlock.kt | 2 ++ 10 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 core/ui/src/main/res/drawable/ic_staking_filled_18.xml create mode 100644 features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/ValidatorImagePlaceholder.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageBase.kt b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageBase.kt index 0991dcdf5a..6db1972160 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageBase.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageBase.kt @@ -39,6 +39,7 @@ import com.tangem.core.ui.res.TangemThemePreview * @param captionColor caption text color * @param isGrayscaleImage whether to display grayscale image * @param iconEndRes icon to end of row + * @param onImageError composable to show if image loading failed * @param extraContent extra content */ @Composable @@ -53,6 +54,7 @@ internal fun InputRowImageBase( iconTint: Color = TangemTheme.colors.icon.informative, isGrayscaleImage: Boolean = false, iconEndRes: Int? = null, + onImageError: (@Composable () -> Unit)? = null, extraContent: (@Composable RowScope.() -> Unit)? = null, ) { Row( @@ -63,13 +65,13 @@ internal fun InputRowImageBase( InputRowAsyncImage( imageUrl = imageUrl, isGrayscale = isGrayscaleImage, + onImageError = onImageError, modifier = Modifier .size(TangemTheme.dimens.spacing36) .clip(TangemTheme.shapes.roundedCornersXLarge), ) SpacerW12() - } - if (iconRes != null) { + } else if (iconRes != null) { Box( contentAlignment = Alignment.Center, modifier = Modifier diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageInfo.kt b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageInfo.kt index 19bb005a00..2905e007b7 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageInfo.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageInfo.kt @@ -35,6 +35,7 @@ import com.tangem.core.ui.res.TangemThemePreview * @param captionColor caption text color * @param isGrayscaleImage whether to display grayscale image * @param iconEndRes icon to end of row + * @param onImageError composable to show if image loading failed */ @Suppress("LongParameterList") @Composable @@ -52,6 +53,7 @@ fun InputRowImageInfo( iconTint: Color = TangemTheme.colors.icon.informative, isGrayscaleImage: Boolean = false, @DrawableRes iconEndRes: Int? = null, + onImageError: (@Composable () -> Unit)? = null, ) { Column( verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing6), @@ -75,6 +77,7 @@ fun InputRowImageInfo( captionColor = captionColor, isGrayscaleImage = isGrayscaleImage, iconEndRes = iconEndRes, + onImageError = onImageError, ) { Column( verticalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing2), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageSelector.kt b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageSelector.kt index 6fcc6ef997..287edc1197 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageSelector.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/InputRowImageSelector.kt @@ -41,6 +41,7 @@ import java.math.BigDecimal * @param captionColor caption text color * @param isSelected true if selected * @param selectorContent selector content + * @param onImageError composable to show if image loading failed */ @Composable fun InputRowImageSelector( @@ -52,6 +53,7 @@ fun InputRowImageSelector( subtitleColor: Color = TangemTheme.colors.text.primary1, captionColor: Color = TangemTheme.colors.text.tertiary, isSelected: Boolean = false, + onImageError: (@Composable () -> Unit)? = null, selectorContent: @Composable ((isSelected: Boolean, isEnabled: Boolean, onSelect: () -> Unit) -> Unit), ) { InputRowImageBase( @@ -60,6 +62,7 @@ fun InputRowImageSelector( imageUrl = imageUrl, subtitleColor = subtitleColor, captionColor = captionColor, + onImageError = onImageError, modifier = modifier .clickable( onClick = onSelect, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/inner/InputRowAsyncImage.kt b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/inner/InputRowAsyncImage.kt index b85e91ba30..3b46eeffc5 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/inner/InputRowAsyncImage.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/inputrow/inner/InputRowAsyncImage.kt @@ -18,9 +18,15 @@ import com.tangem.core.ui.utils.getGreyScaleColorFilter * @param imageUrl url of the image * @param modifier modifier * @param isGrayscale whether to apply grayscale filter + * @param onImageError composable to show if image loading failed */ @Composable -internal fun InputRowAsyncImage(imageUrl: String, modifier: Modifier = Modifier, isGrayscale: Boolean = false) { +internal fun InputRowAsyncImage( + imageUrl: String, + modifier: Modifier = Modifier, + isGrayscale: Boolean = false, + onImageError: (@Composable () -> Unit)? = null, +) { val (alpha, colorFilter) = getGreyScaleColorFilter(isGrayscale = isGrayscale) SubcomposeAsyncImage( modifier = modifier, @@ -33,7 +39,7 @@ internal fun InputRowAsyncImage(imageUrl: String, modifier: Modifier = Modifier, .build(), loading = { LoadingIcon() }, error = { - Box( + onImageError?.invoke() ?: Box( modifier = Modifier .background( color = TangemTheme.colors.background.tertiary, diff --git a/core/ui/src/main/res/drawable/ic_staking_filled_18.xml b/core/ui/src/main/res/drawable/ic_staking_filled_18.xml new file mode 100644 index 0000000000..e6741b6156 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_staking_filled_18.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingClaimRewardsValidatorContent.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingClaimRewardsValidatorContent.kt index cbcb806d97..fecd9f9cb6 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingClaimRewardsValidatorContent.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingClaimRewardsValidatorContent.kt @@ -52,6 +52,7 @@ internal fun StakingClaimRewardsValidatorContent( infoTitle = item.fiatAmount, infoSubtitle = item.cryptoAmount, imageUrl = item.validator?.image.orEmpty(), + onImageError = { ValidatorImagePlaceholder() }, modifier = modifier .roundedShapeItemDecoration(index, state.rewards.lastIndex, false) .background(TangemTheme.colors.background.action) diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt index 6fa945af4f..f593e3e13b 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingInitialInfoContent.kt @@ -282,6 +282,7 @@ private fun ActiveStakingBlock( imageUrl = balance.getImage(), iconRes = icon, iconTint = iconTint, + onImageError = { ValidatorImagePlaceholder() }, modifier = modifier .background(TangemTheme.colors.background.action) .clickable( diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingValidatorListContent.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingValidatorListContent.kt index 9f8db40d8e..c86ebb7e95 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingValidatorListContent.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/StakingValidatorListContent.kt @@ -3,10 +3,7 @@ package com.tangem.features.staking.impl.presentation.ui import android.content.res.Configuration import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars +import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.Icon import androidx.compose.runtime.Composable @@ -95,6 +92,7 @@ internal fun StakingValidatorListContent( ) } }, + onImageError = { ValidatorImagePlaceholder() }, ) } } diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/ValidatorImagePlaceholder.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/ValidatorImagePlaceholder.kt new file mode 100644 index 0000000000..d935c0e9ff --- /dev/null +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/ValidatorImagePlaceholder.kt @@ -0,0 +1,25 @@ +package com.tangem.features.staking.impl.presentation.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.res.vectorResource +import com.tangem.core.ui.res.TangemTheme +import com.tangem.features.staking.impl.R + +@Composable +internal fun ValidatorImagePlaceholder() { + Icon( + painter = rememberVectorPainter(ImageVector.vectorResource(R.drawable.ic_staking_filled_18)), + contentDescription = null, + tint = TangemTheme.colors.icon.inactive, + modifier = Modifier + .background(TangemTheme.colors.icon.primary1, CircleShape) + .padding(TangemTheme.dimens.size9), + ) +} \ No newline at end of file diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/block/ValidatorBlock.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/block/ValidatorBlock.kt index be7909007e..e895963463 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/block/ValidatorBlock.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/ui/block/ValidatorBlock.kt @@ -16,6 +16,7 @@ import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.utils.BigDecimalFormatter import com.tangem.features.staking.impl.R import com.tangem.features.staking.impl.presentation.state.ValidatorState +import com.tangem.features.staking.impl.presentation.ui.ValidatorImagePlaceholder import com.tangem.utils.extensions.orZero @Composable @@ -45,6 +46,7 @@ internal fun ValidatorBlock(validatorState: ValidatorState, onClick: () -> Unit) ) }, imageUrl = validatorState.chosenValidator.image.orEmpty(), + onImageError = { ValidatorImagePlaceholder() }, ) } }