Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-10 19:51:39 +01:00
parent 5a42f1de5f
commit 7011ffb0a8
9 changed files with 118 additions and 172 deletions

View file

@ -1,7 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.loaders.implementors
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.ApplyTokenListSortingUseCase
import com.tangem.domain.tokens.GetTokenListUseCase
import com.tangem.domain.wallets.models.UserWallet
@ -12,7 +11,6 @@ import com.tangem.feature.wallet.presentation.wallet.domain.WalletWithFundsCheck
import com.tangem.feature.wallet.presentation.wallet.state.WalletStateController
import com.tangem.feature.wallet.presentation.wallet.subscribers.MultiWalletTokenListSubscriber
import com.tangem.feature.wallet.presentation.wallet.subscribers.MultiWalletWarningsSubscriber
import com.tangem.feature.wallet.presentation.wallet.subscribers.WalletConnectNetworksSubscriber
import com.tangem.feature.wallet.presentation.wallet.subscribers.WalletSubscriber
import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents
@ -28,7 +26,6 @@ internal class MultiWalletContentLoader(
private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase,
private val applyTokenListSortingUseCase: ApplyTokenListSortingUseCase,
private val getMultiWalletWarningsFactory: GetMultiWalletWarningsFactory,
private val reduxStateHolder: ReduxStateHolder,
) : WalletContentLoader(id = userWallet.walletId) {
override fun create(): List<WalletSubscriber> {
@ -50,11 +47,6 @@ internal class MultiWalletContentLoader(
getMultiWalletWarningsFactory = getMultiWalletWarningsFactory,
walletWarningsAnalyticsSender = walletWarningsAnalyticsSender,
),
WalletConnectNetworksSubscriber(
userWallet = userWallet,
getTokenListUseCase = getTokenListUseCase,
reduxStateHolder = reduxStateHolder,
),
)
}
}

View file

@ -1,7 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.loaders.implementors
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.ApplyTokenListSortingUseCase
import com.tangem.domain.tokens.GetTokenListUseCase
import com.tangem.domain.wallets.models.UserWallet
@ -24,7 +23,6 @@ internal class MultiWalletContentLoaderFactory @Inject constructor(
private val getTokenListUseCase: GetTokenListUseCase,
private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase,
private val applyTokenListSortingUseCase: ApplyTokenListSortingUseCase,
private val reduxStateHolder: ReduxStateHolder,
private val walletWarningsAnalyticsSender: WalletWarningsAnalyticsSender,
) {
@ -38,7 +36,6 @@ internal class MultiWalletContentLoaderFactory @Inject constructor(
getTokenListUseCase = getTokenListUseCase,
getSelectedAppCurrencyUseCase = getSelectedAppCurrencyUseCase,
getMultiWalletWarningsFactory = getMultiWalletWarningsFactory,
reduxStateHolder = reduxStateHolder,
walletWarningsAnalyticsSender = walletWarningsAnalyticsSender,
applyTokenListSortingUseCase = applyTokenListSortingUseCase,
)

View file

@ -1,80 +0,0 @@
package com.tangem.feature.wallet.presentation.wallet.subscribers
import arrow.core.Either
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.GetTokenListUseCase
import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.NetworkGroup
import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.walletconnect.WalletConnectActions
import com.tangem.domain.wallets.models.UserWallet
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import timber.log.Timber
/**
* WalletConnect networks subscriber. Update WalletConnect networks for a specified [userWallet].
*
* @property userWallet user wallet
* @property getTokenListUseCase use case for subscribing on token list changes
* @property reduxStateHolder redux state holder
*
[REDACTED_AUTHOR]
*/
internal class WalletConnectNetworksSubscriber(
private val userWallet: UserWallet,
private val getTokenListUseCase: GetTokenListUseCase,
private val reduxStateHolder: ReduxStateHolder,
) : WalletSubscriber() {
private val mutex = Mutex()
override fun create(coroutineScope: CoroutineScope): Flow<Either<TokenListError, TokenList>> {
return getTokenListUseCase(userWalletId = userWallet.walletId)
.conflate()
.distinctUntilCurrenciesChanged()
.filterLoadedTokens()
.onEach {
mutex.withLock {
Timber.d("WalletConnect: ${userWallet.walletId} networks is updated")
reduxStateHolder.dispatch(
action = WalletConnectActions.New.SetupUserChains(userWallet = userWallet),
)
}
}
}
private fun MaybeTokenListFlow.distinctUntilCurrenciesChanged(): MaybeTokenListFlow {
return distinctUntilChanged { old, new ->
val oldCurrencies = old.fold(ifLeft = { null }, ifRight = { it.getCryptoCurrencies() })
val newCurrencies = new.fold(ifLeft = { null }, ifRight = { it.getCryptoCurrencies() })
oldCurrencies == newCurrencies
}
}
private fun MaybeTokenListFlow.filterLoadedTokens(): MaybeTokenListFlow {
return filter { either ->
either.fold(
ifLeft = { false },
ifRight = { it.getCryptoCurrencies().isAllCurrenciesLoaded() },
)
}
}
private fun TokenList.getCryptoCurrencies(): List<CryptoCurrencyStatus> {
return when (this) {
is TokenList.Ungrouped -> currencies
is TokenList.GroupedByNetwork -> groups.flatMap(NetworkGroup::currencies)
else -> emptyList()
}
}
private fun List<CryptoCurrencyStatus>.isAllCurrenciesLoaded(): Boolean {
return none { it.value is CryptoCurrencyStatus.Loading }
}
}

View file

@ -7,11 +7,9 @@ import androidx.lifecycle.viewModelScope
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.navigation.AppScreen
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.settings.CanUseBiometryUseCase
import com.tangem.domain.settings.IsWalletsScrollPreviewEnabled
import com.tangem.domain.settings.ShouldShowSaveWalletScreenUseCase
import com.tangem.domain.walletconnect.WalletConnectActions
import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase
import com.tangem.domain.wallets.usecase.GetWalletsUseCase
import com.tangem.feature.wallet.presentation.deeplink.WalletDeepLinksHandler
@ -37,7 +35,6 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
@Suppress("LongParameterList")
@ -56,7 +53,6 @@ internal class WalletViewModel @Inject constructor(
private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
analyticsEventsHandler: AnalyticsEventHandler,
private val dispatchers: CoroutineDispatcherProvider,
private val reduxStateHolder: ReduxStateHolder,
private val screenLifecycleProvider: ScreenLifecycleProvider,
private val selectedWalletAnalyticsSender: SelectedWalletAnalyticsSender,
private val walletDeepLinksHandler: WalletDeepLinksHandler,
@ -141,16 +137,6 @@ internal class WalletViewModel @Inject constructor(
.distinctUntilChanged()
.onEach { selectedWallet ->
if (selectedWallet.isMultiCurrency) {
Timber.d("WalletConnect: initialize and setup networks for ${selectedWallet.walletId}")
reduxStateHolder.dispatch(
action = WalletConnectActions.New.Initialize(userWallet = selectedWallet),
)
reduxStateHolder.dispatch(
action = WalletConnectActions.New.SetupUserChains(userWallet = selectedWallet),
)
selectedWalletAnalyticsSender.send(selectedWallet)
}