Updated on 2026-08-14
This commit is contained in:
parent
596cbb40cb
commit
eb6d4806e6
16 changed files with 291 additions and 710 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
},
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue