diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt index 5e627d055b..981a56de13 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCryptoCurrencyActionsUseCase.kt @@ -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() @@ -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, + disabledList: MutableList, + ) { + 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 { val activeList = mutableListOf() + val disabledList = mutableListOf() + 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 {