Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-03 13:42:03 +04:00
parent f9369de36a
commit 448a472832
7 changed files with 164 additions and 40 deletions

View file

@ -20,6 +20,7 @@ import com.tangem.domain.tokens.model.TokenActionsState
import com.tangem.domain.tokens.model.details.NavigationAction
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.domain.yield.supply.usecase.YieldSupplyEnterStatusUseCase
import com.tangem.feature.wallet.presentation.account.AccountDependencies
import com.tangem.feature.wallet.presentation.wallet.domain.OnrampStatusFactory
import com.tangem.feature.wallet.presentation.wallet.domain.unwrap
@ -49,7 +50,7 @@ internal interface WalletContentClickIntents {
fun onTokenItemLongClick(userWalletId: UserWalletId, cryptoCurrencyStatus: CryptoCurrencyStatus)
fun onApyLabelClick(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus)
fun onApyLabelClick(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus, apy: String)
fun onAccountExpandClick(account: Account)
@ -87,6 +88,7 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
private val analyticsEventHandler: AnalyticsEventHandler,
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
private val accountDependencies: AccountDependencies,
private val yieldSupplyEnterStatusUseCase: YieldSupplyEnterStatusUseCase,
) : BaseWalletClickIntents(), WalletContentClickIntents {
override fun onDetailsClick() {
@ -160,12 +162,65 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
}
}
override fun onApyLabelClick(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus) {
override fun onApyLabelClick(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus, apy: String) {
val navigationAction = if (currencyStatus.currency is CryptoCurrency.Token) {
NavigationAction.YieldSupply(currencyStatus.value.yieldSupplyStatus?.isActive == true)
} else {
NavigationAction.Staking
}
sendApyLabelClickAnalytics(navigationAction, currencyStatus)
when (navigationAction) {
is NavigationAction.Staking -> router.openTokenDetails(userWalletId, currencyStatus, navigationAction)
is NavigationAction.YieldSupply -> openYieldSupply(
userWalletId = userWalletId,
cryptoCurrencyStatus = currencyStatus,
navigationAction = navigationAction,
apy = apy,
)
}
}
override fun onAccountExpandClick(account: Account) {
val userWalletId = stateHolder.getSelectedWalletId()
accountDependencies.expandedAccountsHolder.expandAccount(userWalletId, account.accountId)
}
override fun onAccountCollapseClick(account: Account) {
val userWalletId = stateHolder.getSelectedWalletId()
accountDependencies.expandedAccountsHolder.collapseAccount(userWalletId, account.accountId)
}
private fun openYieldSupply(
userWalletId: UserWalletId,
cryptoCurrencyStatus: CryptoCurrencyStatus,
navigationAction: NavigationAction.YieldSupply,
apy: String,
) {
modelScope.launch {
val tokenEnterStatus = yieldSupplyEnterStatusUseCase(userWalletId, cryptoCurrencyStatus).getOrNull()
when {
tokenEnterStatus != null -> router.openTokenDetails(
userWalletId = userWalletId,
currencyStatus = cryptoCurrencyStatus,
navigationAction = navigationAction,
)
navigationAction.isActive -> router.openYieldSupplyActiveScreen(
userWalletId = userWalletId,
cryptoCurrency = cryptoCurrencyStatus.currency,
apy = apy,
)
else -> router.openYieldSupplyPromoScreen(
userWalletId = userWalletId,
cryptoCurrency = cryptoCurrencyStatus.currency,
apy = apy,
)
}
}
}
private fun sendApyLabelClickAnalytics(navigationAction: NavigationAction, currencyStatus: CryptoCurrencyStatus) {
val event = when (navigationAction) {
is NavigationAction.YieldSupply -> {
MainScreenAnalyticsEvent.ApyClicked(
@ -193,17 +248,6 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
}
}
analyticsEventHandler.send(event)
router.openTokenDetails(userWalletId, currencyStatus, navigationAction)
}
override fun onAccountExpandClick(account: Account) {
val userWalletId = stateHolder.getSelectedWalletId()
accountDependencies.expandedAccountsHolder.expandAccount(userWalletId, account.accountId)
}
override fun onAccountCollapseClick(account: Account) {
val userWalletId = stateHolder.getSelectedWalletId()
accountDependencies.expandedAccountsHolder.collapseAccount(userWalletId, account.accountId)
}
private fun showActionsBottomSheet(tokenActionsState: TokenActionsState, userWallet: UserWallet) {

View file

@ -132,4 +132,24 @@ internal class DefaultWalletRouter @Inject constructor(
),
)
}
override fun openYieldSupplyActiveScreen(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, apy: String) {
router.push(
AppRoute.YieldSupplyActive(
userWalletId = userWalletId,
cryptoCurrency = cryptoCurrency,
apy = apy,
),
)
}
override fun openYieldSupplyPromoScreen(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, apy: String) {
router.push(
AppRoute.YieldSupplyPromo(
userWalletId = userWalletId,
cryptoCurrency = cryptoCurrency,
apy = apy,
),
)
}
}

View file

@ -73,4 +73,10 @@ internal interface InnerWalletRouter {
tokenAction: TokenAction,
onWarningAcknowledged: (TokenAction) -> Unit,
)
/** Open yield supply active screen */
fun openYieldSupplyActiveScreen(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, apy: String)
/** Open yield supply promo screen */
fun openYieldSupplyPromoScreen(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, apy: String)
}

View file

@ -49,9 +49,10 @@ internal class TokenListStateConverter(
clickIntents.onTokenItemLongClick(selectedWallet.walletId, currencyStatus)
}
private val onApyLabelClick: (currencyStatus: CryptoCurrencyStatus) -> Unit = { currencyStatus ->
clickIntents.onApyLabelClick(selectedWallet.walletId, currencyStatus)
}
private val onApyLabelClick: (currencyStatus: CryptoCurrencyStatus, apy: String) -> Unit =
{ currencyStatus, apy ->
clickIntents.onApyLabelClick(selectedWallet.walletId, currencyStatus, apy)
}
private fun tokenStatusConverter(accountId: AccountId? = null) = TokenItemStateConverter(
appCurrency = appCurrency,
@ -59,7 +60,7 @@ internal class TokenListStateConverter(
stakingApyMap = stakingApyMap,
onItemClick = { _, status -> onTokenClick(accountId, status) },
onItemLongClick = { _, status -> onTokenLongClick(accountId, status) },
onApyLabelClick = { status -> onApyLabelClick(status) },
onApyLabelClick = { status, apy -> onApyLabelClick(status, apy) },
)
override fun convert(value: WalletTokensListState): WalletTokensListState {