Updated on 2026-08-14
This commit is contained in:
parent
c83a46cc1f
commit
c72ffd2e81
71 changed files with 556 additions and 399 deletions
|
|
@ -274,6 +274,8 @@ dependencies {
|
||||||
implementation(projects.features.nft.impl)
|
implementation(projects.features.nft.impl)
|
||||||
implementation(projects.features.walletconnect.api)
|
implementation(projects.features.walletconnect.api)
|
||||||
implementation(projects.features.walletconnect.impl)
|
implementation(projects.features.walletconnect.impl)
|
||||||
|
implementation(projects.features.commonFeatures.api)
|
||||||
|
implementation(projects.features.commonFeatures.impl)
|
||||||
implementation(projects.features.usedesk.api)
|
implementation(projects.features.usedesk.api)
|
||||||
implementation(projects.features.usedesk.impl)
|
implementation(projects.features.usedesk.impl)
|
||||||
implementation(projects.features.hotWallet.api)
|
implementation(projects.features.hotWallet.api)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
plugins {
|
plugins {
|
||||||
alias(deps.plugins.android.library)
|
alias(deps.plugins.android.library)
|
||||||
alias(deps.plugins.kotlin.android)
|
alias(deps.plugins.kotlin.android)
|
||||||
|
alias(deps.plugins.kotlin.kapt)
|
||||||
|
alias(deps.plugins.hilt.android)
|
||||||
id("configuration")
|
id("configuration")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12,13 +14,23 @@ dependencies {
|
||||||
/** Project - Core */
|
/** Project - Core */
|
||||||
implementation(projects.core.ui)
|
implementation(projects.core.ui)
|
||||||
implementation(projects.core.utils)
|
implementation(projects.core.utils)
|
||||||
|
implementation(projects.core.navigation)
|
||||||
|
implementation(projects.core.analytics)
|
||||||
|
|
||||||
/** Project - Common */
|
/** Project - Common */
|
||||||
implementation(projects.common.uiCharts)
|
implementation(projects.common.uiCharts)
|
||||||
implementation(projects.common.ui)
|
implementation(projects.common.ui)
|
||||||
|
implementation(projects.common.routing)
|
||||||
|
|
||||||
/** Project - Domain */
|
/** Project - Domain */
|
||||||
implementation(projects.domain.models)
|
implementation(projects.domain.models)
|
||||||
|
implementation(projects.domain.tokens)
|
||||||
|
implementation(projects.domain.tokens.models)
|
||||||
|
implementation(projects.domain.staking)
|
||||||
|
implementation(projects.domain.staking.models)
|
||||||
|
implementation(projects.domain.onramp.models)
|
||||||
|
implementation(projects.domain.offramp)
|
||||||
|
implementation(projects.domain.demo)
|
||||||
|
|
||||||
implementation(deps.lifecycle.compose)
|
implementation(deps.lifecycle.compose)
|
||||||
implementation(deps.compose.foundation)
|
implementation(deps.compose.foundation)
|
||||||
|
|
@ -26,4 +38,8 @@ dependencies {
|
||||||
implementation(deps.compose.ui.tooling)
|
implementation(deps.compose.ui.tooling)
|
||||||
implementation(deps.compose.ui.utils)
|
implementation(deps.compose.ui.utils)
|
||||||
implementation(deps.kotlin.immutable.collections)
|
implementation(deps.kotlin.immutable.collections)
|
||||||
|
|
||||||
|
/** DI */
|
||||||
|
implementation(deps.hilt.android)
|
||||||
|
kapt(deps.hilt.kapt)
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
|
import com.tangem.domain.tokens.model.TokenActionsState
|
||||||
|
|
||||||
|
data class CryptoCurrencyData(
|
||||||
|
val userWallet: UserWallet,
|
||||||
|
val status: CryptoCurrencyStatus,
|
||||||
|
val actions: List<TokenActionsState.ActionState>,
|
||||||
|
)
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.ui.state
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
|
import com.tangem.common.ui.markets.R
|
||||||
import com.tangem.core.ui.extensions.TextReference
|
import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.core.ui.extensions.wrappedList
|
import com.tangem.core.ui.extensions.wrappedList
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
internal sealed class QuickActionUM(
|
sealed class QuickActionUM(
|
||||||
val title: TextReference,
|
val title: TextReference,
|
||||||
val description: TextReference,
|
val description: TextReference,
|
||||||
@DrawableRes val icon: Int,
|
@DrawableRes val icon: Int,
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
|
data class QuickActions(
|
||||||
|
val actions: ImmutableList<QuickActionUM>,
|
||||||
|
val onQuickActionClick: (QuickActionUM) -> Unit,
|
||||||
|
val onQuickActionLongClick: (QuickActionUM) -> Unit,
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
|
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
|
||||||
|
import com.tangem.domain.tokens.model.TokenActionsState
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
|
object QuickActionsConverter {
|
||||||
|
|
||||||
|
fun quickActions(cryptoData: CryptoCurrencyData, tokenActionsHandler: TokenActionsHandler): QuickActions {
|
||||||
|
return QuickActions(
|
||||||
|
actions = toQuickActions(cryptoData.actions),
|
||||||
|
onQuickActionClick = { quickActionUM ->
|
||||||
|
when (quickActionUM) {
|
||||||
|
QuickActionUM.Buy -> tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.Buy,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
is QuickActionUM.Exchange -> tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.Exchange,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
QuickActionUM.Receive -> tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.Receive,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
QuickActionUM.Stake -> tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.Stake,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
is QuickActionUM.YieldMode -> tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.YieldMode,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onQuickActionLongClick = { actionUM ->
|
||||||
|
if (actionUM == QuickActionUM.Receive) {
|
||||||
|
tokenActionsHandler.handle(
|
||||||
|
action = TokenActionsBSContentUM.Action.CopyAddress,
|
||||||
|
cryptoCurrencyData = cryptoData,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toQuickActions(actions: List<TokenActionsState.ActionState>) = buildList {
|
||||||
|
actions.forEach { action ->
|
||||||
|
if (action.unavailabilityReason == ScenarioUnavailabilityReason.None) {
|
||||||
|
when (action) {
|
||||||
|
is TokenActionsState.ActionState.Buy -> QuickActionUM.Buy
|
||||||
|
is TokenActionsState.ActionState.Swap -> QuickActionUM.Exchange(action.shouldShowBadge)
|
||||||
|
is TokenActionsState.ActionState.Receive -> QuickActionUM.Receive
|
||||||
|
is TokenActionsState.ActionState.Stake -> QuickActionUM.Stake
|
||||||
|
is TokenActionsState.ActionState.YieldMode -> QuickActionUM.YieldMode(action.apy)
|
||||||
|
else -> null
|
||||||
|
}?.let(::add)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.toImmutableList()
|
||||||
|
}
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.ui.state
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
|
import com.tangem.common.ui.markets.R
|
||||||
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
|
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
|
||||||
import com.tangem.core.ui.extensions.TextReference
|
import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
internal data class TokenActionsBSContentUM(
|
data class TokenActionsBSContentUM(
|
||||||
val title: String,
|
val title: String,
|
||||||
val actions: ImmutableList<Action>,
|
val actions: ImmutableList<Action>,
|
||||||
val onActionClick: (Action) -> Unit,
|
val onActionClick: (Action) -> Unit,
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.model
|
package com.tangem.common.ui.markets.action
|
||||||
|
|
||||||
import com.tangem.common.routing.AppRoute
|
import com.tangem.common.routing.AppRoute
|
||||||
import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels
|
import com.tangem.common.ui.bottomsheet.receive.mapToAddressModels
|
||||||
|
import com.tangem.common.ui.markets.R
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.analytics.models.AnalyticsParam
|
import com.tangem.core.analytics.models.AnalyticsParam
|
||||||
import com.tangem.core.analytics.models.event.OfframpAnalyticsEvent
|
import com.tangem.core.analytics.models.event.OfframpAnalyticsEvent
|
||||||
|
|
@ -18,9 +19,6 @@ import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.offramp.GetOfframpUrlUseCase
|
import com.tangem.domain.offramp.GetOfframpUrlUseCase
|
||||||
import com.tangem.domain.onramp.model.OnrampSource
|
import com.tangem.domain.onramp.model.OnrampSource
|
||||||
import com.tangem.domain.tokens.model.TokenActionsState
|
import com.tangem.domain.tokens.model.TokenActionsState
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.TokenActionsBSContentUM
|
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
import com.tangem.utils.Provider
|
import com.tangem.utils.Provider
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
|
|
@ -28,7 +26,7 @@ import dagger.assisted.AssistedInject
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
internal class TokenActionsHandler @AssistedInject constructor(
|
class TokenActionsHandler @AssistedInject constructor(
|
||||||
private val router: Router,
|
private val router: Router,
|
||||||
private val clipboardManager: ClipboardManager,
|
private val clipboardManager: ClipboardManager,
|
||||||
private val uiMessageSender: UiMessageSender,
|
private val uiMessageSender: UiMessageSender,
|
||||||
|
|
@ -45,7 +43,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
add(TokenActionsBSContentUM.Action.Sell)
|
add(TokenActionsBSContentUM.Action.Sell)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun handle(action: TokenActionsBSContentUM.Action, cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
fun handle(action: TokenActionsBSContentUM.Action, cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
onHandleQuickAction(
|
onHandleQuickAction(
|
||||||
HandledQuickAction(
|
HandledQuickAction(
|
||||||
action = action,
|
action = action,
|
||||||
|
|
@ -79,13 +77,13 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showDemoModeWarning() {
|
private fun showDemoModeWarning() {
|
||||||
val message = DialogMessage(
|
val message = DialogMessage.Companion(
|
||||||
message = resourceReference(R.string.alert_demo_feature_disabled),
|
message = resourceReference(R.string.alert_demo_feature_disabled),
|
||||||
)
|
)
|
||||||
messageSender.send(message)
|
messageSender.send(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onCopyAddress(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onCopyAddress(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
val cryptoCurrencyStatus = cryptoCurrencyData.status
|
val cryptoCurrencyStatus = cryptoCurrencyData.status
|
||||||
val networkAddress = cryptoCurrencyStatus.value.networkAddress ?: return
|
val networkAddress = cryptoCurrencyStatus.value.networkAddress ?: return
|
||||||
val addresses = networkAddress.availableAddresses
|
val addresses = networkAddress.availableAddresses
|
||||||
|
|
@ -97,7 +95,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
uiMessageSender.send(SnackbarMessage(resourceReference(R.string.wallet_notification_address_copied)))
|
uiMessageSender.send(SnackbarMessage(resourceReference(R.string.wallet_notification_address_copied)))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onBuyClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onBuyClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
router.push(
|
router.push(
|
||||||
AppRoute.Onramp(
|
AppRoute.Onramp(
|
||||||
userWalletId = cryptoCurrencyData.userWallet.walletId,
|
userWalletId = cryptoCurrencyData.userWallet.walletId,
|
||||||
|
|
@ -107,7 +105,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSellClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onSellClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
getOfframpUrlUseCase(
|
getOfframpUrlUseCase(
|
||||||
cryptoCurrencyStatus = cryptoCurrencyData.status,
|
cryptoCurrencyStatus = cryptoCurrencyData.status,
|
||||||
appCurrencyCode = currentAppCurrency().code,
|
appCurrencyCode = currentAppCurrency().code,
|
||||||
|
|
@ -117,7 +115,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onExchangeClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onExchangeClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
router.push(
|
router.push(
|
||||||
AppRoute.Swap(
|
AppRoute.Swap(
|
||||||
currencyFrom = cryptoCurrencyData.status.currency,
|
currencyFrom = cryptoCurrencyData.status.currency,
|
||||||
|
|
@ -128,7 +126,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSendClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onSendClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
val route = AppRoute.SendEntryPoint(
|
val route = AppRoute.SendEntryPoint(
|
||||||
userWalletId = cryptoCurrencyData.userWallet.walletId,
|
userWalletId = cryptoCurrencyData.userWallet.walletId,
|
||||||
currency = cryptoCurrencyData.status.currency,
|
currency = cryptoCurrencyData.status.currency,
|
||||||
|
|
@ -136,7 +134,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
router.push(route)
|
router.push(route)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onStakeClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onStakeClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
val option = cryptoCurrencyData.actions.firstOrNull { it is TokenActionsState.ActionState.Stake }
|
val option = cryptoCurrencyData.actions.firstOrNull { it is TokenActionsState.ActionState.Stake }
|
||||||
?.let { it as TokenActionsState.ActionState.Stake }
|
?.let { it as TokenActionsState.ActionState.Stake }
|
||||||
?.option ?: return
|
?.option ?: return
|
||||||
|
|
@ -150,7 +148,7 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onYieldModeClick(cryptoCurrencyData: PortfolioData.CryptoCurrencyData) {
|
private fun onYieldModeClick(cryptoCurrencyData: CryptoCurrencyData) {
|
||||||
val yieldSupplyApy = cryptoCurrencyData.actions.filterIsInstance<TokenActionsState.ActionState.YieldMode>()
|
val yieldSupplyApy = cryptoCurrencyData.actions.filterIsInstance<TokenActionsState.ActionState.YieldMode>()
|
||||||
.firstOrNull()?.apy ?: return
|
.firstOrNull()?.apy ?: return
|
||||||
|
|
||||||
|
|
@ -173,6 +171,6 @@ internal class TokenActionsHandler @AssistedInject constructor(
|
||||||
|
|
||||||
data class HandledQuickAction(
|
data class HandledQuickAction(
|
||||||
val action: TokenActionsBSContentUM.Action,
|
val action: TokenActionsBSContentUM.Action,
|
||||||
val cryptoCurrencyData: PortfolioData.CryptoCurrencyData,
|
val cryptoCurrencyData: CryptoCurrencyData,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
1
features/common-features/api/.gitignore
vendored
Normal file
1
features/common-features/api/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/build
|
||||||
27
features/common-features/api/build.gradle.kts
Normal file
27
features/common-features/api/build.gradle.kts
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
plugins {
|
||||||
|
alias(deps.plugins.android.library)
|
||||||
|
alias(deps.plugins.kotlin.android)
|
||||||
|
alias(deps.plugins.kotlin.serialization)
|
||||||
|
id("configuration")
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.tangem.features.commonfeatures.api"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
/** Api */ // todo swap delete after move portfolio selector
|
||||||
|
implementation(projects.features.account.api)
|
||||||
|
|
||||||
|
/* Project - Domain */
|
||||||
|
implementation(projects.domain.models)
|
||||||
|
implementation(projects.domain.markets)
|
||||||
|
|
||||||
|
/* Project - Core */
|
||||||
|
implementation(projects.core.decompose)
|
||||||
|
implementation(projects.core.ui)
|
||||||
|
|
||||||
|
/* Compose */
|
||||||
|
implementation(deps.compose.runtime)
|
||||||
|
implementation(deps.kotlin.immutable.collections)
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add
|
package com.tangem.features.commonfeatures.api.addtoportfolio
|
||||||
|
|
||||||
import com.tangem.core.decompose.factory.ComponentFactory
|
import com.tangem.core.decompose.factory.ComponentFactory
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add
|
package com.tangem.features.commonfeatures.api.addtoportfolio
|
||||||
|
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.domain.markets.TokenMarketParams
|
import com.tangem.domain.markets.TokenMarketParams
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add
|
package com.tangem.features.commonfeatures.api.addtoportfolio
|
||||||
|
|
||||||
import com.tangem.core.decompose.factory.ComponentFactory
|
import com.tangem.core.decompose.factory.ComponentFactory
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add
|
package com.tangem.features.commonfeatures.api.addtoportfolio
|
||||||
|
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.domain.models.account.AccountId
|
import com.tangem.domain.models.account.AccountId
|
||||||
1
features/common-features/impl/.gitignore
vendored
Normal file
1
features/common-features/impl/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/build
|
||||||
81
features/common-features/impl/build.gradle.kts
Normal file
81
features/common-features/impl/build.gradle.kts
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
plugins {
|
||||||
|
alias(deps.plugins.android.library)
|
||||||
|
alias(deps.plugins.kotlin.android)
|
||||||
|
alias(deps.plugins.kotlin.kapt)
|
||||||
|
alias(deps.plugins.kotlin.serialization)
|
||||||
|
alias(deps.plugins.hilt.android)
|
||||||
|
id("configuration")
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.tangem.features.commonfeatures.impl"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
/** Api */
|
||||||
|
implementation(projects.features.commonFeatures.api)
|
||||||
|
// todo swap delete after move portfolio selector
|
||||||
|
implementation(projects.features.account.api)
|
||||||
|
implementation(projects.features.tokenRecieve.api)
|
||||||
|
|
||||||
|
/** Core modules */
|
||||||
|
implementation(projects.core.analytics)
|
||||||
|
implementation(projects.core.analytics.models)
|
||||||
|
implementation(projects.core.utils)
|
||||||
|
implementation(projects.core.ui)
|
||||||
|
implementation(projects.core.error)
|
||||||
|
implementation(projects.core.res)
|
||||||
|
implementation(projects.core.decompose)
|
||||||
|
implementation(projects.core.navigation)
|
||||||
|
implementation(projects.core.datasource)
|
||||||
|
|
||||||
|
/** Domain */
|
||||||
|
implementation(projects.domain.models)
|
||||||
|
implementation(projects.domain.account)
|
||||||
|
implementation(projects.domain.account.status)
|
||||||
|
implementation(projects.domain.core)
|
||||||
|
implementation(projects.domain.appCurrency)
|
||||||
|
implementation(projects.domain.appCurrency.models)
|
||||||
|
implementation(projects.domain.markets)
|
||||||
|
implementation(projects.domain.transaction)
|
||||||
|
implementation(projects.domain.tokens)
|
||||||
|
implementation(projects.domain.tokens.models)
|
||||||
|
implementation(projects.domain.manageTokens)
|
||||||
|
implementation(projects.domain.manageTokens.models)
|
||||||
|
implementation(projects.domain.balanceHiding)
|
||||||
|
implementation(projects.domain.balanceHiding.models)
|
||||||
|
implementation(projects.domain.wallets)
|
||||||
|
implementation(projects.domain.wallets.models)
|
||||||
|
|
||||||
|
/** Tangem libraries */
|
||||||
|
implementation(tangemDeps.card.core)
|
||||||
|
|
||||||
|
/** Common */
|
||||||
|
implementation(projects.common.ui)
|
||||||
|
implementation(projects.common.uiMarkets)
|
||||||
|
implementation(projects.common.routing)
|
||||||
|
|
||||||
|
/** AndroidX libraries */
|
||||||
|
implementation(deps.androidx.core.ktx)
|
||||||
|
implementation(deps.lifecycle.runtime.ktx)
|
||||||
|
|
||||||
|
/** Compose libraries */
|
||||||
|
implementation(deps.compose.material3)
|
||||||
|
implementation(deps.compose.animation)
|
||||||
|
implementation(deps.compose.foundation)
|
||||||
|
implementation(deps.compose.ui)
|
||||||
|
implementation(deps.compose.ui.tooling)
|
||||||
|
implementation(deps.compose.coil)
|
||||||
|
implementation(deps.decompose.ext.compose)
|
||||||
|
implementation(deps.androidx.activity.compose)
|
||||||
|
|
||||||
|
/** Other libraries */
|
||||||
|
implementation(deps.arrow.core)
|
||||||
|
implementation(deps.kotlin.immutable.collections)
|
||||||
|
implementation(deps.kotlin.serialization)
|
||||||
|
implementation(deps.firebase.crashlytics)
|
||||||
|
|
||||||
|
/** DI */
|
||||||
|
implementation(deps.hilt.android)
|
||||||
|
kapt(deps.hilt.kapt)
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedContent
|
import androidx.compose.animation.AnimatedContent
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
|
@ -9,6 +9,7 @@ import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import com.arkivanov.decompose.router.stack.ChildStack
|
import com.arkivanov.decompose.router.stack.ChildStack
|
||||||
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
|
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
|
||||||
|
|
@ -20,8 +21,7 @@ import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.features.account.PortfolioSelectorComponent
|
import com.tangem.features.account.PortfolioSelectorComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddToPortfolioRoutes
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioRoutes
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
internal fun AddToPortfolioBottomSheet(
|
internal fun AddToPortfolioBottomSheet(
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
@ -9,10 +9,10 @@ import com.tangem.core.decompose.factory.ComponentFactory
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedNetwork
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddTokenModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedPortfolio
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedNetwork
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddTokenModel
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedPortfolio
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.analytics.PortfolioAnalyticsEvent
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
|
@ -9,9 +9,9 @@ import com.tangem.core.decompose.factory.ComponentFactory
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedPortfolio
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.ChooseNetworkModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.ChooseNetworkModel
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.ChooseNetworkContent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.ChooseNetworkContent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedPortfolio
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import com.arkivanov.decompose.ComponentContext
|
import com.arkivanov.decompose.ComponentContext
|
||||||
|
|
@ -12,9 +12,9 @@ import com.tangem.core.decompose.context.childByContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||||
import com.tangem.features.account.PortfolioSelectorComponent
|
import com.tangem.features.account.PortfolioSelectorComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddToPortfolioModel
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddToPortfolioRoutes
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioRoutes
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import com.arkivanov.decompose.extensions.compose.subscribeAsState
|
import com.arkivanov.decompose.extensions.compose.subscribeAsState
|
||||||
|
|
@ -10,9 +10,9 @@ import com.tangem.core.decompose.context.child
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||||
import com.tangem.features.account.PortfolioSelectorComponent
|
import com.tangem.features.account.PortfolioSelectorComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioPreselectedDataModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddToPortfolioPreselectedDataModel
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioRoutes
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddToPortfolioRoutes
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl
|
package com.tangem.features.commonfeatures.impl.addtoportfolio
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
|
@ -8,6 +8,7 @@ import com.arkivanov.decompose.ComponentContext
|
||||||
import com.arkivanov.decompose.extensions.compose.subscribeAsState
|
import com.arkivanov.decompose.extensions.compose.subscribeAsState
|
||||||
import com.arkivanov.decompose.router.slot.childSlot
|
import com.arkivanov.decompose.router.slot.childSlot
|
||||||
import com.arkivanov.decompose.router.slot.dismiss
|
import com.arkivanov.decompose.router.slot.dismiss
|
||||||
|
import com.tangem.common.ui.markets.action.CryptoCurrencyData
|
||||||
import com.tangem.core.decompose.context.AppComponentContext
|
import com.tangem.core.decompose.context.AppComponentContext
|
||||||
import com.tangem.core.decompose.context.childByContext
|
import com.tangem.core.decompose.context.childByContext
|
||||||
import com.tangem.core.decompose.factory.ComponentFactory
|
import com.tangem.core.decompose.factory.ComponentFactory
|
||||||
|
|
@ -15,10 +16,9 @@ import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||||
import com.tangem.domain.models.TokenReceiveConfig
|
import com.tangem.domain.models.TokenReceiveConfig
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.TokenActionsModel
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.analytics.PortfolioAnalyticsEvent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.TokenActionsContent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.TokenActionsModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.TokenActionsContent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
|
||||||
import com.tangem.features.tokenreceive.TokenReceiveComponent
|
import com.tangem.features.tokenreceive.TokenReceiveComponent
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
|
|
@ -64,7 +64,7 @@ internal class TokenActionsComponent @AssistedInject constructor(
|
||||||
|
|
||||||
data class Params(
|
data class Params(
|
||||||
val eventBuilder: PortfolioAnalyticsEvent.EventBuilder,
|
val eventBuilder: PortfolioAnalyticsEvent.EventBuilder,
|
||||||
val data: Flow<PortfolioData.CryptoCurrencyData>,
|
val data: Flow<CryptoCurrencyData>,
|
||||||
val callbacks: Callbacks,
|
val callbacks: Callbacks,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.analytics
|
||||||
|
|
||||||
|
import com.tangem.core.analytics.models.AnalyticsEvent
|
||||||
|
import com.tangem.core.analytics.models.AnalyticsParam
|
||||||
|
|
||||||
|
// todo swap unify with PortfolioAnalyticsEvent, AddToPortfolioFlow
|
||||||
|
internal sealed class EarnAnalyticsEvent(
|
||||||
|
event: String,
|
||||||
|
params: Map<String, String> = emptyMap(),
|
||||||
|
) : AnalyticsEvent(category = "Earn", event = event, params = params) {
|
||||||
|
|
||||||
|
data class AddTokenScreenOpened(
|
||||||
|
private val tokenSymbol: String,
|
||||||
|
private val blockchain: String,
|
||||||
|
private val source: String,
|
||||||
|
) : EarnAnalyticsEvent(
|
||||||
|
event = "Add Token Screen Opened",
|
||||||
|
params = mapOf(
|
||||||
|
AnalyticsParam.TOKEN_PARAM to tokenSymbol,
|
||||||
|
AnalyticsParam.BLOCKCHAIN to blockchain,
|
||||||
|
AnalyticsParam.SOURCE to source,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
data class TokenAdded(
|
||||||
|
private val tokenSymbol: String,
|
||||||
|
private val blockchain: String,
|
||||||
|
) : EarnAnalyticsEvent(
|
||||||
|
event = "Token Added",
|
||||||
|
params = mapOf(
|
||||||
|
AnalyticsParam.TOKEN_PARAM to tokenSymbol,
|
||||||
|
AnalyticsParam.BLOCKCHAIN to blockchain,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.analytics
|
||||||
|
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsBSContentUM
|
||||||
|
import com.tangem.core.analytics.models.AnalyticsEvent
|
||||||
|
|
||||||
|
// todo swap unify with EarnAnalyticsEvent, AddToPortfolioFlow
|
||||||
|
internal class PortfolioAnalyticsEvent(
|
||||||
|
event: String,
|
||||||
|
params: Map<String, String> = emptyMap(),
|
||||||
|
) : AnalyticsEvent(category = "Markets / Chart", event = event, params = params) {
|
||||||
|
|
||||||
|
data class EventBuilder(
|
||||||
|
val tokenSymbol: String,
|
||||||
|
val source: String?,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun popupToChooseAccount() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Choose Account Opened",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun popupToConfirm() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Add Token Screen Opened",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun addToNotMainAccount() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Button - Add To Account",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun addButtonClick() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Button - Add Token",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Wallet Selected",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun addToPortfolioContinue(blockchainNames: List<String>) = PortfolioAnalyticsEvent(
|
||||||
|
event = "Token Network Selected",
|
||||||
|
params = buildMap {
|
||||||
|
put("Count", blockchainNames.size.toString())
|
||||||
|
put("Token", tokenSymbol)
|
||||||
|
put("blockchain", blockchainNames.joinToString(separator = ", "))
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun tokenAdded(blockchainName: String) = PortfolioAnalyticsEvent(
|
||||||
|
event = "Token Added",
|
||||||
|
params = buildMap {
|
||||||
|
put("Token", tokenSymbol)
|
||||||
|
put("Blockchain", blockchainName)
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getTokenActionClick(actionUM: TokenActionsBSContentUM.Action) = PortfolioAnalyticsEvent(
|
||||||
|
event = when (actionUM) {
|
||||||
|
TokenActionsBSContentUM.Action.Buy -> "Popup Get token - Button Buy"
|
||||||
|
TokenActionsBSContentUM.Action.Receive -> "Popup Get token - Button Receive"
|
||||||
|
TokenActionsBSContentUM.Action.Exchange -> "Popup Get token - Button Exchange"
|
||||||
|
TokenActionsBSContentUM.Action.Stake -> "Popup Get token - Button Stake"
|
||||||
|
else -> "error"
|
||||||
|
},
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getTokenLater() = PortfolioAnalyticsEvent(
|
||||||
|
event = "Popup Get token - Button Later",
|
||||||
|
params = buildMap {
|
||||||
|
if (source != null) put("Source", source)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.converter
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.converter
|
||||||
|
|
||||||
import com.tangem.domain.account.status.usecase.GetAccountCurrencyStatusUseCase
|
import com.tangem.domain.account.status.usecase.GetAccountCurrencyStatusUseCase
|
||||||
import com.tangem.domain.markets.FilterAvailableNetworksForWalletUseCase
|
import com.tangem.domain.markets.FilterAvailableNetworksForWalletUseCase
|
||||||
|
|
@ -13,9 +13,9 @@ import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.features.account.PortfolioFetcher
|
import com.tangem.features.account.PortfolioFetcher
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AvailableToAddAccount
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AvailableToAddAccount
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AvailableToAddData
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AvailableToAddData
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AvailableToAddWallet
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AvailableToAddWallet
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
internal class AvailableToAddDataConverter @Inject constructor(
|
internal class AvailableToAddDataConverter @Inject constructor(
|
||||||
|
|
@ -1,15 +1,14 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.converter
|
||||||
|
|
||||||
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
||||||
import com.tangem.core.ui.extensions.getActiveIconRes
|
import com.tangem.core.ui.extensions.getActiveIconRes
|
||||||
import com.tangem.core.ui.extensions.getGreyedOutIconRes
|
import com.tangem.core.ui.extensions.getGreyedOutIconRes
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.domain.markets.TokenMarketInfo.Network
|
|
||||||
import com.tangem.lib.crypto.BlockchainUtils
|
import com.tangem.lib.crypto.BlockchainUtils
|
||||||
import com.tangem.utils.converter.Converter
|
import com.tangem.utils.converter.Converter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converter from [TokenMarketInfo.Network] to [BlockchainRowUM]
|
* Converter from [com.tangem.domain.markets.TokenMarketInfo.Network] to [com.tangem.core.ui.components.rows.model.BlockchainRowUM]
|
||||||
*
|
*
|
||||||
* @property alreadyAddedNetworks set of already added networks
|
* @property alreadyAddedNetworks set of already added networks
|
||||||
*
|
*
|
||||||
|
|
@ -17,9 +16,9 @@ import com.tangem.utils.converter.Converter
|
||||||
*/
|
*/
|
||||||
internal class BlockchainRowUMConverter(
|
internal class BlockchainRowUMConverter(
|
||||||
private val alreadyAddedNetworks: Set<String>,
|
private val alreadyAddedNetworks: Set<String>,
|
||||||
) : Converter<Pair<Network, Boolean>, BlockchainRowUM> {
|
) : Converter<Pair<TokenMarketInfo.Network, Boolean>, BlockchainRowUM> {
|
||||||
|
|
||||||
override fun convert(value: Pair<Network, Boolean>): BlockchainRowUM {
|
override fun convert(value: Pair<TokenMarketInfo.Network, Boolean>): BlockchainRowUM {
|
||||||
val (network, isSelected) = value
|
val (network, isSelected) = value
|
||||||
|
|
||||||
val blockchainInfo = BlockchainUtils.getNetworkInfo(networkId = network.networkId)
|
val blockchainInfo = BlockchainUtils.getNetworkInfo(networkId = network.networkId)
|
||||||
|
|
@ -48,7 +47,10 @@ internal class BlockchainRowUMConverter(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getNetworkType(network: Network, blockchainInfo: BlockchainUtils.BlockchainInfo): String {
|
private fun getNetworkType(
|
||||||
|
network: TokenMarketInfo.Network,
|
||||||
|
blockchainInfo: BlockchainUtils.BlockchainInfo,
|
||||||
|
): String {
|
||||||
val isMainNetwork = network.contractAddress == null
|
val isMainNetwork = network.contractAddress == null
|
||||||
return when {
|
return when {
|
||||||
BlockchainUtils.isL2Network(networkId = network.networkId) -> MAIN_NETWORK_L2_TYPE_NAME
|
BlockchainUtils.isL2Network(networkId = network.networkId) -> MAIN_NETWORK_L2_TYPE_NAME
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.di
|
||||||
|
|
||||||
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.DefaultAddToPortfolioComponent
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.DefaultAddToPortfolioPreselectedDataComponent
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.DefaultAddToPortfolioManager
|
||||||
|
import dagger.Binds
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
internal interface AddToPortfolioComponentModule {
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindAddToPortfolioComponent(factory: DefaultAddToPortfolioComponent.Factory): AddToPortfolioComponent.Factory
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindAddToPortfolioManagerFactory(factory: DefaultAddToPortfolioManager.Factory): AddToPortfolioManager.Factory
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindAddToPortfolioPreselectedDataComponent(
|
||||||
|
factory: DefaultAddToPortfolioPreselectedDataComponent.Factory,
|
||||||
|
): AddToPortfolioPreselectedDataComponent.Factory
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,12 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.di
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.di
|
||||||
|
|
||||||
import com.tangem.core.decompose.di.ModelComponent
|
import com.tangem.core.decompose.di.ModelComponent
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.*
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioModel
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddToPortfolioPreselectedDataModel
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddTokenModel
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.ChooseNetworkModel
|
||||||
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.TokenActionsModel
|
||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.hilt.InstallIn
|
import dagger.hilt.InstallIn
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.arkivanov.decompose.router.stack.StackNavigation
|
import com.arkivanov.decompose.router.stack.StackNavigation
|
||||||
import com.arkivanov.decompose.router.stack.popToFirst
|
import com.arkivanov.decompose.router.stack.popToFirst
|
||||||
import com.arkivanov.decompose.router.stack.pushNew
|
import com.arkivanov.decompose.router.stack.pushNew
|
||||||
import com.arkivanov.decompose.router.stack.replaceAll
|
import com.arkivanov.decompose.router.stack.replaceAll
|
||||||
|
import com.tangem.common.ui.markets.action.CryptoCurrencyData
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionsConverter.toQuickActions
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
|
|
@ -19,22 +21,20 @@ import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.features.account.PortfolioSelectorController
|
import com.tangem.features.account.PortfolioSelectorController
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.*
|
import com.tangem.features.commonfeatures.api.addtoportfolio.*
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.AddTokenComponent
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ChooseNetworkComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.AddTokenComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.TokenActionsComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ChooseNetworkComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.TokenActionsComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.analytics.PortfolioAnalyticsEvent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.PortfolioTokenUMConverter.Companion.toQuickActions
|
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
|
import com.tangem.utils.logging.TangemLogger
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.channels.BufferOverflow
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
import kotlinx.coroutines.channels.Channel
|
import kotlinx.coroutines.channels.Channel
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import com.tangem.utils.logging.TangemLogger
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val TOKEN_ACTIONS_DELAY = 500L
|
private const val TOKEN_ACTIONS_DELAY = 500L
|
||||||
|
|
@ -62,7 +62,7 @@ internal class AddToPortfolioModel @Inject constructor(
|
||||||
/* Flows that hold state and provide it to child models */
|
/* Flows that hold state and provide it to child models */
|
||||||
val selectedNetwork: MutableSharedFlow<SelectedNetwork> = replayMutableSharedFlow()
|
val selectedNetwork: MutableSharedFlow<SelectedNetwork> = replayMutableSharedFlow()
|
||||||
val selectedPortfolio: MutableSharedFlow<SelectedPortfolio> = replayMutableSharedFlow()
|
val selectedPortfolio: MutableSharedFlow<SelectedPortfolio> = replayMutableSharedFlow()
|
||||||
val tokenActionsData: MutableSharedFlow<PortfolioData.CryptoCurrencyData> = replayMutableSharedFlow()
|
val tokenActionsData: MutableSharedFlow<CryptoCurrencyData> = replayMutableSharedFlow()
|
||||||
|
|
||||||
private val addToPortfolioManager = params.addToPortfolioManager
|
private val addToPortfolioManager = params.addToPortfolioManager
|
||||||
val portfolioFetcher = addToPortfolioManager.portfolioFetcher
|
val portfolioFetcher = addToPortfolioManager.portfolioFetcher
|
||||||
|
|
@ -255,7 +255,7 @@ internal class AddToPortfolioModel @Inject constructor(
|
||||||
private fun setupTokenActionsFlow(
|
private fun setupTokenActionsFlow(
|
||||||
selectedPortfolio: SelectedPortfolio,
|
selectedPortfolio: SelectedPortfolio,
|
||||||
addedToken: CryptoCurrencyStatus,
|
addedToken: CryptoCurrencyStatus,
|
||||||
): Flow<PortfolioData.CryptoCurrencyData> {
|
): Flow<CryptoCurrencyData> {
|
||||||
val timeFlow = channelFlow {
|
val timeFlow = channelFlow {
|
||||||
val timerJob = launch { delay(TOKEN_ACTIONS_DELAY) }
|
val timerJob = launch { delay(TOKEN_ACTIONS_DELAY) }
|
||||||
getCryptoCurrencyActionsUseCase(
|
getCryptoCurrencyActionsUseCase(
|
||||||
|
|
@ -275,7 +275,7 @@ internal class AddToPortfolioModel @Inject constructor(
|
||||||
}.collect()
|
}.collect()
|
||||||
}
|
}
|
||||||
return timeFlow.map { actionsState ->
|
return timeFlow.map { actionsState ->
|
||||||
PortfolioData.CryptoCurrencyData(
|
CryptoCurrencyData(
|
||||||
userWallet = selectedPortfolio.userWallet,
|
userWallet = selectedPortfolio.userWallet,
|
||||||
status = actionsState.cryptoCurrencyStatus,
|
status = actionsState.cryptoCurrencyStatus,
|
||||||
actions = actionsState.states,
|
actions = actionsState.states,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.arkivanov.decompose.router.stack.StackNavigation
|
import com.arkivanov.decompose.router.stack.StackNavigation
|
||||||
import com.arkivanov.decompose.router.stack.replaceAll
|
import com.arkivanov.decompose.router.stack.replaceAll
|
||||||
|
|
@ -22,17 +22,19 @@ import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.features.account.PortfolioFetcher
|
import com.tangem.features.account.PortfolioFetcher
|
||||||
import com.tangem.features.account.PortfolioSelectorController
|
import com.tangem.features.account.PortfolioSelectorController
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.*
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.AddTokenComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.AddTokenComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.*
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.analytics.EarnAnalyticsEvent
|
||||||
import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.analytics.PortfolioAnalyticsEvent
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import com.tangem.utils.logging.TangemLogger
|
import com.tangem.utils.logging.TangemLogger
|
||||||
import kotlinx.coroutines.channels.Channel
|
import kotlinx.coroutines.channels.Channel
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import java.math.BigDecimal
|
import java.math.BigDecimal
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.collections.get
|
||||||
|
import kotlin.collections.mapNotNull
|
||||||
|
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
internal class AddToPortfolioPreselectedDataModel @Inject constructor(
|
internal class AddToPortfolioPreselectedDataModel @Inject constructor(
|
||||||
|
|
@ -163,7 +165,7 @@ internal class AddToPortfolioPreselectedDataModel @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates [AvailableToAddData] for preselected network when token is already added in all networks.
|
* Creates [com.tangem.features.commonfeatures.api.AvailableToAddData] for preselected network when token is already added in all networks.
|
||||||
* This allows user to select wallet/account and do smth after it with selected info.
|
* This allows user to select wallet/account and do smth after it with selected info.
|
||||||
*/
|
*/
|
||||||
private suspend fun createAvailableToAddDataForPreselectedNetwork(
|
private suspend fun createAvailableToAddDataForPreselectedNetwork(
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import com.tangem.core.decompose.navigation.Route
|
import com.tangem.core.decompose.navigation.Route
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedPortfolio
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedPortfolio
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.tangem.common.ui.addtoken.AddTokenUM
|
import com.tangem.common.ui.addtoken.AddTokenUM
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
|
|
@ -13,11 +13,11 @@ import com.tangem.domain.account.status.usecase.GetAccountCurrencyStatusUseCase
|
||||||
import com.tangem.domain.account.status.usecase.ManageCryptoCurrenciesUseCase
|
import com.tangem.domain.account.status.usecase.ManageCryptoCurrenciesUseCase
|
||||||
import com.tangem.domain.models.account.Account
|
import com.tangem.domain.models.account.Account
|
||||||
import com.tangem.domain.wallets.usecase.ColdWalletAndHasMissedDerivationsUseCase
|
import com.tangem.domain.wallets.usecase.ColdWalletAndHasMissedDerivationsUseCase
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedNetwork
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.AddTokenComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedPortfolio
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.model.AddTokenUiBuilder.Companion.toggleProgress
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.AddTokenComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedNetwork
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.model.AddTokenUiBuilder.Companion.toggleProgress
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedPortfolio
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import com.tangem.lib.crypto.BlockchainUtils
|
import com.tangem.lib.crypto.BlockchainUtils
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import com.tangem.utils.coroutines.JobHolder
|
import com.tangem.utils.coroutines.JobHolder
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.tangem.common.ui.account.AccountIconUM
|
import com.tangem.common.ui.account.AccountIconUM
|
||||||
import com.tangem.common.ui.account.CryptoPortfolioIconConverter
|
import com.tangem.common.ui.account.CryptoPortfolioIconConverter
|
||||||
|
|
@ -14,10 +14,10 @@ import com.tangem.core.ui.extensions.iconResId
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.core.ui.extensions.stringReference
|
import com.tangem.core.ui.extensions.stringReference
|
||||||
import com.tangem.domain.models.account.AccountStatus.*
|
import com.tangem.domain.models.account.AccountStatus.*
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedNetwork
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.AddTokenComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.SelectedPortfolio
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedNetwork
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.AddTokenComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.SelectedPortfolio
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ModelScoped
|
@ModelScoped
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import arrow.core.getOrElse
|
import arrow.core.getOrElse
|
||||||
import com.tangem.core.decompose.ui.UiMessageSender
|
import com.tangem.core.decompose.ui.UiMessageSender
|
||||||
|
|
@ -10,7 +10,7 @@ import com.tangem.core.ui.message.SnackbarMessage
|
||||||
import com.tangem.domain.managetokens.CheckCurrencyUnsupportedUseCase
|
import com.tangem.domain.managetokens.CheckCurrencyUnsupportedUseCase
|
||||||
import com.tangem.domain.managetokens.model.CurrencyUnsupportedState
|
import com.tangem.domain.managetokens.model.CurrencyUnsupportedState
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import com.tangem.utils.logging.TangemLogger
|
import com.tangem.utils.logging.TangemLogger
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
import com.tangem.core.decompose.model.ParamsContainer
|
import com.tangem.core.decompose.model.ParamsContainer
|
||||||
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ChooseNetworkComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ChooseNetworkComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state.ChooseNetworkUM
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.converter.BlockchainRowUMConverter
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.BlockchainRowUMConverter
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state.ChooseNetworkUM
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||||
import com.arkivanov.decompose.router.slot.activate
|
import com.arkivanov.decompose.router.slot.activate
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsBSContentUM
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsHandler
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
|
|
@ -10,10 +12,8 @@ import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.models.TokenReceiveConfig
|
import com.tangem.domain.models.TokenReceiveConfig
|
||||||
import com.tangem.domain.transaction.usecase.ReceiveAddressesFactory
|
import com.tangem.domain.transaction.usecase.ReceiveAddressesFactory
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.TokenActionsComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.TokenActionsComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state.TokenActionsUM
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state.TokenActionsUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.TokenActionsHandler
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.TokenActionsBSContentUM
|
|
||||||
import com.tangem.utils.Provider
|
import com.tangem.utils.Provider
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.model
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.model
|
||||||
|
|
||||||
|
import com.tangem.common.ui.markets.action.CryptoCurrencyData
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionsConverter.quickActions
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsHandler
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.ParamsContainer
|
import com.tangem.core.decompose.model.ParamsContainer
|
||||||
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
|
import com.tangem.core.ui.components.currency.icon.converter.CryptoCurrencyToIconStateConverter
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState
|
import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
import com.tangem.core.ui.extensions.stringReference
|
import com.tangem.core.ui.extensions.stringReference
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.TokenActionsComponent
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.TokenActionsComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state.TokenActionsUM
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state.TokenActionsUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.PortfolioTokenUMConverter
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.TokenActionsHandler
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ModelScoped
|
@ModelScoped
|
||||||
|
|
@ -20,7 +20,7 @@ internal class TokenActionsUiBuilder @Inject constructor(
|
||||||
) {
|
) {
|
||||||
private val params = paramsContainer.require<TokenActionsComponent.Params>()
|
private val params = paramsContainer.require<TokenActionsComponent.Params>()
|
||||||
|
|
||||||
fun build(data: PortfolioData.CryptoCurrencyData, tokenActionsHandler: TokenActionsHandler): TokenActionsUM {
|
fun build(data: CryptoCurrencyData, tokenActionsHandler: TokenActionsHandler): TokenActionsUM {
|
||||||
val status = data.status
|
val status = data.status
|
||||||
val tokenUM = TokenItemState.Content(
|
val tokenUM = TokenItemState.Content(
|
||||||
id = status.currency.id.value,
|
id = status.currency.id.value,
|
||||||
|
|
@ -38,7 +38,7 @@ internal class TokenActionsUiBuilder @Inject constructor(
|
||||||
analyticsEventHandler.send(params.eventBuilder.getTokenLater())
|
analyticsEventHandler.send(params.eventBuilder.getTokenLater())
|
||||||
params.callbacks.onLaterClick()
|
params.callbacks.onLaterClick()
|
||||||
},
|
},
|
||||||
quickActions = PortfolioTokenUMConverter.quickActions(data, tokenActionsHandler),
|
quickActions = quickActions(data, tokenActionsHandler),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.ui
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.ui
|
||||||
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
|
|
@ -24,8 +24,8 @@ import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
||||||
import com.tangem.core.ui.extensions.resourceReference
|
import com.tangem.core.ui.extensions.resourceReference
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.core.ui.res.TangemThemePreview
|
import com.tangem.core.ui.res.TangemThemePreview
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state.ChooseNetworkUM
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state.ChooseNetworkUM
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.ui
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.ui
|
||||||
|
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.domain.markets.TokenMarketParams
|
import com.tangem.domain.markets.TokenMarketParams
|
||||||
import com.tangem.features.account.PortfolioFetcher
|
import com.tangem.features.account.PortfolioFetcher
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.converter.AvailableToAddDataConverter
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.converter.AvailableToAddDataConverter
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.ui
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.ui
|
||||||
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
|
|
@ -22,6 +22,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.util.fastForEach
|
import androidx.compose.ui.util.fastForEach
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionUM
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActions
|
||||||
import com.tangem.core.ui.components.SecondaryButton
|
import com.tangem.core.ui.components.SecondaryButton
|
||||||
import com.tangem.core.ui.components.SpacerH
|
import com.tangem.core.ui.components.SpacerH
|
||||||
import com.tangem.core.ui.components.SpacerH16
|
import com.tangem.core.ui.components.SpacerH16
|
||||||
|
|
@ -37,10 +39,8 @@ import com.tangem.core.ui.res.LocalHapticManager
|
||||||
import com.tangem.core.ui.res.TangemColorPalette
|
import com.tangem.core.ui.res.TangemColorPalette
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.core.ui.res.TangemThemePreview
|
import com.tangem.core.ui.res.TangemThemePreview
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state.TokenActionsUM
|
import com.tangem.features.commonfeatures.impl.R
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioTokenUM
|
import com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state.TokenActionsUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.QuickActionUM
|
|
||||||
import com.tangem.features.feed.impl.R
|
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
|
|
@ -188,7 +188,7 @@ private class TokenActionsContentPreviewProvider : PreviewParameterProvider<Toke
|
||||||
override val values: Sequence<TokenActionsUM>
|
override val values: Sequence<TokenActionsUM>
|
||||||
get() = sequenceOf(
|
get() = sequenceOf(
|
||||||
TokenActionsUM(
|
TokenActionsUM(
|
||||||
quickActions = PortfolioTokenUM.QuickActions(
|
quickActions = QuickActions(
|
||||||
actions = persistentListOf(
|
actions = persistentListOf(
|
||||||
QuickActionUM.Buy,
|
QuickActionUM.Buy,
|
||||||
QuickActionUM.Exchange(shouldShowBadge = true),
|
QuickActionUM.Exchange(shouldShowBadge = true),
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state
|
||||||
|
|
||||||
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
import com.tangem.core.ui.components.rows.model.BlockchainRowUM
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.tangem.features.commonfeatures.impl.addtoportfolio.ui.state
|
||||||
|
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActions
|
||||||
|
import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
|
|
||||||
|
internal data class TokenActionsUM(
|
||||||
|
val token: TokenItemState,
|
||||||
|
val quickActions: QuickActions,
|
||||||
|
val onLaterClick: () -> Unit,
|
||||||
|
)
|
||||||
|
|
@ -25,6 +25,7 @@ dependencies {
|
||||||
api(projects.features.tokenRecieve.api)
|
api(projects.features.tokenRecieve.api)
|
||||||
api(projects.features.wallet.api)
|
api(projects.features.wallet.api)
|
||||||
api(projects.features.account.api)
|
api(projects.features.account.api)
|
||||||
|
api(projects.features.commonFeatures.api)
|
||||||
implementation(projects.features.promoBanners.api)
|
implementation(projects.features.promoBanners.api)
|
||||||
|
|
||||||
/* Data */
|
/* Data */
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ import com.tangem.features.feed.components.earn.DefaultEarnComponent
|
||||||
import com.tangem.features.feed.components.feed.DefaultFeedComponent
|
import com.tangem.features.feed.components.feed.DefaultFeedComponent
|
||||||
import com.tangem.features.feed.components.feed.DefaultFeedComponent.FeedParams
|
import com.tangem.features.feed.components.feed.DefaultFeedComponent.FeedParams
|
||||||
import com.tangem.features.feed.components.market.details.DefaultMarketsTokenDetailsComponent
|
import com.tangem.features.feed.components.market.details.DefaultMarketsTokenDetailsComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
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.portfolio.api.MarketsPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolioblock.PortfolioBlockComponent
|
import com.tangem.features.feed.components.market.details.portfolioblock.PortfolioBlockComponent
|
||||||
import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListComponent
|
import com.tangem.features.feed.components.market.list.DefaultMarketsTokenListComponent
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ import com.tangem.core.ui.res.LocalMainBottomSheetColor
|
||||||
import com.tangem.core.ui.res.LocalRedesignEnabled
|
import com.tangem.core.ui.res.LocalRedesignEnabled
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
import com.tangem.features.feed.model.earn.EarnModel
|
import com.tangem.features.feed.model.earn.EarnModel
|
||||||
import com.tangem.features.feed.ui.components.FeedSearchBar
|
import com.tangem.features.feed.ui.components.FeedSearchBar
|
||||||
import com.tangem.features.feed.ui.earn.EarnContent
|
import com.tangem.features.feed.ui.earn.EarnContent
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
import com.tangem.core.ui.decompose.ComposableModularBottomSheetContentComponent
|
import com.tangem.core.ui.decompose.ComposableModularBottomSheetContentComponent
|
||||||
import com.tangem.core.ui.decompose.EmptyComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.EmptyComposableBottomSheetComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent.Params
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent.Params
|
||||||
import com.tangem.features.feed.model.feed.FeedComponentModel
|
import com.tangem.features.feed.model.feed.FeedComponentModel
|
||||||
import com.tangem.features.feed.model.feed.FeedModelClickIntents
|
import com.tangem.features.feed.model.feed.FeedModelClickIntents
|
||||||
import com.tangem.features.feed.ui.feed.FeedList
|
import com.tangem.features.feed.ui.feed.FeedList
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package com.tangem.features.feed.components.feed
|
||||||
|
|
||||||
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
|
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
|
||||||
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
|
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
|
|
||||||
internal sealed interface FeedBottomSheetRoute {
|
internal sealed interface FeedBottomSheetRoute {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.di
|
|
||||||
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.DefaultAddToPortfolioComponent
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.DefaultAddToPortfolioPreselectedDataComponent
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.DefaultAddToPortfolioManager
|
|
||||||
import dagger.Binds
|
|
||||||
import dagger.Module
|
|
||||||
import dagger.hilt.InstallIn
|
|
||||||
import dagger.hilt.components.SingletonComponent
|
|
||||||
|
|
||||||
@Module
|
|
||||||
@InstallIn(SingletonComponent::class)
|
|
||||||
internal interface AddToPortfolioComponentModule {
|
|
||||||
|
|
||||||
@Binds
|
|
||||||
fun bindAddToPortfolioComponent(factory: DefaultAddToPortfolioComponent.Factory): AddToPortfolioComponent.Factory
|
|
||||||
|
|
||||||
@Binds
|
|
||||||
fun bindAddToPortfolioManagerFactory(factory: DefaultAddToPortfolioManager.Factory): AddToPortfolioManager.Factory
|
|
||||||
|
|
||||||
@Binds
|
|
||||||
fun bindAddToPortfolioPreselectedDataComponent(
|
|
||||||
factory: DefaultAddToPortfolioPreselectedDataComponent.Factory,
|
|
||||||
): AddToPortfolioPreselectedDataComponent.Factory
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.add.impl.ui.state
|
|
||||||
|
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioTokenUM
|
|
||||||
|
|
||||||
internal data class TokenActionsUM(
|
|
||||||
val token: TokenItemState,
|
|
||||||
val quickActions: PortfolioTokenUM.QuickActions,
|
|
||||||
val onLaterClick: () -> Unit,
|
|
||||||
)
|
|
||||||
|
|
@ -14,7 +14,7 @@ import com.tangem.core.decompose.context.childByContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.api.MarketsPortfolioComponent
|
import com.tangem.features.feed.components.market.details.portfolio.api.MarketsPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.MarketsPortfolioModel
|
import com.tangem.features.feed.components.market.details.portfolio.impl.model.MarketsPortfolioModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.model.MarketsPortfolioRoute
|
import com.tangem.features.feed.components.market.details.portfolio.impl.model.MarketsPortfolioRoute
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.analytics
|
package com.tangem.features.feed.components.market.details.portfolio.impl.analytics
|
||||||
|
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsBSContentUM
|
||||||
import com.tangem.core.analytics.models.AnalyticsEvent
|
import com.tangem.core.analytics.models.AnalyticsEvent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.TokenActionsBSContentUM
|
|
||||||
|
|
||||||
internal class PortfolioAnalyticsEvent(
|
internal class PortfolioAnalyticsEvent(
|
||||||
event: String,
|
event: String,
|
||||||
|
|
@ -21,60 +21,6 @@ internal class PortfolioAnalyticsEvent(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
fun popupToChooseAccount() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Choose Account Opened",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun popupToConfirm() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Add Token Screen Opened",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun addToNotMainAccount() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Button - Add To Account",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun addButtonClick() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Button - Add Token",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun addToPortfolioWalletChanged() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Wallet Selected",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun addToPortfolioContinue(blockchainNames: List<String>) = PortfolioAnalyticsEvent(
|
|
||||||
event = "Token Network Selected",
|
|
||||||
params = buildMap {
|
|
||||||
put("Count", blockchainNames.size.toString())
|
|
||||||
put("Token", tokenSymbol)
|
|
||||||
put("blockchain", blockchainNames.joinToString(separator = ", "))
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun tokenAdded(blockchainName: String) = PortfolioAnalyticsEvent(
|
|
||||||
event = "Token Added",
|
|
||||||
params = buildMap {
|
|
||||||
put("Token", tokenSymbol)
|
|
||||||
put("Blockchain", blockchainName)
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun quickActionClick(actionUM: TokenActionsBSContentUM.Action, blockchainName: String) =
|
fun quickActionClick(actionUM: TokenActionsBSContentUM.Action, blockchainName: String) =
|
||||||
PortfolioAnalyticsEvent(
|
PortfolioAnalyticsEvent(
|
||||||
event = when (actionUM) {
|
event = when (actionUM) {
|
||||||
|
|
@ -91,25 +37,5 @@ internal class PortfolioAnalyticsEvent(
|
||||||
put("blockchain", blockchainName)
|
put("blockchain", blockchainName)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
fun getTokenActionClick(actionUM: TokenActionsBSContentUM.Action) = PortfolioAnalyticsEvent(
|
|
||||||
event = when (actionUM) {
|
|
||||||
TokenActionsBSContentUM.Action.Buy -> "Popup Get token - Button Buy"
|
|
||||||
TokenActionsBSContentUM.Action.Receive -> "Popup Get token - Button Receive"
|
|
||||||
TokenActionsBSContentUM.Action.Exchange -> "Popup Get token - Button Exchange"
|
|
||||||
TokenActionsBSContentUM.Action.Stake -> "Popup Get token - Button Stake"
|
|
||||||
else -> "error"
|
|
||||||
},
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
fun getTokenLater() = PortfolioAnalyticsEvent(
|
|
||||||
event = "Popup Get token - Button Later",
|
|
||||||
params = buildMap {
|
|
||||||
if (source != null) put("Source", source)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.loader
|
|
||||||
|
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
|
||||||
import com.tangem.domain.core.lce.Lce
|
|
||||||
import com.tangem.domain.models.TotalFiatBalance
|
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
|
||||||
import com.tangem.domain.tokens.error.TokenListError
|
|
||||||
import com.tangem.domain.tokens.model.TokenActionsState
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Portfolio data. Combined data from all flows that required to setup portfolio
|
|
||||||
*
|
|
||||||
* @property walletsWithCurrencies wallets with crypto currency statuses
|
|
||||||
* @property appCurrency app currency
|
|
||||||
* @property isBalanceHidden flag that indicates if balance should be hidden
|
|
||||||
* @property walletsWithBalance wallets with total balance
|
|
||||||
*
|
|
||||||
[REDACTED_AUTHOR]
|
|
||||||
*/
|
|
||||||
internal data class PortfolioData(
|
|
||||||
val walletsWithCurrencies: Map<UserWallet, List<CryptoCurrencyData>>,
|
|
||||||
val appCurrency: AppCurrency,
|
|
||||||
val isBalanceHidden: Boolean,
|
|
||||||
val walletsWithBalance: Map<UserWalletId, Lce<TokenListError, TotalFiatBalance>>,
|
|
||||||
) {
|
|
||||||
data class CryptoCurrencyData(
|
|
||||||
val userWallet: UserWallet,
|
|
||||||
val status: CryptoCurrencyStatus,
|
|
||||||
val actions: List<TokenActionsState.ActionState>,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
@ -5,6 +5,8 @@ import com.tangem.blockchainsdk.compatibility.getTokenIdIfL2Network
|
||||||
import com.tangem.common.ui.account.AccountTitleUM
|
import com.tangem.common.ui.account.AccountTitleUM
|
||||||
import com.tangem.common.ui.account.CryptoPortfolioIconConverter
|
import com.tangem.common.ui.account.CryptoPortfolioIconConverter
|
||||||
import com.tangem.common.ui.account.toUM
|
import com.tangem.common.ui.account.toUM
|
||||||
|
import com.tangem.common.ui.markets.action.CryptoCurrencyData
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsHandler
|
||||||
import com.tangem.core.ui.extensions.TextReference
|
import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.core.ui.extensions.stringReference
|
import com.tangem.core.ui.extensions.stringReference
|
||||||
import com.tangem.domain.account.models.AccountStatusList
|
import com.tangem.domain.account.models.AccountStatusList
|
||||||
|
|
@ -28,7 +30,6 @@ import com.tangem.domain.tokens.model.TokenActionsState
|
||||||
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
|
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
|
||||||
import com.tangem.domain.yield.supply.models.YieldSupplyAvailability
|
import com.tangem.domain.yield.supply.models.YieldSupplyAvailability
|
||||||
import com.tangem.domain.yield.supply.usecase.YieldSupplyGetAvailabilityUseCase
|
import com.tangem.domain.yield.supply.usecase.YieldSupplyGetAvailabilityUseCase
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.MyPortfolioUM
|
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.MyPortfolioUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioHeader
|
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioHeader
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioListItem
|
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioListItem
|
||||||
|
|
@ -248,7 +249,7 @@ internal class MarketsPortfolioDelegate @AssistedInject constructor(
|
||||||
|
|
||||||
accountWithAdded.addedCurrency.forEach { currencyStatus ->
|
accountWithAdded.addedCurrency.forEach { currencyStatus ->
|
||||||
val actions = allActions[currencyStatus.currency]?.states.orEmpty()
|
val actions = allActions[currencyStatus.currency]?.states.orEmpty()
|
||||||
val value = PortfolioData.CryptoCurrencyData(
|
val value = CryptoCurrencyData(
|
||||||
userWallet = userWallet,
|
userWallet = userWallet,
|
||||||
status = currencyStatus,
|
status = currencyStatus,
|
||||||
actions = actions,
|
actions = actions,
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ import arrow.core.getOrElse
|
||||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||||
import com.arkivanov.decompose.router.slot.activate
|
import com.arkivanov.decompose.router.slot.activate
|
||||||
import com.arkivanov.decompose.router.slot.dismiss
|
import com.arkivanov.decompose.router.slot.dismiss
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsBSContentUM
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsHandler
|
||||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||||
import com.tangem.core.decompose.di.ModelScoped
|
import com.tangem.core.decompose.di.ModelScoped
|
||||||
import com.tangem.core.decompose.model.Model
|
import com.tangem.core.decompose.model.Model
|
||||||
|
|
@ -14,12 +16,11 @@ import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.markets.TokenMarketInfo
|
import com.tangem.domain.markets.TokenMarketInfo
|
||||||
import com.tangem.domain.models.currency.CryptoCurrency
|
import com.tangem.domain.models.currency.CryptoCurrency
|
||||||
import com.tangem.domain.transaction.usecase.ReceiveAddressesFactory
|
import com.tangem.domain.transaction.usecase.ReceiveAddressesFactory
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.api.MarketsPortfolioComponent
|
import com.tangem.features.feed.components.market.details.portfolio.api.MarketsPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
import com.tangem.features.feed.components.market.details.portfolio.impl.analytics.PortfolioAnalyticsEvent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.MyPortfolioUM
|
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.MyPortfolioUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.TokenActionsBSContentUM
|
|
||||||
import com.tangem.utils.Provider
|
import com.tangem.utils.Provider
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,16 @@
|
||||||
package com.tangem.features.feed.components.market.details.portfolio.impl.model
|
package com.tangem.features.feed.components.market.details.portfolio.impl.model
|
||||||
|
|
||||||
|
import com.tangem.common.ui.markets.action.CryptoCurrencyData
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionsConverter.quickActions
|
||||||
|
import com.tangem.common.ui.markets.action.TokenActionsHandler
|
||||||
import com.tangem.common.ui.tokens.TokenItemStateConverter
|
import com.tangem.common.ui.tokens.TokenItemStateConverter
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState
|
import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
import com.tangem.core.ui.extensions.stringReference
|
import com.tangem.core.ui.extensions.stringReference
|
||||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
import com.tangem.domain.models.wallet.UserWallet
|
import com.tangem.domain.models.wallet.UserWallet
|
||||||
import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason
|
|
||||||
import com.tangem.domain.tokens.model.TokenActionsState
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.loader.PortfolioData
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioTokenUM
|
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.PortfolioTokenUM
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.QuickActionUM
|
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.TokenActionsBSContentUM
|
|
||||||
import com.tangem.utils.converter.Converter
|
import com.tangem.utils.converter.Converter
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converter from [UserWallet] and [CryptoCurrencyStatus] to [PortfolioTokenUM]
|
* Converter from [UserWallet] and [CryptoCurrencyStatus] to [PortfolioTokenUM]
|
||||||
|
|
@ -25,10 +22,10 @@ internal class PortfolioTokenUMConverter(
|
||||||
private val isBalanceHidden: Boolean,
|
private val isBalanceHidden: Boolean,
|
||||||
private val onTokenItemClick: (CryptoCurrencyStatus) -> Unit,
|
private val onTokenItemClick: (CryptoCurrencyStatus) -> Unit,
|
||||||
private val tokenActionsHandler: TokenActionsHandler,
|
private val tokenActionsHandler: TokenActionsHandler,
|
||||||
) : Converter<PortfolioData.CryptoCurrencyData, PortfolioTokenUM> {
|
) : Converter<CryptoCurrencyData, PortfolioTokenUM> {
|
||||||
|
|
||||||
fun convertV2(
|
fun convertV2(
|
||||||
value: PortfolioData.CryptoCurrencyData,
|
value: CryptoCurrencyData,
|
||||||
isQuickActionsShown: Boolean,
|
isQuickActionsShown: Boolean,
|
||||||
onTokenItemClick: (UserWallet, CryptoCurrencyStatus) -> Unit,
|
onTokenItemClick: (UserWallet, CryptoCurrencyStatus) -> Unit,
|
||||||
): PortfolioTokenUM {
|
): PortfolioTokenUM {
|
||||||
|
|
@ -45,7 +42,7 @@ internal class PortfolioTokenUMConverter(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun convert(value: PortfolioData.CryptoCurrencyData): PortfolioTokenUM {
|
override fun convert(value: CryptoCurrencyData): PortfolioTokenUM {
|
||||||
val tokenItemStateConverter = TokenItemStateConverter(
|
val tokenItemStateConverter = TokenItemStateConverter(
|
||||||
appCurrency = appCurrency,
|
appCurrency = appCurrency,
|
||||||
titleStateProvider = { TokenItemState.TitleState.Content(text = stringReference(value.userWallet.name)) },
|
titleStateProvider = { TokenItemState.TitleState.Content(text = stringReference(value.userWallet.name)) },
|
||||||
|
|
@ -63,62 +60,4 @@ internal class PortfolioTokenUMConverter(
|
||||||
quickActions = quickActions(cryptoData = value, tokenActionsHandler = tokenActionsHandler),
|
quickActions = quickActions(cryptoData = value, tokenActionsHandler = tokenActionsHandler),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
fun quickActions(
|
|
||||||
cryptoData: PortfolioData.CryptoCurrencyData,
|
|
||||||
tokenActionsHandler: TokenActionsHandler,
|
|
||||||
): PortfolioTokenUM.QuickActions {
|
|
||||||
return PortfolioTokenUM.QuickActions(
|
|
||||||
actions = toQuickActions(cryptoData.actions),
|
|
||||||
onQuickActionClick = { quickActionUM ->
|
|
||||||
when (quickActionUM) {
|
|
||||||
QuickActionUM.Buy -> tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.Buy,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
is QuickActionUM.Exchange -> tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.Exchange,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
QuickActionUM.Receive -> tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.Receive,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
QuickActionUM.Stake -> tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.Stake,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
is QuickActionUM.YieldMode -> tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.YieldMode,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onQuickActionLongClick = { actionUM ->
|
|
||||||
if (actionUM == QuickActionUM.Receive) {
|
|
||||||
tokenActionsHandler.handle(
|
|
||||||
action = TokenActionsBSContentUM.Action.CopyAddress,
|
|
||||||
cryptoCurrencyData = cryptoData,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toQuickActions(actions: List<TokenActionsState.ActionState>) = buildList {
|
|
||||||
actions.forEach { action ->
|
|
||||||
if (action.unavailabilityReason == ScenarioUnavailabilityReason.None) {
|
|
||||||
when (action) {
|
|
||||||
is TokenActionsState.ActionState.Buy -> QuickActionUM.Buy
|
|
||||||
is TokenActionsState.ActionState.Swap -> QuickActionUM.Exchange(action.shouldShowBadge)
|
|
||||||
is TokenActionsState.ActionState.Receive -> QuickActionUM.Receive
|
|
||||||
is TokenActionsState.ActionState.Stake -> QuickActionUM.Stake
|
|
||||||
is TokenActionsState.ActionState.YieldMode -> QuickActionUM.YieldMode(action.apy)
|
|
||||||
else -> null
|
|
||||||
}?.let(::add)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.toImmutableList()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -28,6 +28,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.LayoutDirection
|
import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.util.fastForEach
|
import androidx.compose.ui.util.fastForEach
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionUM
|
||||||
import com.tangem.core.ui.components.SpacerH4
|
import com.tangem.core.ui.components.SpacerH4
|
||||||
import com.tangem.core.ui.components.icons.badge.drawBadge
|
import com.tangem.core.ui.components.icons.badge.drawBadge
|
||||||
import com.tangem.core.ui.extensions.resolveReference
|
import com.tangem.core.ui.extensions.resolveReference
|
||||||
|
|
@ -36,7 +37,6 @@ import com.tangem.core.ui.res.LocalHapticManager
|
||||||
import com.tangem.core.ui.res.TangemTheme
|
import com.tangem.core.ui.res.TangemTheme
|
||||||
import com.tangem.core.ui.res.TangemThemePreview
|
import com.tangem.core.ui.res.TangemThemePreview
|
||||||
import com.tangem.core.ui.test.MarketTokenDetailsBottomSheetTestTags
|
import com.tangem.core.ui.test.MarketTokenDetailsBottomSheetTestTags
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.impl.ui.state.QuickActionUM
|
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@ package com.tangem.features.feed.components.market.details.portfolio.impl.ui.pre
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import com.tangem.common.ui.account.AccountIconPreviewData
|
import com.tangem.common.ui.account.AccountIconPreviewData
|
||||||
import com.tangem.common.ui.account.AccountTitleUM
|
import com.tangem.common.ui.account.AccountTitleUM
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActionUM
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActions
|
||||||
import com.tangem.core.ui.components.currency.icon.CurrencyIconState
|
import com.tangem.core.ui.components.currency.icon.CurrencyIconState
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState
|
import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState.FiatAmountState
|
import com.tangem.core.ui.components.token.state.TokenItemState.FiatAmountState
|
||||||
|
|
@ -125,7 +127,7 @@ internal class PreviewMyPortfolioUMProvider : PreviewParameterProvider<MyPortfol
|
||||||
onItemLongClick = {},
|
onItemLongClick = {},
|
||||||
),
|
),
|
||||||
isQuickActionsShown = false,
|
isQuickActionsShown = false,
|
||||||
quickActions = PortfolioTokenUM.QuickActions(
|
quickActions = QuickActions(
|
||||||
actions = persistentListOf(
|
actions = persistentListOf(
|
||||||
QuickActionUM.Buy,
|
QuickActionUM.Buy,
|
||||||
QuickActionUM.Exchange(shouldShowBadge = true),
|
QuickActionUM.Exchange(shouldShowBadge = true),
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ package com.tangem.features.feed.components.market.details.portfolio.impl.ui.sta
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import com.tangem.common.ui.account.AccountTitleUM
|
import com.tangem.common.ui.account.AccountTitleUM
|
||||||
|
import com.tangem.common.ui.markets.action.QuickActions
|
||||||
import com.tangem.core.ui.components.token.state.TokenItemState
|
import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
import com.tangem.core.ui.extensions.TextReference
|
import com.tangem.core.ui.extensions.TextReference
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
internal sealed interface PortfolioListItem {
|
internal sealed interface PortfolioListItem {
|
||||||
|
|
@ -30,10 +30,4 @@ internal data class PortfolioTokenUM(
|
||||||
val quickActions: QuickActions,
|
val quickActions: QuickActions,
|
||||||
) : PortfolioListItem {
|
) : PortfolioListItem {
|
||||||
override val id: String = tokenItemState.id
|
override val id: String = tokenItemState.id
|
||||||
|
|
||||||
data class QuickActions(
|
|
||||||
val actions: ImmutableList<QuickActionUM>,
|
|
||||||
val onQuickActionClick: (QuickActionUM) -> Unit,
|
|
||||||
val onQuickActionLongClick: (QuickActionUM) -> Unit,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
@ -25,7 +25,7 @@ import com.tangem.features.feed.components.earn.DefaultEarnComponent
|
||||||
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
|
import com.tangem.features.feed.components.earn.EarnNetworkFilterComponent
|
||||||
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
|
import com.tangem.features.feed.components.earn.EarnTypeFilterComponent
|
||||||
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
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.EarnAnalyticsEvent
|
||||||
import com.tangem.features.feed.model.earn.filters.state.EarnFilterNetworkConverter
|
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.EarnFilterNetworkUMConverter
|
||||||
|
|
|
||||||
|
|
@ -50,30 +50,6 @@ internal sealed class EarnAnalyticsEvent(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
data class AddTokenScreenOpened(
|
|
||||||
private val tokenSymbol: String,
|
|
||||||
private val blockchain: String,
|
|
||||||
private val source: String,
|
|
||||||
) : EarnAnalyticsEvent(
|
|
||||||
event = "Add Token Screen Opened",
|
|
||||||
params = mapOf(
|
|
||||||
AnalyticsParam.TOKEN_PARAM to tokenSymbol,
|
|
||||||
AnalyticsParam.BLOCKCHAIN to blockchain,
|
|
||||||
AnalyticsParam.SOURCE to source,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
data class TokenAdded(
|
|
||||||
private val tokenSymbol: String,
|
|
||||||
private val blockchain: String,
|
|
||||||
) : EarnAnalyticsEvent(
|
|
||||||
event = "Token Added",
|
|
||||||
params = mapOf(
|
|
||||||
AnalyticsParam.TOKEN_PARAM to tokenSymbol,
|
|
||||||
AnalyticsParam.BLOCKCHAIN to blockchain,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
data class BestOpportunitiesLoadError(
|
data class BestOpportunitiesLoadError(
|
||||||
private val code: Int?,
|
private val code: Int?,
|
||||||
private val message: String,
|
private val message: String,
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ import com.tangem.domain.news.usecase.FetchTrendingNewsUseCase
|
||||||
import com.tangem.domain.news.usecase.ManageTrendingNewsUseCase
|
import com.tangem.domain.news.usecase.ManageTrendingNewsUseCase
|
||||||
import com.tangem.features.feed.components.feed.DefaultFeedComponent
|
import com.tangem.features.feed.components.feed.DefaultFeedComponent
|
||||||
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
import com.tangem.features.feed.components.feed.FeedBottomSheetRoute
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioPreselectedDataComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioPreselectedDataComponent
|
||||||
import com.tangem.features.feed.entry.featuretoggle.FeedFeatureToggle
|
import com.tangem.features.feed.entry.featuretoggle.FeedFeatureToggle
|
||||||
import com.tangem.features.feed.impl.R
|
import com.tangem.features.feed.impl.R
|
||||||
import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
|
import com.tangem.features.feed.model.earn.analytics.EarnAnalyticsEvent
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,9 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
/** Api */
|
||||||
|
implementation(projects.features.commonFeatures.api)
|
||||||
|
|
||||||
/** Project - API */
|
/** Project - API */
|
||||||
implementation(projects.features.account.api)
|
implementation(projects.features.account.api)
|
||||||
implementation(projects.features.onramp.api)
|
implementation(projects.features.onramp.api)
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import com.tangem.core.decompose.context.child
|
||||||
import com.tangem.core.decompose.context.childByContext
|
import com.tangem.core.decompose.context.childByContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.onramp.component.SwapSelectTokensComponent
|
import com.tangem.features.onramp.component.SwapSelectTokensComponent
|
||||||
import com.tangem.features.onramp.swap.availablepairs.AvailableSwapPairsComponent
|
import com.tangem.features.onramp.swap.availablepairs.AvailableSwapPairsComponent
|
||||||
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ import com.tangem.core.ui.components.token.state.TokenItemState
|
||||||
import com.tangem.core.ui.decompose.ComposableListContentComponent
|
import com.tangem.core.ui.decompose.ComposableListContentComponent
|
||||||
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
import com.tangem.domain.models.currency.CryptoCurrencyStatus
|
||||||
import com.tangem.domain.models.wallet.UserWalletId
|
import com.tangem.domain.models.wallet.UserWalletId
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
||||||
import com.tangem.features.onramp.tokenlist.entity.TokenListUM
|
import com.tangem.features.onramp.tokenlist.entity.TokenListUM
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ import androidx.compose.ui.Modifier
|
||||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||||
import com.tangem.core.decompose.context.AppComponentContext
|
import com.tangem.core.decompose.context.AppComponentContext
|
||||||
import com.tangem.core.decompose.model.getOrCreateModel
|
import com.tangem.core.decompose.model.getOrCreateModel
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
import com.tangem.features.onramp.swap.availablepairs.model.AddToPortfolioRoute
|
||||||
import com.tangem.features.onramp.swap.availablepairs.model.AvailableSwapPairsModel
|
import com.tangem.features.onramp.swap.availablepairs.model.AvailableSwapPairsModel
|
||||||
import com.tangem.features.onramp.tokenlist.entity.TokenListUM
|
import com.tangem.features.onramp.tokenlist.entity.TokenListUM
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,8 @@ import com.tangem.domain.wallets.usecase.GetWalletsUseCase
|
||||||
import com.tangem.feature.swap.domain.GetAvailablePairsUseCase
|
import com.tangem.feature.swap.domain.GetAvailablePairsUseCase
|
||||||
import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo
|
import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo
|
||||||
import com.tangem.feature.swap.domain.models.domain.SwapPairLeast
|
import com.tangem.feature.swap.domain.models.domain.SwapPairLeast
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.features.onramp.impl.R
|
import com.tangem.features.onramp.impl.R
|
||||||
import com.tangem.features.onramp.swap.availablepairs.AvailableSwapPairsComponent
|
import com.tangem.features.onramp.swap.availablepairs.AvailableSwapPairsComponent
|
||||||
import com.tangem.features.onramp.swap.availablepairs.entity.transformers.SetErrorWarningTransformer
|
import com.tangem.features.onramp.swap.availablepairs.entity.transformers.SetErrorWarningTransformer
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,9 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
/** Api */
|
||||||
|
implementation(projects.features.commonFeatures.api)
|
||||||
|
|
||||||
/** Core modules */
|
/** Core modules */
|
||||||
implementation(projects.core.analytics)
|
implementation(projects.core.analytics)
|
||||||
implementation(projects.core.analytics.models)
|
implementation(projects.core.analytics.models)
|
||||||
|
|
|
||||||
|
|
@ -15,15 +15,15 @@ import com.tangem.feature.swap.choosetoken.api.ChooseTokenComponent
|
||||||
import com.tangem.feature.swap.choosetoken.impl.model.ChooseTokenModel
|
import com.tangem.feature.swap.choosetoken.impl.model.ChooseTokenModel
|
||||||
import com.tangem.feature.swap.models.AddToPortfolioRoute
|
import com.tangem.feature.swap.models.AddToPortfolioRoute
|
||||||
import com.tangem.feature.swap.ui.SwapSelectTokenScreen
|
import com.tangem.feature.swap.ui.SwapSelectTokenScreen
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedFactory
|
import dagger.assisted.AssistedFactory
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
|
|
||||||
internal class DefaultChooseTokenComponent @AssistedInject constructor(
|
internal class DefaultChooseTokenComponent @AssistedInject constructor(
|
||||||
|
private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory,
|
||||||
@Assisted appComponentContext: AppComponentContext,
|
@Assisted appComponentContext: AppComponentContext,
|
||||||
@Assisted private val params: ChooseTokenComponent.Params,
|
@Assisted private val params: ChooseTokenComponent.Params,
|
||||||
private val addToPortfolioComponentFactory: AddToPortfolioComponent.Factory,
|
|
||||||
) : AppComponentContext by appComponentContext, ChooseTokenComponent {
|
) : AppComponentContext by appComponentContext, ChooseTokenComponent {
|
||||||
|
|
||||||
private val model: ChooseTokenModel = getOrCreateModel(params)
|
private val model: ChooseTokenModel = getOrCreateModel(params)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import com.tangem.feature.swap.converters.TokensDataConverter
|
||||||
import com.tangem.feature.swap.models.SwapSelectTokenStateHolder
|
import com.tangem.feature.swap.models.SwapSelectTokenStateHolder
|
||||||
import com.tangem.feature.swap.models.market.state.SwapMarketState
|
import com.tangem.feature.swap.models.market.state.SwapMarketState
|
||||||
import com.tangem.feature.swap.presentation.R
|
import com.tangem.feature.swap.presentation.R
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioComponent
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioComponent
|
||||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import com.tangem.domain.wallets.usecase.GetWalletsUseCase
|
||||||
import com.tangem.feature.swap.models.AddToPortfolioRoute
|
import com.tangem.feature.swap.models.AddToPortfolioRoute
|
||||||
import com.tangem.feature.swap.models.market.MarketsListBatchFlowManager
|
import com.tangem.feature.swap.models.market.MarketsListBatchFlowManager
|
||||||
import com.tangem.feature.swap.models.market.state.SwapMarketState
|
import com.tangem.feature.swap.models.market.state.SwapMarketState
|
||||||
import com.tangem.features.feed.components.market.details.portfolio.add.AddToPortfolioManager
|
import com.tangem.features.commonfeatures.api.addtoportfolio.AddToPortfolioManager
|
||||||
import com.tangem.lib.crypto.BlockchainUtils
|
import com.tangem.lib.crypto.BlockchainUtils
|
||||||
import com.tangem.utils.Provider
|
import com.tangem.utils.Provider
|
||||||
import com.tangem.utils.coroutines.JobHolder
|
import com.tangem.utils.coroutines.JobHolder
|
||||||
|
|
@ -32,9 +32,9 @@ import kotlinx.coroutines.launch
|
||||||
@Suppress("LongParameterList")
|
@Suppress("LongParameterList")
|
||||||
internal class MarketBlockDelegate @AssistedInject constructor(
|
internal class MarketBlockDelegate @AssistedInject constructor(
|
||||||
private val marketsListBatchFlowManagerFactory: MarketsListBatchFlowManager.Factory,
|
private val marketsListBatchFlowManagerFactory: MarketsListBatchFlowManager.Factory,
|
||||||
private val addToPortfolioManagerFactory: AddToPortfolioManager.Factory,
|
|
||||||
private val excludedBlockchains: ExcludedBlockchains,
|
private val excludedBlockchains: ExcludedBlockchains,
|
||||||
private val getUserWalletsUseCase: GetWalletsUseCase,
|
private val getUserWalletsUseCase: GetWalletsUseCase,
|
||||||
|
private val addToPortfolioManagerFactory: AddToPortfolioManager.Factory,
|
||||||
@Assisted private val modelScope: CoroutineScope,
|
@Assisted private val modelScope: CoroutineScope,
|
||||||
@Assisted private val searchQueryState: StateFlow<String>,
|
@Assisted private val searchQueryState: StateFlow<String>,
|
||||||
@Assisted private val screensSourcesName: String,
|
@Assisted private val screensSourcesName: String,
|
||||||
|
|
|
||||||
|
|
@ -321,6 +321,9 @@ include(":features:virtual-accounts:main:impl")
|
||||||
|
|
||||||
include(":features:virtual-accounts:details:api")
|
include(":features:virtual-accounts:details:api")
|
||||||
include(":features:virtual-accounts:details:impl")
|
include(":features:virtual-accounts:details:impl")
|
||||||
|
|
||||||
|
include(":features:common-features:api")
|
||||||
|
include(":features:common-features:impl")
|
||||||
// endregion Feature modules
|
// endregion Feature modules
|
||||||
|
|
||||||
// region Domain modules
|
// region Domain modules
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue