Updated on 2026-08-14

This commit is contained in:
Tangem 2025-05-30 11:57:55 +04:00
parent 9c81f9ca51
commit 74e286f57b
11 changed files with 24 additions and 117 deletions

View file

@ -35,10 +35,6 @@
"name": "STAKING_CARDANO_ENABLED",
"version": "undefined"
},
{
"name": "TX_HISTORY_REFACTORING_ENABLED",
"version": "5.22.0"
},
{
"name": "NEW_ARTWORK_LOADING",
"version": "5.25.0"

View file

@ -1,36 +0,0 @@
package com.tangem.domain.tokens.repository
import arrow.core.Either
import arrow.core.getOrElse
import com.tangem.domain.core.error.DataError
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.tokens.model.Quote
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
internal class MockQuotesRepository(
private val quotes: Flow<Either<DataError, Set<Quote>>>,
) : QuotesRepository {
override fun getQuotesUpdates(currenciesIds: Set<CryptoCurrency.RawID>): Flow<Set<Quote>> {
return quotes.map { it.getOrElse { e -> throw e } }
}
override suspend fun fetchQuotes(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean) {
/* no-op */
}
override fun getQuotesUpdatesLegacy(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean): Flow<Set<Quote>> {
return quotes.map { it.getOrElse { e -> throw e } }
}
override suspend fun getQuotesSync(currenciesIds: Set<CryptoCurrency.RawID>, refresh: Boolean): Set<Quote> {
return getQuotesUpdatesLegacy(currenciesIds).first()
}
override suspend fun getQuoteSync(currencyId: CryptoCurrency.RawID): Quote {
return quotes.map { it.getOrElse { e -> throw e } }.first()
.first { it.rawCurrencyId == currencyId }
}
}

View file

@ -5,9 +5,7 @@ import com.tangem.domain.nft.RefreshAllNFTUseCase
import com.tangem.domain.tokens.FetchPendingTransactionsUseCase
import com.tangem.domain.tokens.UpdateDelayedNetworkStatusUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.entity.TxHistoryContentUpdateEmitter
import com.tangem.utils.coroutines.DelayedWork
import dagger.assisted.Assisted
@ -20,8 +18,6 @@ internal class SendBalanceUpdater @AssistedInject constructor(
private val fetchPendingTransactionsUseCase: FetchPendingTransactionsUseCase,
private val updateDelayedNetworkStatusUseCase: UpdateDelayedNetworkStatusUseCase,
private val getTxHistoryItemsCountUseCase: GetTxHistoryItemsCountUseCase,
private val getTxHistoryItemsUseCase: GetTxHistoryItemsUseCase,
private val txHistoryFeatureToggles: TxHistoryFeatureToggles,
private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter,
private val refreshAllNFTUseCase: RefreshAllNFTUseCase,
@DelayedWork private val coroutineScope: CoroutineScope,
@ -75,15 +71,7 @@ internal class SendBalanceUpdater @AssistedInject constructor(
)
txHistoryItemsCountEither.onRight {
if (txHistoryFeatureToggles.isFeatureEnabled) {
txHistoryContentUpdateEmitter.triggerUpdate()
} else {
getTxHistoryItemsUseCase(
userWalletId = userWallet.walletId,
currency = cryptoCurrency,
refresh = true,
)
}
txHistoryContentUpdateEmitter.triggerUpdate()
}
}

View file

@ -45,7 +45,6 @@ import com.tangem.domain.transaction.usecase.*
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
import com.tangem.domain.txhistory.usecase.GetFixedTxHistoryItemsUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase
import com.tangem.domain.utils.convertToSdkAmount
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
@ -66,7 +65,6 @@ import com.tangem.features.send.impl.presentation.state.amount.AmountStateFactor
import com.tangem.features.send.impl.presentation.state.confirm.SendNotificationFactory
import com.tangem.features.send.impl.presentation.state.fee.*
import com.tangem.features.send.impl.presentation.state.recipient.RecipientSendFactory
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.entity.TxHistoryContentUpdateEmitter
import com.tangem.lib.crypto.BlockchainUtils
import com.tangem.utils.Provider
@ -95,7 +93,6 @@ internal class SendModel @Inject constructor(
private val getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase,
private val getNetworkAddressesUseCase: GetNetworkAddressesUseCase,
private val getTxHistoryItemsCountUseCase: GetTxHistoryItemsCountUseCase,
private val getTxHistoryItemsUseCase: GetTxHistoryItemsUseCase,
private val getFixedTxHistoryItemsUseCase: GetFixedTxHistoryItemsUseCase,
private val sendTransactionUseCase: SendTransactionUseCase,
private val createTransferTransactionUseCase: CreateTransferTransactionUseCase,
@ -118,7 +115,6 @@ internal class SendModel @Inject constructor(
private val getCardInfoUseCase: GetCardInfoUseCase,
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val shareManager: ShareManager,
private val txHistoryFeatureToggles: TxHistoryFeatureToggles,
private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter,
private val incrementNotificationsShowCountUseCase: IncrementNotificationsShowCountUseCase,
@DelayedWork private val coroutineScope: CoroutineScope,
@ -1076,15 +1072,7 @@ internal class SendModel @Inject constructor(
)
txHistoryItemsCountEither.onRight {
if (txHistoryFeatureToggles.isFeatureEnabled) {
txHistoryContentUpdateEmitter.triggerUpdate()
} else {
getTxHistoryItemsUseCase(
userWalletId = userWalletId,
currency = cryptoCurrency,
refresh = true,
)
}
txHistoryContentUpdateEmitter.triggerUpdate()
}
}

View file

@ -9,9 +9,7 @@ import com.tangem.domain.tokens.TokensFeatureToggles
import com.tangem.domain.tokens.UpdateDelayedNetworkStatusUseCase
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsCountUseCase
import com.tangem.domain.txhistory.usecase.GetTxHistoryItemsUseCase
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.entity.TxHistoryContentUpdateEmitter
import com.tangem.utils.coroutines.DelayedWork
import dagger.assisted.Assisted
@ -25,9 +23,7 @@ internal class StakingBalanceUpdater @AssistedInject constructor(
private val updateDelayedNetworkStatusUseCase: UpdateDelayedNetworkStatusUseCase,
private val stakingYieldBalanceUseCase: FetchStakingYieldBalanceUseCase,
private val getTxHistoryItemsCountUseCase: GetTxHistoryItemsCountUseCase,
private val getTxHistoryItemsUseCase: GetTxHistoryItemsUseCase,
private val fetchActionsUseCase: FetchActionsUseCase,
private val txHistoryFeatureToggles: TxHistoryFeatureToggles,
private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter,
private val tokensFeatureToggles: TokensFeatureToggles,
@DelayedWork private val coroutineScope: CoroutineScope,
@ -103,15 +99,7 @@ internal class StakingBalanceUpdater @AssistedInject constructor(
)
txHistoryItemsCountEither.onRight {
if (txHistoryFeatureToggles.isFeatureEnabled) {
txHistoryContentUpdateEmitter.triggerUpdate()
} else {
getTxHistoryItemsUseCase(
userWalletId = userWallet.walletId,
currency = cryptoCurrencyStatus.currency,
refresh = true,
)
}
txHistoryContentUpdateEmitter.triggerUpdate()
}
}

View file

@ -19,7 +19,6 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.ui.TokenDetails
import com.tangem.features.markets.token.block.TokenMarketBlockComponent
import com.tangem.features.onramp.OnrampFeatureToggles
import com.tangem.features.tokendetails.TokenDetailsComponent
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.component.TxHistoryComponent
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
@ -31,7 +30,6 @@ internal class DefaultTokenDetailsComponent @AssistedInject constructor(
@Assisted params: TokenDetailsComponent.Params,
tokenMarketBlockComponentFactory: TokenMarketBlockComponent.Factory,
txHistoryComponentFactory: TxHistoryComponent.Factory,
txHistoryFeatureToggles: TxHistoryFeatureToggles,
onrampFeatureToggles: OnrampFeatureToggles,
routingFeatureToggle: RoutingFeatureToggle,
deepLinksRegistry: DeepLinksRegistry,
@ -43,9 +41,9 @@ internal class DefaultTokenDetailsComponent @AssistedInject constructor(
params = TxHistoryComponent.Params(
userWalletId = params.userWalletId,
currency = params.currency,
openExplorer = { model.onExploreClick() },
openExplorer = model::onExploreClick,
),
).takeIf { txHistoryFeatureToggles.isFeatureEnabled }
)
init {
lifecycle.subscribe(

View file

@ -78,7 +78,6 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.e
import com.tangem.features.onramp.OnrampFeatureToggles
import com.tangem.features.tokendetails.TokenDetailsComponent
import com.tangem.features.tokendetails.impl.R
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.entity.TxHistoryContentUpdateEmitter
import com.tangem.utils.Provider
import com.tangem.utils.coroutines.*
@ -125,7 +124,6 @@ internal class TokenDetailsModel @Inject constructor(
private val onrampFeatureToggles: OnrampFeatureToggles,
private val shareManager: ShareManager,
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
private val txHistoryFeatureToggles: TxHistoryFeatureToggles,
private val txHistoryContentUpdateEmitter: TxHistoryContentUpdateEmitter,
paramsContainer: ParamsContainer,
expressStatusFactory: ExpressStatusFactory.Factory,
@ -379,10 +377,10 @@ internal class TokenDetailsModel @Inject constructor(
* @param showItemsLoading - show loading items placeholder.
*/
private fun updateTxHistory(refresh: Boolean, showItemsLoading: Boolean, initialUpdating: Boolean = false) {
if (txHistoryFeatureToggles.isFeatureEnabled && !initialUpdating) {
modelScope.launch { txHistoryContentUpdateEmitter.triggerUpdate() }
} else {
modelScope.launch(dispatchers.main) {
modelScope.launch {
if (!initialUpdating) {
txHistoryContentUpdateEmitter.triggerUpdate()
} else {
val txHistoryItemsCountEither = txHistoryItemsCountUseCase(
userWalletId = userWalletId,
currency = cryptoCurrency,

View file

@ -15,12 +15,12 @@ import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameter
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems
import com.tangem.common.ui.expressStatus.ExpressStatusBottomSheetConfig
import com.tangem.common.ui.expressStatus.expressTransactionsItems
import com.tangem.common.ui.bottomsheet.chooseaddress.ChooseAddressBottomSheet
import com.tangem.common.ui.bottomsheet.chooseaddress.ChooseAddressBottomSheetConfig
import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheet
import com.tangem.common.ui.bottomsheet.receive.TokenReceiveBottomSheetConfig
import com.tangem.common.ui.expressStatus.ExpressStatusBottomSheetConfig
import com.tangem.common.ui.expressStatus.expressTransactionsItems
import com.tangem.core.ui.components.containers.pullToRefresh.TangemPullToRefreshContainer
import com.tangem.core.ui.components.marketprice.MarketPriceBlock
import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
@ -42,6 +42,8 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.ui.components.s
import com.tangem.features.markets.token.block.TokenMarketBlockComponent
import com.tangem.features.txhistory.component.TxHistoryComponent
import com.tangem.features.txhistory.entity.TxHistoryUM
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlin.reflect.KProperty
// TODO: Split to blocks [REDACTED_JIRA]
@ -50,7 +52,7 @@ import kotlin.reflect.KProperty
internal fun TokenDetailsScreen(
state: TokenDetailsState,
tokenMarketBlockComponent: TokenMarketBlockComponent?,
txHistoryComponent: TxHistoryComponent?,
txHistoryComponent: TxHistoryComponent,
) {
val bottomBarHeight = with(LocalDensity.current) { WindowInsets.systemBars.getBottom(this).toDp() }
@ -65,7 +67,7 @@ internal fun TokenDetailsScreen(
null
}
val listState = rememberLazyListState()
val txHistoryComponentState by txHistoryComponent?.txHistoryState?.collectAsStateWithLifecycle()
val txHistoryComponentState by txHistoryComponent.txHistoryState.collectAsStateWithLifecycle()
val betweenItemsPadding = TangemTheme.dimens.spacing12
val horizontalPadding = TangemTheme.dimens.spacing16
val itemModifier = Modifier
@ -186,13 +188,13 @@ internal fun TokenDetailsScreen(
@Suppress("LongParameterList")
private fun LazyListScope.txHistoryItems(
listState: LazyListState,
txHistoryComponent: TxHistoryComponent?,
txHistoryComponent: TxHistoryComponent,
txHistoryComponentState: TxHistoryUM?,
txHistoryState: TxHistoryState,
txHistoryItems: LazyPagingItems<TxHistoryState.TxHistoryItemState>?,
isBalanceHidden: Boolean,
) {
if (txHistoryComponent != null && txHistoryComponentState != null) {
if (txHistoryComponentState != null) {
with(txHistoryComponent) { txHistoryContent(listState = listState, state = txHistoryComponentState) }
} else {
txHistoryItems(
@ -216,7 +218,13 @@ private fun TokenDetailsScreenPreview(
TokenDetailsScreen(
state = state,
tokenMarketBlockComponent = null,
txHistoryComponent = null,
txHistoryComponent = object : TxHistoryComponent {
override val txHistoryState: StateFlow<TxHistoryUM> = MutableStateFlow(
value = TxHistoryUM.Empty(isBalanceHidden = false, onExploreClick = {}),
)
override fun LazyListScope.txHistoryContent(listState: LazyListState, state: TxHistoryUM) = Unit
},
)
}
}

View file

@ -1,5 +0,0 @@
package com.tangem.features.txhistory
interface TxHistoryFeatureToggles {
val isFeatureEnabled: Boolean
}

View file

@ -1,11 +0,0 @@
package com.tangem.features.txhistory
import com.tangem.core.configtoggle.feature.FeatureTogglesManager
import javax.inject.Inject
internal class DefaultTxHistoryFeatureToggles @Inject constructor(
private val featureTogglesManager: FeatureTogglesManager,
) : TxHistoryFeatureToggles {
override val isFeatureEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled("TX_HISTORY_REFACTORING_ENABLED")
}

View file

@ -1,7 +1,5 @@
package com.tangem.features.txhistory.di
import com.tangem.features.txhistory.DefaultTxHistoryFeatureToggles
import com.tangem.features.txhistory.TxHistoryFeatureToggles
import com.tangem.features.txhistory.component.DefaultTxHistoryComponent
import com.tangem.features.txhistory.component.TxHistoryComponent
import dagger.Binds
@ -13,9 +11,6 @@ import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal interface TxHistoryFeatureModule {
@Binds
@Singleton
fun provideFeatureToggles(featureToggles: DefaultTxHistoryFeatureToggles): TxHistoryFeatureToggles
@Binds
@Singleton