Updated on 2026-08-14

This commit is contained in:
Tangem 2025-03-11 12:48:32 +03:00
parent 2d61d3d521
commit 068cb45cb4

View file

@ -124,7 +124,7 @@ class GetCryptoCurrencyActionsUseCase(
}
if (cryptoCurrencyStatus.value.sources.total != StatusSource.ACTUAL) {
return getActionsForOutdatedData(userWallet, cryptoCurrencyStatus, requirements)
return getActionsForOutdatedData(userWallet, cryptoCurrencyStatus, requirements, isStakingAvailable)
}
val activeList = mutableListOf<TokenActionsState.ActionState>()
@ -148,27 +148,7 @@ class GetCryptoCurrencyActionsUseCase(
}
// staking
if (isStakingAvailable) {
val yield = kotlin.runCatching {
stakingRepository.getYield(
cryptoCurrencyId = cryptoCurrency.id,
symbol = cryptoCurrency.symbol,
)
}.getOrNull()
activeList.add(
TokenActionsState.ActionState.Stake(
unavailabilityReason = ScenarioUnavailabilityReason.None,
yield = yield,
),
)
} else {
disabledList.add(
TokenActionsState.ActionState.Stake(
unavailabilityReason = ScenarioUnavailabilityReason.StakingUnavailable(cryptoCurrency.name),
yield = null,
),
)
}
addStakingActions(cryptoCurrency, isStakingAvailable, activeList, disabledList)
// send
val sendUnavailabilityReason = getSendUnavailabilityReason(
@ -217,6 +197,35 @@ class GetCryptoCurrencyActionsUseCase(
return activeList + disabledList
}
private suspend fun addStakingActions(
cryptoCurrency: CryptoCurrency,
isStakingAvailable: Boolean,
activeList: MutableList<TokenActionsState.ActionState>,
disabledList: MutableList<TokenActionsState.ActionState>,
) {
if (isStakingAvailable) {
val yield = kotlin.runCatching {
stakingRepository.getYield(
cryptoCurrencyId = cryptoCurrency.id,
symbol = cryptoCurrency.symbol,
)
}.getOrNull()
activeList.add(
TokenActionsState.ActionState.Stake(
unavailabilityReason = ScenarioUnavailabilityReason.None,
yield = yield,
),
)
} else {
disabledList.add(
TokenActionsState.ActionState.Stake(
unavailabilityReason = ScenarioUnavailabilityReason.StakingUnavailable(cryptoCurrency.name),
yield = null,
),
)
}
}
private suspend fun getActionsForUnreachableCurrency(
userWallet: UserWallet,
cryptoCurrencyStatus: CryptoCurrencyStatus,
@ -256,12 +265,16 @@ class GetCryptoCurrencyActionsUseCase(
return actionsList
}
@Suppress("LongMethod")
private suspend fun getActionsForOutdatedData(
userWallet: UserWallet,
cryptoCurrencyStatus: CryptoCurrencyStatus,
requirements: AssetRequirementsCondition?,
isStakingAvailable: Boolean,
): List<TokenActionsState.ActionState> {
val activeList = mutableListOf<TokenActionsState.ActionState>()
val disabledList = mutableListOf<TokenActionsState.ActionState>()
val cryptoCurrency = cryptoCurrencyStatus.currency
// copy address
if (isAddressAvailable(cryptoCurrencyStatus.value.networkAddress)) {
@ -271,7 +284,12 @@ class GetCryptoCurrencyActionsUseCase(
// receive
if (isAddressAvailable(cryptoCurrencyStatus.value.networkAddress)) {
val scenario = getReceiveScenario(requirements)
activeList.add(TokenActionsState.ActionState.Receive(scenario))
val action = TokenActionsState.ActionState.Receive(scenario)
if (scenario == ScenarioUnavailabilityReason.None) {
activeList.add(action)
} else {
disabledList.add(action)
}
}
// swap
@ -280,25 +298,28 @@ class GetCryptoCurrencyActionsUseCase(
quoteSource.isActual() && networkSource.isActual()
}
activeList.add(
TokenActionsState.ActionState.Swap(
unavailabilityReason = if (isSwapAvailable) {
ScenarioUnavailabilityReason.None
} else if (sources.networkSource == StatusSource.ONLY_CACHE) {
ScenarioUnavailabilityReason.UsedOutdatedData
} else {
// CACHE source always when loading
ScenarioUnavailabilityReason.DataLoading
},
showBadge = false,
),
val swapAction = TokenActionsState.ActionState.Swap(
unavailabilityReason = if (isSwapAvailable) {
ScenarioUnavailabilityReason.None
} else if (sources.networkSource == StatusSource.ONLY_CACHE) {
ScenarioUnavailabilityReason.UsedOutdatedData
} else {
// CACHE source always when loading
ScenarioUnavailabilityReason.DataLoading
},
showBadge = false,
)
if (swapAction.unavailabilityReason == ScenarioUnavailabilityReason.None) {
activeList.add(swapAction)
} else {
disabledList.add(swapAction)
}
// buy
if (rampManager.availableForBuy(userWallet.scanResponse, userWallet.walletId, cryptoCurrencyStatus.currency)) {
if (rampManager.availableForBuy(userWallet.scanResponse, userWallet.walletId, cryptoCurrency)) {
activeList.add(TokenActionsState.ActionState.Buy(ScenarioUnavailabilityReason.None))
} else {
activeList.add(
disabledList.add(
TokenActionsState.ActionState.Buy(
ScenarioUnavailabilityReason.BuyUnavailable(
cryptoCurrencyName = cryptoCurrencyStatus.currency.name,
@ -308,29 +329,40 @@ class GetCryptoCurrencyActionsUseCase(
}
// staking
activeList.add(TokenActionsState.ActionState.Stake(ScenarioUnavailabilityReason.UsedOutdatedData, null))
if (cryptoCurrencyStatus.value.sources.networkSource.isActual()) {
addStakingActions(cryptoCurrency, isStakingAvailable, activeList, disabledList)
} else {
disabledList.add(TokenActionsState.ActionState.Stake(ScenarioUnavailabilityReason.UsedOutdatedData, null))
}
// send
val isSendAvailable = cryptoCurrencyStatus.value.sources.networkSource.isActual()
activeList.add(
TokenActionsState.ActionState.Send(
unavailabilityReason = if (isSendAvailable) {
ScenarioUnavailabilityReason.None
} else {
ScenarioUnavailabilityReason.UsedOutdatedData
},
),
val sendAction = TokenActionsState.ActionState.Send(
unavailabilityReason = if (isSendAvailable) {
ScenarioUnavailabilityReason.None
} else {
ScenarioUnavailabilityReason.UsedOutdatedData
},
)
if (sendAction.unavailabilityReason == ScenarioUnavailabilityReason.None) {
activeList.add(sendAction)
} else {
disabledList.add(sendAction)
}
// region sell
activeList.add(TokenActionsState.ActionState.Sell(ScenarioUnavailabilityReason.UsedOutdatedData))
if (isSendAvailable) {
activeList.add(TokenActionsState.ActionState.Sell(ScenarioUnavailabilityReason.None))
} else {
disabledList.add(TokenActionsState.ActionState.Sell(ScenarioUnavailabilityReason.UsedOutdatedData))
}
// endregion
// hide
activeList.add(TokenActionsState.ActionState.HideToken(ScenarioUnavailabilityReason.None))
return activeList
return activeList + disabledList
}
private fun getReceiveScenario(requirements: AssetRequirementsCondition?): ScenarioUnavailabilityReason {