From 1e2ea28ff95e8fc295dba53809fbacecdd92dfc9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 8 Dec 2025 22:25:17 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../DefaultTangemPayTxHistoryRepository.kt | 13 ++++--- .../components/TangemPayDetailsComponent.kt | 1 + .../TangemPayTxHistoryDetailsComponent.kt | 7 +++- .../entity/TangemPayDetailsNavigation.kt | 5 ++- .../entity/TangemPayTxHistoryDetailsUM.kt | 1 + .../tangempay/model/TangemPayDetailsModel.kt | 7 +++- .../model/TangemPayTxHistoryDetailsModel.kt | 38 ++++++++++++++----- .../TangemPayTxHistoryDetailsConverter.kt | 2 + .../tangempay/ui/TangempayTxDetailsUi.kt | 8 +++- 9 files changed, 61 insertions(+), 21 deletions(-) diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayTxHistoryRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayTxHistoryRepository.kt index 243e008c99..021605d89a 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayTxHistoryRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayTxHistoryRepository.kt @@ -21,7 +21,6 @@ import com.tangem.utils.coroutines.CoroutineDispatcherProvider import javax.inject.Inject private const val INITIAL_CURSOR = "initial_cursor_key" -private const val TAG = "TangemPay: TangemPayTxHistoryRepository:" internal class DefaultTangemPayTxHistoryRepository @Inject constructor( private val requestPerformer: TangemPayRequestPerformer, @@ -106,12 +105,14 @@ internal class DefaultTangemPayTxHistoryRepository @Inject constructor( cursor: String?, pageSize: Int, ) { - requestPerformer.runWithErrorLogs(TAG) { - val result = requestPerformer.request(userWalletId) { authHeader -> - visaApi.getTangemPayTxHistory(authHeader = authHeader, limit = pageSize, cursor = cursor) - }.result + requestPerformer.performRequest(userWalletId = userWalletId) { authHeader -> + visaApi.getTangemPayTxHistory(authHeader = authHeader, limit = pageSize, cursor = cursor) + }.onLeft { + error(it.toString()) + }.onRight { response -> + val result = response.result val items = txHistoryItemConverter.convertList(result.transactions).filterNotNull() txHistoryItemsStore.store(key = customerWalletAddress, cursor = cursor ?: INITIAL_CURSOR, value = items) - }.onLeft { error(it.toString()) } + } } } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayDetailsComponent.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayDetailsComponent.kt index 38d29ced5d..44a23b3ed8 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayDetailsComponent.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayDetailsComponent.kt @@ -84,6 +84,7 @@ internal class TangemPayDetailsComponent( appComponentContext = context, params = TangemPayTxHistoryDetailsComponent.Params( transaction = navigation.transaction, + isBalanceHidden = navigation.isBalanceHidden, userWalletId = params.userWalletId, onDismiss = model.bottomSheetNavigation::dismiss, ), diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/txHistory/TangemPayTxHistoryDetailsComponent.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/txHistory/TangemPayTxHistoryDetailsComponent.kt index 345ca4a497..eeb2b77c8f 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/txHistory/TangemPayTxHistoryDetailsComponent.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/components/txHistory/TangemPayTxHistoryDetailsComponent.kt @@ -1,10 +1,11 @@ package com.tangem.features.tangempay.components.txHistory import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.core.ui.decompose.ComposableBottomSheetComponent -import com.tangem.core.ui.extensions.* import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.visa.model.TangemPayTxHistoryItem import com.tangem.features.tangempay.model.TangemPayTxHistoryDetailsModel @@ -23,11 +24,13 @@ internal class TangemPayTxHistoryDetailsComponent( @Composable override fun BottomSheet() { - TangemPayTxHistoryDetailsContent(state = model.uiState) + val state by model.uiState.collectAsStateWithLifecycle() + TangemPayTxHistoryDetailsContent(state = state) } data class Params( val transaction: TangemPayTxHistoryItem, + val isBalanceHidden: Boolean, val userWalletId: UserWalletId, val onDismiss: () -> Unit, ) diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsNavigation.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsNavigation.kt index 9e4c9f8854..86009f09f0 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsNavigation.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsNavigation.kt @@ -22,5 +22,8 @@ internal sealed class TangemPayDetailsNavigation { ) : TangemPayDetailsNavigation() @Serializable - data class TransactionDetails(val transaction: TangemPayTxHistoryItem) : TangemPayDetailsNavigation() + data class TransactionDetails( + val transaction: TangemPayTxHistoryItem, + val isBalanceHidden: Boolean, + ) : TangemPayDetailsNavigation() } \ No newline at end of file diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayTxHistoryDetailsUM.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayTxHistoryDetailsUM.kt index d6d716c254..4d2aa7c66e 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayTxHistoryDetailsUM.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayTxHistoryDetailsUM.kt @@ -8,6 +8,7 @@ import com.tangem.core.ui.extensions.TextReference import kotlinx.collections.immutable.ImmutableList internal data class TangemPayTxHistoryDetailsUM( + val isBalanceHidden: Boolean, val title: TextReference, val iconState: ImageReference, val transactionTitle: TextReference, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt index c75973bf0f..bfe48f97c9 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt @@ -373,7 +373,12 @@ internal class TangemPayDetailsModel @Inject constructor( } override fun onTransactionClick(item: TangemPayTxHistoryItem) { - bottomSheetNavigation.activate(TangemPayDetailsNavigation.TransactionDetails(item)) + bottomSheetNavigation.activate( + configuration = TangemPayDetailsNavigation.TransactionDetails( + transaction = item, + isBalanceHidden = uiState.value.isBalanceHidden, + ), + ) } override fun onClickTermsAndLimits() { diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt index 48d190991e..02fd1df5b7 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayTxHistoryDetailsModel.kt @@ -5,6 +5,7 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.navigation.url.UrlOpener +import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.feedback.GetWalletMetaInfoUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.FeedbackEmailType @@ -14,39 +15,56 @@ import com.tangem.features.tangempay.components.txHistory.TangemPayTxHistoryDeta import com.tangem.features.tangempay.entity.TangemPayTxHistoryDetailsUM import com.tangem.features.tangempay.model.transformers.TangemPayTxHistoryDetailsConverter import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import javax.inject.Inject @Stable @ModelScoped +@Suppress("LongParameterList") internal class TangemPayTxHistoryDetailsModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, private val getUserWalletsUseCase: GetWalletsUseCase, private val getWalletMetaInfoUseCase: GetWalletMetaInfoUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val urlOpener: UrlOpener, + private val balanceHidingSettings: GetBalanceHidingSettingsUseCase, paramsContainer: ParamsContainer, ) : Model() { private val params = paramsContainer.require() - val uiState: TangemPayTxHistoryDetailsUM = TangemPayTxHistoryDetailsConverter.convert( - TangemPayTxHistoryDetailsConverter.Input( - item = params.transaction, - onExplorerClick = ::openExplorer, - onDisputeClick = ::dispute, - onDismiss = ::dismiss, - ), - ) + val uiState: StateFlow + field = MutableStateFlow( + value = TangemPayTxHistoryDetailsConverter.convert( + value = TangemPayTxHistoryDetailsConverter.Input( + item = params.transaction, + isBalanceHidden = params.isBalanceHidden, + onExplorerClick = ::openExplorer, + onDisputeClick = ::dispute, + onDismiss = ::dismiss, + ), + ), + ) + + init { + subscribeToBalanceHiding() + } fun dismiss() { params.onDismiss() } - fun openExplorer(txHash: String?) { + private fun subscribeToBalanceHiding() { + balanceHidingSettings.isBalanceHidden() + .onEach { isBalanceHidden -> uiState.update { it.copy(isBalanceHidden = isBalanceHidden) } } + .launchIn(modelScope) + } + + private fun openExplorer(txHash: String?) { txHash?.let(urlOpener::openUrlExternalBrowser) } - fun dispute() { + private fun dispute() { modelScope.launch { val userWalletId = params.userWalletId val userWallet = getUserWalletsUseCase.invokeSync() diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayTxHistoryDetailsConverter.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayTxHistoryDetailsConverter.kt index b6e45d0c9a..9bfd3722fc 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayTxHistoryDetailsConverter.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayTxHistoryDetailsConverter.kt @@ -29,6 +29,7 @@ internal object TangemPayTxHistoryDetailsConverter : override fun convert(value: Input): TangemPayTxHistoryDetailsUM { val transaction = value.item return TangemPayTxHistoryDetailsUM( + isBalanceHidden = value.isBalanceHidden, title = transaction.extractDate(), iconState = transaction.extractIcon(), transactionTitle = transaction.extractTransactionTitle(), @@ -254,6 +255,7 @@ internal object TangemPayTxHistoryDetailsConverter : data class Input( val item: TangemPayTxHistoryItem, + val isBalanceHidden: Boolean, val onExplorerClick: (String?) -> Unit, val onDisputeClick: () -> Unit, val onDismiss: () -> Unit, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangempayTxDetailsUi.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangempayTxDetailsUi.kt index f9534f5d05..4e280d9cb7 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangempayTxDetailsUi.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangempayTxDetailsUi.kt @@ -77,7 +77,7 @@ internal fun TangemPayTxHistoryDetailsContent(state: TangemPayTxHistoryDetailsUM ) Text( modifier = Modifier.padding(top = 8.dp), - text = state.transactionAmount, + text = state.transactionAmount.orMaskWithStars(state.isBalanceHidden), style = TangemTheme.typography.head, color = state.transactionAmountColor.resolveReference(), ) @@ -158,6 +158,7 @@ private fun TangemPayTxHistoryDetailsContentPreview( private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterProvider( listOf( TangemPayTxHistoryDetailsUM( + isBalanceHidden = true, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_category_24), transactionTitle = stringReference("Starbucks"), @@ -180,6 +181,7 @@ private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterPr dismiss = {}, ), TangemPayTxHistoryDetailsUM( + isBalanceHidden = true, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_category_24), transactionTitle = stringReference("Starbucks"), @@ -205,6 +207,7 @@ private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterPr dismiss = {}, ), TangemPayTxHistoryDetailsUM( + isBalanceHidden = false, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_category_24), transactionTitle = stringReference("Starbucks"), @@ -226,6 +229,7 @@ private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterPr dismiss = {}, ), TangemPayTxHistoryDetailsUM( + isBalanceHidden = false, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_percent_24), transactionTitle = stringReference("Fee"), @@ -248,6 +252,7 @@ private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterPr dismiss = {}, ), TangemPayTxHistoryDetailsUM( + isBalanceHidden = false, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_arrow_down_24), transactionTitle = stringReference("Deposit"), @@ -266,6 +271,7 @@ private class TangemPayTxHistoryDetailsUMProvider : CollectionPreviewParameterPr dismiss = {}, ), TangemPayTxHistoryDetailsUM( + isBalanceHidden = false, title = stringReference("12 June • 12:40"), iconState = ImageReference.Res(R.drawable.ic_arrow_up_24), transactionTitle = stringReference("Withdrawal"),