diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/RememberExt.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/RememberExt.kt new file mode 100644 index 0000000000..db2968926e --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/RememberExt.kt @@ -0,0 +1,30 @@ +package com.tangem.core.ui.extensions + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalHapticFeedback + +private typealias Action = () -> Unit + +/** + * Returns action with Haptic Feedback + * + * @param state of the content + * @param hapticType haptic effect + * @param onAction action that needs haptic feedback + */ +@Composable +fun rememberHapticFeedback( + state: Any, + onAction: () -> Unit, + hapticType: HapticFeedbackType = HapticFeedbackType.LongPress, +): Action { + val hapticFeedback = LocalHapticFeedback.current + return remember(state) { + { + hapticFeedback.performHapticFeedback(hapticType) + onAction.invoke() + } + } +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index 53c4e086ce..c782a3c61a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -182,6 +182,17 @@ internal object WalletPreviewData { id = UUID.randomUUID().toString(), icon = tokenIconState, name = "Polygon", + onItemClick = {}, + onItemLongClick = {}, + ) + } + + val tokenItemNoAddressState by lazy { + TokenItemState.NoAddress( + id = UUID.randomUUID().toString(), + icon = tokenIconState, + name = "Polygon", + onItemLongClick = {}, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt index 14b4a2065a..a306e8bad2 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt @@ -9,11 +9,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.composed -import androidx.compose.ui.hapticfeedback.HapticFeedbackType -import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider @@ -21,6 +18,7 @@ import androidx.constraintlayout.compose.ConstrainedLayoutReference import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.ConstraintLayoutScope import androidx.constraintlayout.compose.Dimension +import com.tangem.core.ui.extensions.rememberHapticFeedback import com.tangem.core.ui.res.TangemTheme import com.tangem.feature.wallet.presentation.common.WalletPreviewData import com.tangem.feature.wallet.presentation.common.component.token.TokenCryptoInfoBlock @@ -102,21 +100,36 @@ private fun Modifier.constrainAsOptionsItem(scope: ConstraintLayoutScope, ref: C private fun Modifier.tokenClickable(state: TokenItemState): Modifier = composed { when (state) { is TokenItemState.Content -> { - val hapticFeedback = LocalHapticFeedback.current - val onLongClick = remember(state) { - { - hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) - state.onItemLongClick() - } - } - + val onLongClick = rememberHapticFeedback( + state = state, + onAction = state.onItemLongClick, + ) this.combinedClickable( onClick = state.onItemClick, onLongClick = onLongClick, ) } + is TokenItemState.Unreachable -> { + val onLongClick = rememberHapticFeedback( + state = state, + onAction = state.onItemLongClick, + ) + this.combinedClickable( + onClick = state.onItemClick, + onLongClick = onLongClick, + ) + } + is TokenItemState.NoAddress -> { + val onLongClick = rememberHapticFeedback( + state = state, + onAction = state.onItemLongClick, + ) + this.combinedClickable( + onClick = {}, + onLongClick = onLongClick, + ) + } is TokenItemState.Draggable, - is TokenItemState.Unreachable, is TokenItemState.Loading, is TokenItemState.Locked, -> this @@ -144,6 +157,7 @@ private class TokenConfigProvider : CollectionPreviewParameterProvider if (state.tokenOptions.isBalanceHidden) STARS else state.amount is TokenItemState.Draggable -> state.info.resolveReference() - is TokenItemState.Unreachable -> null + is TokenItemState.Unreachable, + is TokenItemState.NoAddress, + -> null }, ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenFiatInfoBlock.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenFiatInfoBlock.kt index 8c9f6db9fa..74a07725c8 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenFiatInfoBlock.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/token/TokenFiatInfoBlock.kt @@ -38,6 +38,7 @@ internal fun TokenFiatInfoBlock( ) } is TokenItemState.Unreachable -> UnreachableBlock(modifier = modifier) + is TokenItemState.NoAddress -> NoAddressBlock(modifier = modifier) is TokenItemState.Loading -> LoadingBlock(modifier = modifier) is TokenItemState.Locked -> LockedBlock(modifier = modifier) } @@ -154,6 +155,16 @@ private fun UnreachableBlock(modifier: Modifier = Modifier) { ) } +@Composable +private fun NoAddressBlock(modifier: Modifier = Modifier) { + Text( + modifier = modifier, + text = stringResource(id = R.string.common_no_address), + style = TangemTypography.body2, + color = TangemTheme.colors.text.tertiary, + ) +} + @Composable private fun LoadingBlock(modifier: Modifier = Modifier) { NonContentContainer(modifier = modifier) { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt index 70e14a9b86..06db91f953 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/state/TokenItemState.kt @@ -71,11 +71,30 @@ internal sealed interface TokenItemState { * @property id token id * @property icon token icon state * @property name token name + * @property onItemClick callback which will be called when an item is clicked + * @property onItemLongClick callback which will be called when an item is long clicked */ data class Unreachable( override val id: String, override val icon: IconState, override val name: String, + val onItemClick: () -> Unit, + val onItemLongClick: () -> Unit, + ) : ContentState() + + /** + * No derivation address state + * + * @property id token id + * @property icon token icon state + * @property name token name + * @property onItemLongClick callback which will be called when an item is long clicked + */ + data class NoAddress( + override val id: String, + override val icon: IconState, + override val name: String, + val onItemLongClick: () -> Unit, ) : ContentState() /** diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt index 7d09dfba03..08bb0e8704 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/utils/CryptoCurrencyStatusToTokenItemConverter.kt @@ -27,8 +27,8 @@ internal class CryptoCurrencyStatusToTokenItemConverter( is CryptoCurrencyStatus.NoQuote, is CryptoCurrencyStatus.NoAccount, -> value.mapToTokenItemState() + is CryptoCurrencyStatus.MissedDerivation -> value.mapToNoAddressTokenItemState() // TODO: Add other token item states, currently not designed - is CryptoCurrencyStatus.MissedDerivation, is CryptoCurrencyStatus.Unreachable, is CryptoCurrencyStatus.NoAmount, -> value.mapToUnreachableTokenItemState() @@ -69,6 +69,15 @@ internal class CryptoCurrencyStatusToTokenItemConverter( id = currency.id.value, name = currency.name, icon = iconStateConverter.convert(value = this), + onItemClick = { clickIntents.onTokenItemClick(currency) }, + onItemLongClick = { clickIntents.onTokenItemLongClick(cryptoCurrencyStatus = this) }, + ) + + private fun CryptoCurrencyStatus.mapToNoAddressTokenItemState() = TokenItemState.NoAddress( + id = currency.id.value, + name = currency.name, + icon = iconStateConverter.convert(this), + onItemLongClick = { clickIntents.onTokenItemLongClick(cryptoCurrencyStatus = this) }, ) private fun CryptoCurrencyStatus.getPriceChangeConfig(): PriceChangeConfig {