Updated on 2026-08-14

This commit is contained in:
Tangem 2024-01-19 18:22:59 +03:00
parent 895af6c0a6
commit b2726d153c
28 changed files with 197 additions and 40 deletions

View file

@ -56,6 +56,7 @@ internal class DefaultWalletRouter(
if (walletFeatureToggles.isWalletsScrollingPreviewEnabled) {
val viewModel = hiltViewModel<WalletViewModelV2>().apply {
setWalletRouter(router = this@DefaultWalletRouter)
subscribeToLifecycle(LocalLifecycleOwner.current)
}
WalletScreenV2(state = viewModel.uiState.collectAsStateWithLifecycle().value)

View file

@ -12,6 +12,7 @@ import com.tangem.domain.wallets.models.UserWallet
import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.Basic
import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.MainScreen
import com.tangem.feature.wallet.presentation.wallet.state2.model.WalletState
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
import dagger.hilt.android.scopes.ViewModelScoped
import java.math.BigDecimal
import javax.inject.Inject
@ -20,9 +21,11 @@ import javax.inject.Inject
internal class TokenListAnalyticsSender @Inject constructor(
private val analyticsEventHandler: AnalyticsEventHandler,
private val checkIsWalletToppedUpUseCase: CheckIsWalletToppedUpUseCase,
private val screenLifecycleProvider: ScreenLifecycleProvider,
) {
suspend fun send(displayedUiState: WalletState?, userWallet: UserWallet, tokenList: TokenList) {
if (screenLifecycleProvider.isBackground) return
if (displayedUiState == null || displayedUiState.pullToRefreshConfig.isRefreshing) return
if (tokenList.totalFiatBalance is TokenList.FiatBalance.Loading) return
@ -117,8 +120,7 @@ internal class TokenListAnalyticsSender @Inject constructor(
private fun sendUnreachableNetworksEventIfNeeded(currenciesStatuses: List<CryptoCurrencyStatus>) {
val hasUnreachableCurrencies = currenciesStatuses.any {
it.value is CryptoCurrencyStatus.Unreachable ||
it.value is CryptoCurrencyStatus.UnreachableWithoutAddresses
it.value is CryptoCurrencyStatus.Unreachable
}
if (hasUnreachableCurrencies) {

View file

@ -5,15 +5,18 @@ import com.tangem.core.analytics.models.AnalyticsEvent
import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.MainScreen
import com.tangem.feature.wallet.presentation.wallet.state.components.WalletNotification
import com.tangem.feature.wallet.presentation.wallet.state2.model.WalletState
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
import dagger.hilt.android.scopes.ViewModelScoped
import javax.inject.Inject
@ViewModelScoped
internal class WalletWarningsAnalyticsSender @Inject constructor(
private val analyticsEventHandler: AnalyticsEventHandler,
private val screenLifecycleProvider: ScreenLifecycleProvider,
) {
fun send(displayedUiState: WalletState?, newWarnings: List<WalletNotification>) {
if (screenLifecycleProvider.isBackground) return
if (newWarnings.isEmpty()) return
if (displayedUiState == null || displayedUiState.pullToRefreshConfig.isRefreshing) return

View file

@ -73,7 +73,6 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
is CryptoCurrencyStatus.Custom,
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
is CryptoCurrencyStatus.NoQuote,
-> MarketPriceBlockState.Error(currencySymbol)
}
@ -117,7 +116,6 @@ internal class WalletSingleCurrencyLoadedBalanceConverter(
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Custom,
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> {
WalletCardState.Error(
id = selectedWallet.id,

View file

@ -21,7 +21,6 @@ internal class SingleWalletCardStateConverter(
is CryptoCurrencyStatus.Custom,
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> value.toErrorState()
is CryptoCurrencyStatus.NoQuote,
is CryptoCurrencyStatus.Loaded,

View file

@ -25,7 +25,6 @@ internal class SingleWalletMarketPriceConverter(
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.NoQuote,
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> MarketPriceBlockState.Error(value.currencySymbol)
}
}

View file

@ -28,7 +28,6 @@ internal class TokenItemStateConverter(
-> value.mapToTokenItemState()
is CryptoCurrencyStatus.MissedDerivation -> value.mapToNoAddressTokenItemState()
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
is CryptoCurrencyStatus.NoAmount,
-> value.mapToUnreachableTokenItemState()
}

View file

@ -22,7 +22,6 @@ internal class VisaWalletCardStateConverter(
is CryptoCurrencyStatus.Custom,
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> value.toErrorState()
is CryptoCurrencyStatus.NoQuote,
is CryptoCurrencyStatus.Loaded,

View file

@ -73,7 +73,6 @@ internal class PrimaryCurrencySubscriber(
-> createCardBalanceState(fiatAmount)
is CryptoCurrencyStatus.NoQuote -> AnalyticsParam.CardBalanceState.NoRate
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> AnalyticsParam.CardBalanceState.BlockchainError
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Loading,

View file

@ -28,7 +28,6 @@ internal class CryptoCurrencyStatusToTokenItemConverter(
-> value.mapToTokenItemState()
is CryptoCurrencyStatus.MissedDerivation -> value.mapToNoAddressTokenItemState()
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
is CryptoCurrencyStatus.NoAmount,
-> value.mapToUnreachableTokenItemState()
}

View file

@ -0,0 +1,21 @@
package com.tangem.feature.wallet.presentation.wallet.utils
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import dagger.hilt.android.scopes.ViewModelScoped
import javax.inject.Inject
@ViewModelScoped
internal class ScreenLifecycleProvider @Inject constructor() : DefaultLifecycleObserver {
var isBackground: Boolean = true
private set
override fun onResume(owner: LifecycleOwner) {
isBackground = false
}
override fun onPause(owner: LifecycleOwner) {
isBackground = true
}
}

View file

@ -1231,7 +1231,6 @@ internal class WalletViewModel @Inject constructor(
}
is CryptoCurrencyStatus.NoQuote -> AnalyticsParam.CardBalanceState.NoRate
is CryptoCurrencyStatus.Unreachable,
is CryptoCurrencyStatus.UnreachableWithoutAddresses,
-> AnalyticsParam.CardBalanceState.BlockchainError
is CryptoCurrencyStatus.MissedDerivation,
is CryptoCurrencyStatus.Loading,

View file

@ -1,5 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.viewmodels
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.tangem.core.analytics.api.AnalyticsEventHandler
@ -21,6 +22,7 @@ import com.tangem.feature.wallet.presentation.wallet.state2.WalletStateControlle
import com.tangem.feature.wallet.presentation.wallet.state2.model.WalletScreenState
import com.tangem.feature.wallet.presentation.wallet.state2.transformers.*
import com.tangem.feature.wallet.presentation.wallet.state2.utils.WalletEventSender
import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider
import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntentsV2
import com.tangem.utils.Provider
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
@ -33,7 +35,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
import kotlin.properties.Delegates
@Suppress("LongParameterList")
@HiltViewModel
@ -53,11 +54,12 @@ internal class WalletViewModelV2 @Inject constructor(
analyticsEventsHandler: AnalyticsEventHandler,
private val dispatchers: CoroutineDispatcherProvider,
private val reduxStateHolder: ReduxStateHolder,
private val screenLifecycleProvider: ScreenLifecycleProvider,
) : ViewModel() {
val uiState: StateFlow<WalletScreenState> = stateHolder.uiState
private var router: InnerWalletRouter by Delegates.notNull()
private lateinit var router: InnerWalletRouter
private var walletsUpdateJobHolder: JobHolder = JobHolder()
init {
@ -75,6 +77,10 @@ internal class WalletViewModelV2 @Inject constructor(
clickIntents.initialize(router, viewModelScope)
}
fun subscribeToLifecycle(lifecycleOwner: LifecycleOwner) {
lifecycleOwner.lifecycle.addObserver(screenLifecycleProvider)
}
override fun onCleared() {
super.onCleared()
stateHolder.clear()