Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-28 17:03:15 +04:00
parent 596cbb40cb
commit eb6d4806e6
16 changed files with 291 additions and 710 deletions

View file

@ -12,7 +12,6 @@ import com.tangem.features.feed.components.feed.DefaultFeedComponent
import com.tangem.features.feed.components.feed.DefaultFeedComponent.FeedParams
import com.tangem.features.feed.components.market.details.DefaultMarketsTokenDetailsComponent
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
import com.tangem.features.feed.components.market.details.portfolio.api.MarketsPortfolioComponent
import com.tangem.features.feed.components.market.details.portfolioblock.PortfolioBlockComponent
import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListComponent
@ -31,7 +30,6 @@ internal class FeedEntryChildFactory @Inject constructor(
private val portfolioComponentFactory: MarketsPortfolioComponent.Factory,
private val portfolioBlockComponentFactory: PortfolioBlockComponent.Factory,
private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory,
private val addToPortfolioPreselectedDataComponent: AddToPortfolioPreselectedDataComponent.Factory,
private val promoBannersBlockComponentFactory: PromoBannersBlockComponent.Factory,
private val newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles,
private val designFeatureToggles: DesignFeatureToggles,
@ -132,7 +130,7 @@ internal class FeedEntryChildFactory @Inject constructor(
DefaultFeedComponent(
appComponentContext = appComponentContext,
params = FeedParams(feedClickIntents = feedEntryClickIntents),
addToPortfolioComponentFactory = addToPortfolioPreselectedDataComponent,
addToPortfolioComponentFactory = addToPortfolioComponentFactory,
promoBannersBlockComponentFactory = promoBannersBlockComponentFactory,
newPromoBannersFeatureToggles = newPromoBannersFeatureToggles,
)
@ -144,7 +142,7 @@ internal class FeedEntryChildFactory @Inject constructor(
onBackClick = onBackClicked,
onSearchClicked = feedEntryClickIntents::openSearch,
),
addToPortfolioComponentFactory = addToPortfolioPreselectedDataComponent,
addToPortfolioComponentFactory = addToPortfolioComponentFactory,
)
}
is Child.Search -> DefaultSearchComponent(

View file

@ -33,9 +33,10 @@ import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.LocalMainBottomSheetColor
import com.tangem.core.ui.res.LocalRedesignEnabled
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
import com.tangem.features.feed.model.earn.EarnModel
import com.tangem.features.feed.model.earn.analytics.EarnSource
import com.tangem.features.feed.ui.components.FeedSearchBar
import com.tangem.features.feed.ui.earn.EarnContent
import dev.chrisbanes.haze.HazeProgressive
@ -43,7 +44,7 @@ import dev.chrisbanes.haze.HazeProgressive
internal class DefaultEarnComponent(
appComponentContext: AppComponentContext,
private val params: Params,
private val addToPortfolioComponentFactory: AddToPortfolioPreselectedDataComponent.Factory,
private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory,
) : ComposableModularBottomSheetContentComponent, AppComponentContext by appComponentContext {
private val earnModel = getOrCreateModel<EarnModel, Params>(params = params)
@ -129,10 +130,14 @@ internal class DefaultEarnComponent(
is FeedBottomSheetRoute.AddToPortfolio -> {
addToPortfolioComponentFactory.create(
context = childByContext(componentContext),
params = AddToPortfolioPreselectedDataComponent.Params(
tokenToAdd = config.tokenToAdd,
callback = earnModel.addToPortfolioCallback,
analyticsParams = AddToPortfolioPreselectedDataComponent.AnalyticsParams(config.source),
params = AddToPortfolioComponent.Params(
addToPortfolioManager = when {
config.source == EarnSource.BEST_OPPORTUNITIES_SOURCE.value ->
earnModel.addBestOpportunitiesPortfolioManager
config.source == EarnSource.MOSTLY_USED_SOURCE.value ->
earnModel.addMostlyUsedPortfolioManager
else -> error("Unknown source: ${config.source}")
},
),
)
}

View file

@ -11,7 +11,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.arkivanov.decompose.ComponentContext
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import com.arkivanov.decompose.router.slot.childSlot
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.core.decompose.context.child
import com.tangem.core.decompose.context.childByContext
@ -20,8 +19,7 @@ import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
import com.tangem.core.ui.decompose.ComposableModularBottomSheetContentComponent
import com.tangem.core.ui.decompose.EmptyComposableBottomSheetComponent
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent.Params
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
import com.tangem.features.feed.model.feed.FeedComponentModel
import com.tangem.features.feed.model.feed.FeedModelClickIntents
import com.tangem.features.feed.ui.feed.FeedList
@ -32,7 +30,7 @@ import com.tangem.features.promobanners.api.PromoBannersBlockComponent
internal class DefaultFeedComponent(
appComponentContext: AppComponentContext,
private val params: FeedParams,
private val addToPortfolioComponentFactory: AddToPortfolioPreselectedDataComponent.Factory,
private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory,
private val promoBannersBlockComponentFactory: PromoBannersBlockComponent.Factory,
private val newPromoBannersFeatureToggles: NewPromoBannersFeatureToggles,
) : ComposableModularBottomSheetContentComponent, AppComponentContext by appComponentContext {
@ -102,12 +100,8 @@ internal class DefaultFeedComponent(
is FeedBottomSheetRoute.AddToPortfolio -> {
addToPortfolioComponentFactory.create(
context = childByContext(componentContext),
params = Params(
tokenToAdd = config.tokenToAdd,
callback = feedComponentModel.addToPortfolioCallback,
analyticsParams = AddToPortfolioPreselectedDataComponent.AnalyticsParams(
AnalyticsParam.ScreensSources.Markets.value,
),
params = AddToPortfolioComponent.Params(
addToPortfolioManager = feedComponentModel.addToPortfolioManager,
),
)
}

View file

@ -2,12 +2,10 @@ package com.tangem.features.feed.components.feed
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
internal sealed interface FeedBottomSheetRoute {
data class AddToPortfolio(
val tokenToAdd: AddToPortfolioPreselectedDataComponent.TokenToAdd,
val source: String,
) : FeedBottomSheetRoute

View file

@ -17,17 +17,18 @@ import com.tangem.domain.earn.model.EarnFilter
import com.tangem.domain.earn.model.EarnFilterNetwork
import com.tangem.domain.earn.model.EarnFilterType
import com.tangem.domain.earn.usecase.*
import com.tangem.domain.markets.RawMarketToken
import com.tangem.domain.markets.TokenMarketInfo
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.earn.EarnNetworks
import com.tangem.domain.models.earn.EarnTokenWithCurrency
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
import com.tangem.features.feed.components.earn.DefaultEarnComponent
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
import com.tangem.features.feed.model.earn.analytics.EarnSource
import com.tangem.features.feed.model.earn.filters.state.EarnFilterNetworkConverter
import com.tangem.features.feed.model.earn.filters.state.EarnFilterNetworkUMConverter
import com.tangem.features.feed.model.earn.filters.state.EarnFilterTypeConverter
@ -48,7 +49,7 @@ import javax.inject.Inject
@Stable
@ModelScoped
@Suppress("LongParameterList")
@Suppress("LongParameterList", "LargeClass")
internal class EarnModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
@ -62,6 +63,7 @@ internal class EarnModel @Inject constructor(
private val appRouter: AppRouter,
private val stateController: EarnStateController,
private val analyticsEventHandler: AnalyticsEventHandler,
private val addToPortfolioManagerFactory: AddToPortfolioManager.Factory,
) : Model() {
private val params = paramsContainer.require<DefaultEarnComponent.Params>()
@ -82,21 +84,24 @@ internal class EarnModel @Inject constructor(
dispatchers = dispatchers,
)
val bottomSheetNavigation: SlotNavigation<FeedBottomSheetRoute> = SlotNavigation()
val addToPortfolioCallback = object : AddToPortfolioPreselectedDataComponent.Callback {
override fun onDismiss() = bottomSheetNavigation.dismiss()
override fun onSuccess(addedToken: CryptoCurrency, walletId: UserWalletId) {
bottomSheetNavigation.dismiss()
appRouter.push(
AppRoute.CurrencyDetails(
userWalletId = walletId,
currency = addedToken,
),
)
}
val addBestOpportunitiesPortfolioManager: AddToPortfolioManager = addToPortfolioManagerFactory.create(
scope = modelScope,
settings = AddToPortfolioManager.Settings.Earn,
analyticsParams = AddToPortfolioManager.AnalyticsParams(source = EarnSource.BEST_OPPORTUNITIES_SOURCE.value),
).apply {
updateLaunchMode(AddToPortfolioManager.LaunchMode.Preselected)
}
val addMostlyUsedPortfolioManager: AddToPortfolioManager = addToPortfolioManagerFactory.create(
scope = modelScope,
settings = AddToPortfolioManager.Settings.Earn,
analyticsParams = AddToPortfolioManager.AnalyticsParams(source = EarnSource.MOSTLY_USED_SOURCE.value),
).apply {
updateLaunchMode(AddToPortfolioManager.LaunchMode.Preselected)
}
val bottomSheetNavigation: SlotNavigation<FeedBottomSheetRoute> = SlotNavigation()
val state: StateFlow<EarnUM>
get() = stateController.uiState
@ -107,6 +112,39 @@ internal class EarnModel @Inject constructor(
subscribeOnNetworks()
subscribeOnBatchFlow()
subscribeToMostlyUsed()
addBestOpportunitiesPortfolioManager.onDismiss.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.launchIn(modelScope)
addBestOpportunitiesPortfolioManager.onSuccessAdded.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
addBestOpportunitiesPortfolioManager.onAddedTokenClick.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
addMostlyUsedPortfolioManager.onDismiss.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.launchIn(modelScope)
addMostlyUsedPortfolioManager.onSuccessAdded.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
addMostlyUsedPortfolioManager.onAddedTokenClick.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
}
private fun openCurrencyDetails(result: AddToPortfolioManager.Result) {
appRouter.push(
AppRoute.CurrencyDetails(
userWalletId = result.wallet.walletId,
currency = result.addedCurrency.currency,
),
)
}
private fun subscribeOnBatchFlow() {
@ -260,30 +298,36 @@ internal class EarnModel @Inject constructor(
}
}
private fun onEarnTokenClick(earnTokenWithCurrency: EarnTokenWithCurrency, source: String) {
private fun onEarnTokenClick(earnTokenWithCurrency: EarnTokenWithCurrency, source: EarnSource) {
analyticsEventHandler.send(
EarnAnalyticsEvent.OpportunitySelected(
tokenSymbol = earnTokenWithCurrency.earnToken.tokenSymbol,
blockchain = earnTokenWithCurrency.cryptoCurrency.network.name,
source = source,
source = source.value,
),
)
bottomSheetNavigation.activate(
FeedBottomSheetRoute.AddToPortfolio(
tokenToAdd = AddToPortfolioPreselectedDataComponent.TokenToAdd(
network = TokenMarketInfo.Network(
networkId = earnTokenWithCurrency.earnToken.networkId,
isExchangeable = false,
contractAddress = earnTokenWithCurrency.earnToken.tokenAddress,
decimalCount = earnTokenWithCurrency.earnToken.decimalCount,
),
id = CryptoCurrency.RawID(earnTokenWithCurrency.earnToken.tokenId),
name = earnTokenWithCurrency.earnToken.tokenName,
symbol = earnTokenWithCurrency.earnToken.tokenSymbol,
),
source = source,
),
val token = RawMarketToken(
id = CryptoCurrency.RawID(earnTokenWithCurrency.earnToken.tokenId),
name = earnTokenWithCurrency.earnToken.tokenName,
symbol = earnTokenWithCurrency.earnToken.tokenSymbol,
)
val network = TokenMarketInfo.Network(
networkId = earnTokenWithCurrency.earnToken.networkId,
isExchangeable = false,
contractAddress = earnTokenWithCurrency.earnToken.tokenAddress,
decimalCount = earnTokenWithCurrency.earnToken.decimalCount,
)
when (source) {
EarnSource.BEST_OPPORTUNITIES_SOURCE -> addBestOpportunitiesPortfolioManager.apply {
setTokenParams(token)
setTokenNetworks(listOf(network))
}
EarnSource.MOSTLY_USED_SOURCE -> addMostlyUsedPortfolioManager.apply {
setTokenParams(token)
setTokenNetworks(listOf(network))
}
}
bottomSheetNavigation.activate(FeedBottomSheetRoute.AddToPortfolio(source.value))
}
private fun onTypeFilterOptionSelected(type: EarnFilterType) {

View file

@ -62,9 +62,10 @@ internal sealed class EarnAnalyticsEvent(
)
}
internal const val BEST_OPPORTUNITIES_SOURCE = "Best Opportunity"
internal const val MOSTLY_USED_SOURCE = "Mostly Used"
internal enum class EarnSource(val value: String) {
BEST_OPPORTUNITIES_SOURCE("Best Opportunity"),
MOSTLY_USED_SOURCE("Mostly Used"),
}
internal enum class FilterNetworkAnalytic(val value: String) {
ALL_NETWORKS("All Networks"),
MY_NETWORKS("My Networks"),

View file

@ -3,7 +3,7 @@ package com.tangem.features.feed.model.earn.state.transformers
import com.tangem.domain.models.earn.EarnTokenWithCurrency
import com.tangem.domain.models.earn.EarnTopToken
import com.tangem.features.feed.model.converter.EarnTokenWithCurrencyToListItemUMConverter
import com.tangem.features.feed.model.earn.analytics.MOSTLY_USED_SOURCE
import com.tangem.features.feed.model.earn.analytics.EarnSource
import com.tangem.features.feed.ui.earn.state.EarnListUM
import com.tangem.features.feed.ui.earn.state.EarnUM
import kotlinx.collections.immutable.toPersistentList
@ -11,12 +11,12 @@ import java.math.BigDecimal
internal class UpdateMostlyUsedStateTransformer(
private val earnResult: EarnTopToken?,
private val onItemClick: (EarnTokenWithCurrency, source: String) -> Unit,
private val onItemClick: (EarnTokenWithCurrency, source: EarnSource) -> Unit,
private val onRetryClick: () -> Unit,
) : EarnUMTransformer {
private val converter = EarnTokenWithCurrencyToListItemUMConverter(
onItemClick = { token -> onItemClick(token, MOSTLY_USED_SOURCE) },
onItemClick = { token -> onItemClick(token, EarnSource.MOSTLY_USED_SOURCE) },
)
override fun transform(prevState: EarnUM): EarnUM {

View file

@ -5,7 +5,7 @@ import com.tangem.domain.earn.model.EarnTokensListConfig
import com.tangem.domain.earn.usecase.GetEarnTokensBatchFlowUseCase
import com.tangem.domain.models.earn.EarnTokenWithCurrency
import com.tangem.features.feed.model.converter.EarnTokenWithCurrencyToListItemUMConverter
import com.tangem.features.feed.model.earn.analytics.BEST_OPPORTUNITIES_SOURCE
import com.tangem.features.feed.model.earn.analytics.EarnSource
import com.tangem.features.feed.ui.earn.state.EarnListItemUM
import com.tangem.pagination.BatchAction
import com.tangem.pagination.PaginationStatus
@ -21,13 +21,13 @@ import kotlinx.coroutines.launch
internal class EarnListBatchFlowManager(
getEarnTokensBatchFlowUseCase: GetEarnTokensBatchFlowUseCase,
private val configProvider: Provider<EarnTokensListConfig>,
private val onItemClick: (EarnTokenWithCurrency, source: String) -> Unit,
private val onItemClick: (EarnTokenWithCurrency, source: EarnSource) -> Unit,
private val modelScope: CoroutineScope,
private val dispatchers: CoroutineDispatcherProvider,
) {
private val actionsFlow = MutableSharedFlow<BatchAction<Int, EarnTokensListConfig, Nothing>>()
private val converter = EarnTokenWithCurrencyToListItemUMConverter(
onItemClick = { onItemClick(it, BEST_OPPORTUNITIES_SOURCE) },
onItemClick = { onItemClick(it, EarnSource.BEST_OPPORTUNITIES_SOURCE) },
)
private val batchFlow = getEarnTokensBatchFlowUseCase(

View file

@ -20,18 +20,14 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.earn.usecase.FetchTopEarnTokensUseCase
import com.tangem.domain.earn.usecase.GetTopEarnTokensUseCase
import com.tangem.domain.markets.GetTopFiveMarketTokenUseCase
import com.tangem.domain.markets.TokenMarketInfo
import com.tangem.domain.markets.TokenMarketListConfig
import com.tangem.domain.markets.toSerializableParam
import com.tangem.domain.markets.*
import com.tangem.domain.models.currency.CryptoCurrency
import com.tangem.domain.models.earn.EarnTokenWithCurrency
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.news.usecase.FetchTrendingNewsUseCase
import com.tangem.domain.news.usecase.ManageTrendingNewsUseCase
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
import com.tangem.features.feed.components.feed.DefaultFeedComponent
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
import com.tangem.features.feed.impl.R
import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
import com.tangem.features.feed.model.feed.analytics.FeedAnalyticsEvent
@ -66,6 +62,7 @@ internal class FeedComponentModel @Inject constructor(
private val getTopEarnTokensUseCase: GetTopEarnTokensUseCase,
private val appRouter: AppRouter,
private val designFeatureToggles: DesignFeatureToggles,
addToPortfolioManagerFactory: AddToPortfolioManager.Factory,
getTopFiveMarketTokenUseCase: GetTopFiveMarketTokenUseCase,
getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase,
paramsContainer: ParamsContainer,
@ -90,21 +87,16 @@ internal class FeedComponentModel @Inject constructor(
dispatchers = dispatchers,
)
val bottomSheetNavigation: SlotNavigation<FeedBottomSheetRoute> = SlotNavigation()
val addToPortfolioCallback = object : AddToPortfolioPreselectedDataComponent.Callback {
override fun onDismiss() = bottomSheetNavigation.dismiss()
override fun onSuccess(addedToken: CryptoCurrency, walletId: UserWalletId) {
bottomSheetNavigation.dismiss()
appRouter.push(
AppRoute.CurrencyDetails(
userWalletId = walletId,
currency = addedToken,
),
)
}
val addToPortfolioManager: AddToPortfolioManager = addToPortfolioManagerFactory.create(
scope = modelScope,
settings = AddToPortfolioManager.Settings.Earn,
analyticsParams = AddToPortfolioManager.AnalyticsParams(source = AnalyticsParam.ScreensSources.Markets.value),
).apply {
updateLaunchMode(AddToPortfolioManager.LaunchMode.Preselected)
}
val bottomSheetNavigation: SlotNavigation<FeedBottomSheetRoute> = SlotNavigation()
val state: StateFlow<FeedListUM>
get() = stateController.uiState
@ -118,6 +110,27 @@ internal class FeedComponentModel @Inject constructor(
fetchCharts()
subscribeOnCurrencyUpdate()
subscribeOnDataState()
addToPortfolioManager.onDismiss.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.launchIn(modelScope)
addToPortfolioManager.onSuccessAdded.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
addToPortfolioManager.onAddedTokenClick.receiveAsFlow()
.onEach { bottomSheetNavigation.dismiss() }
.onEach(::openCurrencyDetails)
.launchIn(modelScope)
}
private fun openCurrencyDetails(result: AddToPortfolioManager.Result) {
appRouter.push(
AppRoute.CurrencyDetails(
userWalletId = result.wallet.walletId,
currency = result.addedCurrency.currency,
),
)
}
private fun subscribeOnDataState() {
@ -407,22 +420,23 @@ internal class FeedComponentModel @Inject constructor(
source = AnalyticsParam.ScreensSources.Markets.value,
),
)
bottomSheetNavigation.activate(
FeedBottomSheetRoute.AddToPortfolio(
tokenToAdd = AddToPortfolioPreselectedDataComponent.TokenToAdd(
network = TokenMarketInfo.Network(
networkId = earnTokenWithCurrency.earnToken.networkId,
isExchangeable = false,
contractAddress = earnTokenWithCurrency.earnToken.tokenAddress,
decimalCount = earnTokenWithCurrency.earnToken.decimalCount,
),
id = CryptoCurrency.RawID(earnTokenWithCurrency.earnToken.tokenId),
name = earnTokenWithCurrency.earnToken.tokenName,
symbol = earnTokenWithCurrency.earnToken.tokenSymbol,
),
source = AnalyticsParam.ScreensSources.Markets.value,
),
val token = RawMarketToken(
id = CryptoCurrency.RawID(earnTokenWithCurrency.earnToken.tokenId),
name = earnTokenWithCurrency.earnToken.tokenName,
symbol = earnTokenWithCurrency.earnToken.tokenSymbol,
)
val network = TokenMarketInfo.Network(
networkId = earnTokenWithCurrency.earnToken.networkId,
isExchangeable = false,
contractAddress = earnTokenWithCurrency.earnToken.tokenAddress,
decimalCount = earnTokenWithCurrency.earnToken.decimalCount,
)
val route = FeedBottomSheetRoute.AddToPortfolio(AnalyticsParam.ScreensSources.Markets.value)
addToPortfolioManager.apply {
setTokenParams(token)
setTokenNetworks(listOf(network))
}
bottomSheetNavigation.activate(route)
}
private fun handleEarnPageOpenClicked() {