Updated on 2026-08-14

This commit is contained in:
Tangem 2025-10-22 19:42:58 +04:00
parent 5a62376bfa
commit f4fa13627c
15 changed files with 142 additions and 53 deletions

View file

@ -20,6 +20,7 @@ import com.tangem.domain.models.account.AccountId
import com.tangem.features.account.ArchivedAccountListComponent
import com.tangem.features.account.archived.entity.AccountArchivedUM
import com.tangem.features.account.archived.entity.AccountArchivedUMBuilder
import com.tangem.features.account.archived.entity.AccountArchivedUMBuilder.Companion.toggleProgress
import com.tangem.features.account.createedit.error.AccountFeatureError
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.JobHolder
@ -92,9 +93,12 @@ internal class ArchivedAccountListModel @Inject constructor(
}
private fun recoverCryptoPortfolio(accountId: AccountId) = modelScope.launch {
withContext(dispatchers.default) {
_uiState.update { it.toggleProgress(accountId, isLoading = true) }
val result = withContext(dispatchers.default) {
recoverCryptoPortfolioUseCase(accountId)
}
_uiState.update { it.toggleProgress(accountId, isLoading = false) }
result
.onLeft(::handleRecoverError)
.onRight {
showSuccessRecoverMessage()

View file

@ -24,5 +24,6 @@ internal data class ArchivedAccountUM(
val accountIconUM: CryptoPortfolioIconUM,
val tokensInfo: TextReference,
val networksInfo: TextReference,
val isLoading: Boolean,
val onClick: () -> Unit,
)

View file

@ -6,6 +6,7 @@ import com.tangem.core.ui.extensions.pluralReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.account.models.ArchivedAccount
import com.tangem.domain.account.usecase.ArchivedAccountList
import com.tangem.domain.models.account.AccountId
import kotlinx.collections.immutable.toImmutableList
import timber.log.Timber
import javax.inject.Inject
@ -28,6 +29,7 @@ internal class AccountArchivedUMBuilder @Inject constructor() {
accountId = accountId.value,
accountName = name.toUM().value,
accountIconUM = icon.toUM(),
isLoading = false,
tokensInfo = pluralReference(
R.plurals.common_tokens_count,
count = tokensCount,
@ -52,4 +54,25 @@ internal class AccountArchivedUMBuilder @Inject constructor() {
onRetryClick = { getArchivedAccounts() },
)
}
companion object {
fun AccountArchivedUM.toggleProgress(accountId: AccountId, isLoading: Boolean): AccountArchivedUM {
return when (this) {
is AccountArchivedUM.Error,
is AccountArchivedUM.Loading,
-> this
is AccountArchivedUM.Content -> copy(
accounts = accounts.map { accountUM ->
if (accountUM.accountId == accountId.value) {
accountUM.copy(isLoading = isLoading)
} else {
accountUM
}
}.toImmutableList(),
)
}
}
}
}

View file

@ -126,7 +126,7 @@ private fun ArchivedAccountRow(item: ArchivedAccountUM, modifier: Modifier = Mod
Row(
modifier = modifier
.fillMaxWidth()
.clickable(onClick = item.onClick)
.clickable(enabled = !item.isLoading, onClick = item.onClick)
.padding(all = TangemTheme.dimens.spacing12),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12),
@ -148,6 +148,7 @@ private fun ArchivedAccountRow(item: ArchivedAccountUM, modifier: Modifier = Mod
SecondarySmallButton(
config = SmallButtonConfig(
text = resourceReference(R.string.account_archived_recover),
isLoading = item.isLoading,
onClick = item.onClick,
),
)
@ -177,7 +178,7 @@ private class PreviewStateProvider : CollectionPreviewParameterProvider<AccountA
tokensInfo = stringReference("10 tokens"),
networksInfo = stringReference("2 networks"),
onClick = {},
isLoading = it % 2 == 0,
)
}.toImmutableList()
val first = AccountArchivedUM.Content(

View file

@ -5,7 +5,6 @@ import androidx.compose.ui.Modifier
import com.tangem.common.ui.account.AccountIconPreviewData
import com.tangem.common.ui.userwallet.state.UserWalletItemUM
import com.tangem.common.ui.userwallet.state.UserWalletItemUM.ImageState
import com.tangem.core.analytics.DummyAnalyticsEventHandler
import com.tangem.core.decompose.navigation.DummyRouter
import com.tangem.core.ui.components.block.model.BlockUM
import com.tangem.core.ui.extensions.resourceReference
@ -45,7 +44,6 @@ internal class PreviewWalletSettingsComponent : WalletSettingsComponent {
popBack = {},
items = ItemsBuilder(
router = DummyRouter(),
analyticsEventHandler = DummyAnalyticsEventHandler(),
).buildItems(
userWallet = UserWallet.Hot(
walletId = UserWalletId("011"),
@ -62,6 +60,7 @@ internal class PreviewWalletSettingsComponent : WalletSettingsComponent {
forgetWallet = {},
onLinkMoreCardsClick = {},
onReferralClick = {},
onManageTokensClick = {},
isManageTokensAvailable = true,
isNotificationsEnabled = true,
onCheckedNotificationsChanged = {},

View file

@ -6,6 +6,7 @@ import arrow.core.getOrElse
import com.arkivanov.decompose.router.slot.SlotNavigation
import com.arkivanov.decompose.router.slot.activate
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.AppRoute.ManageTokens.Source
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam.OnOffState.Off
import com.tangem.core.analytics.models.AnalyticsParam.OnOffState.On
@ -26,6 +27,8 @@ import com.tangem.core.ui.message.bottomSheetMessage
import com.tangem.domain.account.featuretoggle.AccountsFeatureToggles
import com.tangem.domain.card.common.util.cardTypesResolver
import com.tangem.domain.demo.IsDemoCardUseCase
import com.tangem.domain.models.PortfolioId
import com.tangem.domain.models.account.AccountId
import com.tangem.domain.models.scan.CardDTO
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.domain.models.wallet.UserWallet
@ -220,6 +223,21 @@ internal class WalletSettingsModel @Inject constructor(
}
},
onReferralClick = { onReferralClick(userWallet) },
onManageTokensClick = {
analyticsEventHandler.send(Settings.ButtonManageTokens)
router.push(
AppRoute.ManageTokens(
source = Source.SETTINGS,
portfolioId = if (accountsFeatureEnabled) {
PortfolioId(
accountId = AccountId.forMainCryptoPortfolio(userWalletId = userWallet.walletId),
)
} else {
PortfolioId(userWalletId = userWallet.walletId)
},
),
)
},
isNotificationsEnabled = isNotificationsEnabled,
isNotificationsPermissionGranted = isNotificationsPermissionGranted,
onCheckedNotificationsChanged = ::onCheckedNotificationsChange,

View file

@ -1,17 +1,13 @@
package com.tangem.feature.walletsettings.utils
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.AppRoute.ManageTokens.Source
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.navigation.Router
import com.tangem.core.ui.components.block.model.BlockUM
import com.tangem.core.ui.components.label.entity.LabelStyle
import com.tangem.core.ui.components.label.entity.LabelUM
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.domain.models.PortfolioId
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.feature.walletsettings.analytics.Settings
import com.tangem.feature.walletsettings.entity.WalletSettingsAccountsUM
import com.tangem.feature.walletsettings.entity.WalletSettingsItemUM
import com.tangem.feature.walletsettings.impl.R
@ -24,7 +20,6 @@ import javax.inject.Inject
@ModelScoped
internal class ItemsBuilder @Inject constructor(
private val router: Router,
private val analyticsEventHandler: AnalyticsEventHandler,
) {
@Suppress("LongParameterList")
@ -45,6 +40,7 @@ internal class ItemsBuilder @Inject constructor(
forgetWallet: () -> Unit,
onLinkMoreCardsClick: () -> Unit,
onReferralClick: () -> Unit,
onManageTokensClick: () -> Unit,
onAccessCodeClick: () -> Unit,
walletUpgradeDismissed: Boolean,
onUpgradeWalletClick: () -> Unit,
@ -69,6 +65,7 @@ internal class ItemsBuilder @Inject constructor(
isManageTokensAvailable = isManageTokensAvailable,
onLinkMoreCardsClick = onLinkMoreCardsClick,
onReferralClick = onReferralClick,
onManageTokensClick = onManageTokensClick,
),
)
.addAll(
@ -175,6 +172,7 @@ internal class ItemsBuilder @Inject constructor(
isManageTokensAvailable: Boolean,
onLinkMoreCardsClick: () -> Unit,
onReferralClick: () -> Unit,
onManageTokensClick: () -> Unit,
) = WalletSettingsItemUM.WithItems(
id = "card",
description = resourceReference(R.string.settings_card_settings_footer),
@ -204,10 +202,7 @@ internal class ItemsBuilder @Inject constructor(
BlockUM(
text = resourceReference(R.string.add_tokens_title),
iconRes = R.drawable.ic_tether_24,
onClick = {
analyticsEventHandler.send(Settings.ButtonManageTokens)
router.push(AppRoute.ManageTokens(Source.SETTINGS, PortfolioId(userWalletId)))
},
onClick = onManageTokensClick,
).let(::add)
}