Updated on 2026-08-14

This commit is contained in:
Tangem 2026-01-13 14:17:00 +05:00
parent c703edde8e
commit 8e77f5b2d3
15 changed files with 27 additions and 141 deletions

View file

@ -396,26 +396,6 @@ internal object WalletsDomainModule {
) )
} }
@Provides
@Singleton
fun providesIsUpgradeWalletNotificationEnabledUseCase(
walletsRepository: WalletsRepository,
): IsUpgradeWalletNotificationEnabledUseCase {
return IsUpgradeWalletNotificationEnabledUseCase(
walletsRepository = walletsRepository,
)
}
@Provides
@Singleton
fun providesDismissUpgradeWalletNotificationUseCase(
walletsRepository: WalletsRepository,
): DismissUpgradeWalletNotificationUseCase {
return DismissUpgradeWalletNotificationUseCase(
walletsRepository = walletsRepository,
)
}
@Provides @Provides
@Singleton @Singleton
fun providesUnlockHotWalletContextualUseCase( fun providesUnlockHotWalletContextualUseCase(

View file

@ -50,9 +50,6 @@ internal class DefaultWalletsRepository(
private val moshi: com.squareup.moshi.Moshi, private val moshi: com.squareup.moshi.Moshi,
) : WalletsRepository { ) : WalletsRepository {
private val upgradeWalletNotificationDisabled: MutableStateFlow<Set<UserWalletId>> =
MutableStateFlow(mutableSetOf())
@Deprecated("Hot wallet feature makes app always save user wallets. Do not use this method") @Deprecated("Hot wallet feature makes app always save user wallets. Do not use this method")
override suspend fun shouldSaveUserWalletsSync(): Boolean { override suspend fun shouldSaveUserWalletsSync(): Boolean {
return appPreferencesStore.getSyncOrDefault(key = PreferencesKeys.SAVE_USER_WALLETS_KEY, default = false) return appPreferencesStore.getSyncOrDefault(key = PreferencesKeys.SAVE_USER_WALLETS_KEY, default = false)
@ -339,16 +336,6 @@ internal class DefaultWalletsRepository(
} }
} }
override fun isUpgradeWalletNotificationEnabled(userWalletId: UserWalletId): Flow<Boolean> {
return upgradeWalletNotificationDisabled.map {
it.contains(userWalletId)
}
}
override suspend fun dismissUpgradeWalletNotification(userWalletId: UserWalletId) {
upgradeWalletNotificationDisabled.update { it.plus(userWalletId) }
}
override suspend fun setWalletName(walletId: UserWalletId, walletName: String) = withContext(dispatchers.io) { override suspend fun setWalletName(walletId: UserWalletId, walletName: String) = withContext(dispatchers.io) {
val userWallet = userWalletsStore.getSyncOrNull(key = walletId) val userWallet = userWalletsStore.getSyncOrNull(key = walletId)

View file

@ -60,10 +60,6 @@ interface WalletsRepository {
suspend fun setNotificationsEnabled(userWalletId: UserWalletId, isEnabled: Boolean) suspend fun setNotificationsEnabled(userWalletId: UserWalletId, isEnabled: Boolean)
fun isUpgradeWalletNotificationEnabled(userWalletId: UserWalletId): Flow<Boolean>
suspend fun dismissUpgradeWalletNotification(userWalletId: UserWalletId)
@Throws @Throws
suspend fun setWalletName(walletId: UserWalletId, walletName: String) suspend fun setWalletName(walletId: UserWalletId, walletName: String)

View file

@ -1,12 +0,0 @@
package com.tangem.domain.wallets.usecase
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.repository.WalletsRepository
class DismissUpgradeWalletNotificationUseCase(
private val walletsRepository: WalletsRepository,
) {
suspend operator fun invoke(userWalletId: UserWalletId) {
walletsRepository.dismissUpgradeWalletNotification(userWalletId)
}
}

View file

@ -1,13 +0,0 @@
package com.tangem.domain.wallets.usecase
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.wallets.repository.WalletsRepository
import kotlinx.coroutines.flow.Flow
class IsUpgradeWalletNotificationEnabledUseCase(
private val walletsRepository: WalletsRepository,
) {
operator fun invoke(userWalletId: UserWalletId): Flow<Boolean> {
return walletsRepository.isUpgradeWalletNotificationEnabled(userWalletId)
}
}

View file

@ -104,7 +104,7 @@ internal fun AccessCode(
) { ) {
PinTextField( PinTextField(
length = state.accessCodeLength, length = state.accessCodeLength,
isPasswordVisual = state.isConfirmMode, isPasswordVisual = true,
value = state.accessCode, value = state.accessCode,
pinTextColor = state.accessCodeColor, pinTextColor = state.accessCodeColor,
onValueChange = state.onAccessCodeChange, onValueChange = state.onAccessCodeChange,

View file

@ -38,31 +38,19 @@ internal class ForgetWalletModel @Inject constructor(
field = MutableStateFlow( field = MutableStateFlow(
ForgetWalletUM( ForgetWalletUM(
onBackClick = { router.pop() }, onBackClick = { router.pop() },
firstCheckboxChecked = false, isCheckboxChecked = false,
secondCheckboxChecked = false, onCheckboxClick = ::onCheckboxClick,
onFirstCheckboxClick = ::onFirstCheckboxClick,
onSecondCheckboxClick = ::onSecondCheckboxClick,
onForgetWalletClick = ::onForgetWalletClick, onForgetWalletClick = ::onForgetWalletClick,
isForgetButtonEnabled = false, isForgetButtonEnabled = false,
), ),
) )
private fun onFirstCheckboxClick() { private fun onCheckboxClick() {
uiState.update { uiState.update { currentState ->
val newValue = !it.firstCheckboxChecked val newValue = !currentState.isCheckboxChecked
it.copy( currentState.copy(
firstCheckboxChecked = newValue, isCheckboxChecked = newValue,
isForgetButtonEnabled = newValue && it.secondCheckboxChecked, isForgetButtonEnabled = newValue,
)
}
}
private fun onSecondCheckboxClick() {
uiState.update {
val newValue = !it.secondCheckboxChecked
it.copy(
secondCheckboxChecked = newValue,
isForgetButtonEnabled = it.firstCheckboxChecked && newValue,
) )
} }
} }

View file

@ -2,10 +2,8 @@ package com.tangem.features.hotwallet.forgetwallet.entity
internal data class ForgetWalletUM( internal data class ForgetWalletUM(
val onBackClick: () -> Unit, val onBackClick: () -> Unit,
val firstCheckboxChecked: Boolean, val isCheckboxChecked: Boolean,
val secondCheckboxChecked: Boolean, val onCheckboxClick: () -> Unit,
val onFirstCheckboxClick: () -> Unit,
val onSecondCheckboxClick: () -> Unit,
val onForgetWalletClick: () -> Unit, val onForgetWalletClick: () -> Unit,
val isForgetButtonEnabled: Boolean, val isForgetButtonEnabled: Boolean,
) )

View file

@ -70,15 +70,8 @@ internal fun ForgetWalletContent(state: ForgetWalletUM, modifier: Modifier = Mod
Spacer(modifier = Modifier.height(48.dp)) Spacer(modifier = Modifier.height(48.dp))
CheckboxItem( CheckboxItem(
modifier = Modifier.padding(horizontal = 16.dp), modifier = Modifier.padding(horizontal = 16.dp),
checked = state.firstCheckboxChecked, checked = state.isCheckboxChecked,
onCheckedChange = state.onFirstCheckboxClick, onCheckedChange = state.onCheckboxClick,
text = stringResourceSafe(R.string.hw_remove_wallet_warning_device),
)
Spacer(modifier = Modifier.height(16.dp))
CheckboxItem(
modifier = Modifier.padding(horizontal = 16.dp),
checked = state.secondCheckboxChecked,
onCheckedChange = state.onSecondCheckboxClick,
text = stringResourceSafe(R.string.hw_remove_wallet_warning_access), text = stringResourceSafe(R.string.hw_remove_wallet_warning_access),
) )
Spacer(modifier = Modifier.height(32.dp)) Spacer(modifier = Modifier.height(32.dp))
@ -142,10 +135,8 @@ private fun PreviewForgetWalletContent() {
ForgetWalletContent( ForgetWalletContent(
state = ForgetWalletUM( state = ForgetWalletUM(
onBackClick = {}, onBackClick = {},
firstCheckboxChecked = true, isCheckboxChecked = false,
secondCheckboxChecked = false, onCheckboxClick = {},
onFirstCheckboxClick = {},
onSecondCheckboxClick = {},
onForgetWalletClick = {}, onForgetWalletClick = {},
isForgetButtonEnabled = false, isForgetButtonEnabled = false,
), ),

View file

@ -65,9 +65,7 @@ internal class PreviewWalletSettingsComponent : WalletSettingsComponent {
onNotificationsDescriptionClick = {}, onNotificationsDescriptionClick = {},
isNotificationsPermissionGranted = false, isNotificationsPermissionGranted = false,
onAccessCodeClick = {}, onAccessCodeClick = {},
walletUpgradeDismissed = false,
onUpgradeWalletClick = {}, onUpgradeWalletClick = {},
onDismissUpgradeWalletClick = {},
onBackupClick = {}, onBackupClick = {},
onCardSettingsClick = {}, onCardSettingsClick = {},
accountsUM = previewAccounts(), accountsUM = previewAccounts(),

View file

@ -52,7 +52,6 @@ internal sealed class WalletSettingsItemUM {
val title: TextReference, val title: TextReference,
val description: TextReference, val description: TextReference,
val onClick: () -> Unit, val onClick: () -> Unit,
val onDismissClick: () -> Unit,
) : WalletSettingsItemUM() ) : WalletSettingsItemUM()
} }

View file

@ -86,8 +86,6 @@ internal class WalletSettingsModel @Inject constructor(
private val settingsManager: SettingsManager, private val settingsManager: SettingsManager,
private val permissionsRepository: PermissionRepository, private val permissionsRepository: PermissionRepository,
private val notificationsRepository: NotificationsRepository, private val notificationsRepository: NotificationsRepository,
private val isUpgradeWalletNotificationEnabledUseCase: IsUpgradeWalletNotificationEnabledUseCase,
private val dismissUpgradeWalletNotificationUseCase: DismissUpgradeWalletNotificationUseCase,
private val unlockHotWalletContextualUseCase: UnlockHotWalletContextualUseCase, private val unlockHotWalletContextualUseCase: UnlockHotWalletContextualUseCase,
private val accountsFeatureToggles: AccountsFeatureToggles, private val accountsFeatureToggles: AccountsFeatureToggles,
private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase, private val isAccountsModeEnabledUseCase: IsAccountsModeEnabledUseCase,
@ -140,10 +138,9 @@ internal class WalletSettingsModel @Inject constructor(
flow2 = getWalletNotificationsEnabledUseCase(params.userWalletId) flow2 = getWalletNotificationsEnabledUseCase(params.userWalletId)
.distinctUntilChanged() .distinctUntilChanged()
.conflate(), .conflate(),
flow3 = isUpgradeWalletNotificationEnabledUseCase(params.userWalletId), flow3 = walletCardItemDelegate.cardItemFlow(wallet),
flow4 = walletCardItemDelegate.cardItemFlow(wallet), flow4 = accountItemsDelegate.loadAccount(wallet),
flow5 = accountItemsDelegate.loadAccount(wallet), ) { nftEnabled, notificationsEnabled, cardItem, accountList ->
) { nftEnabled, notificationsEnabled, isUpgradeNotificationEnabled, cardItem, accountList ->
val isWalletBackedUp = when (wallet) { val isWalletBackedUp = when (wallet) {
is UserWallet.Hot -> wallet.backedUp is UserWallet.Hot -> wallet.backedUp
is UserWallet.Cold -> true is UserWallet.Cold -> true
@ -156,7 +153,6 @@ internal class WalletSettingsModel @Inject constructor(
isNFTEnabled = nftEnabled, isNFTEnabled = nftEnabled,
isNotificationsEnabled = notificationsEnabled, isNotificationsEnabled = notificationsEnabled,
isNotificationsPermissionGranted = isNotificationsPermissionGranted(), isNotificationsPermissionGranted = isNotificationsPermissionGranted(),
isUpgradeNotificationEnabled = isUpgradeNotificationEnabled,
accountList = accountList, accountList = accountList,
), ),
accountReorderUM = AccountReorderUM( accountReorderUM = AccountReorderUM(
@ -197,7 +193,6 @@ internal class WalletSettingsModel @Inject constructor(
isNFTEnabled: Boolean, isNFTEnabled: Boolean,
isNotificationsEnabled: Boolean, isNotificationsEnabled: Boolean,
isNotificationsPermissionGranted: Boolean, isNotificationsPermissionGranted: Boolean,
isUpgradeNotificationEnabled: Boolean,
accountList: List<WalletSettingsAccountsUM>, accountList: List<WalletSettingsAccountsUM>,
): PersistentList<WalletSettingsItemUM> { ): PersistentList<WalletSettingsItemUM> {
val isAccountsFeatureEnabled = accountsFeatureToggles.isFeatureEnabled val isAccountsFeatureEnabled = accountsFeatureToggles.isFeatureEnabled
@ -254,9 +249,7 @@ internal class WalletSettingsModel @Inject constructor(
onCheckedNotificationsChanged = ::onCheckedNotificationsChange, onCheckedNotificationsChanged = ::onCheckedNotificationsChange,
onNotificationsDescriptionClick = ::onNotificationsDescriptionClick, onNotificationsDescriptionClick = ::onNotificationsDescriptionClick,
onAccessCodeClick = { onAccessCodeClick(userWallet) }, onAccessCodeClick = { onAccessCodeClick(userWallet) },
walletUpgradeDismissed = isUpgradeNotificationEnabled,
onUpgradeWalletClick = { onUpgradeWalletClick() }, onUpgradeWalletClick = { onUpgradeWalletClick() },
onDismissUpgradeWalletClick = ::onDismissUpgradeWalletClick,
onBackupClick = ::onBackupClick, onBackupClick = ::onBackupClick,
onCardSettingsClick = ::onCardSettingsClick, onCardSettingsClick = ::onCardSettingsClick,
accountsUM = accountList, accountsUM = accountList,
@ -411,12 +404,6 @@ internal class WalletSettingsModel @Inject constructor(
} }
} }
private fun onDismissUpgradeWalletClick() {
modelScope.launch {
dismissUpgradeWalletNotificationUseCase.invoke(params.userWalletId)
}
}
private fun onBackupClick() { private fun onBackupClick() {
analyticsEventHandler.send(WalletSettingsAnalyticEvents.ButtonBackup()) analyticsEventHandler.send(WalletSettingsAnalyticEvents.ButtonBackup())
router.push(AppRoute.WalletBackup(params.userWalletId)) router.push(AppRoute.WalletBackup(params.userWalletId))

View file

@ -281,7 +281,6 @@ private fun UpgradeWalletBlock(model: WalletSettingsItemUM.UpgradeWallet, modifi
iconResId = R.drawable.ic_hardware_backup_36, iconResId = R.drawable.ic_hardware_backup_36,
iconSize = 36.dp, iconSize = 36.dp,
onClick = model.onClick, onClick = model.onClick,
onCloseClick = model.onDismissClick,
shouldShowArrowIcon = false, shouldShowArrowIcon = false,
), ),
modifier = modifier, modifier = modifier,
@ -493,7 +492,6 @@ private fun Preview_WalletSettingsScreen1() {
title = stringReference("Upgrade wallet with a hardware backup"), title = stringReference("Upgrade wallet with a hardware backup"),
description = stringReference("Keep your crypto safe with Tangems best-in-class hardware wallet."), description = stringReference("Keep your crypto safe with Tangems best-in-class hardware wallet."),
onClick = {}, onClick = {},
onDismissClick = {},
), ),
) )
} }

View file

@ -38,9 +38,7 @@ internal class ItemsBuilder @Inject constructor() {
onReferralClick: () -> Unit, onReferralClick: () -> Unit,
onManageTokensClick: () -> Unit, onManageTokensClick: () -> Unit,
onAccessCodeClick: () -> Unit, onAccessCodeClick: () -> Unit,
walletUpgradeDismissed: Boolean,
onUpgradeWalletClick: () -> Unit, onUpgradeWalletClick: () -> Unit,
onDismissUpgradeWalletClick: () -> Unit,
onBackupClick: () -> Unit, onBackupClick: () -> Unit,
onCardSettingsClick: () -> Unit, onCardSettingsClick: () -> Unit,
): PersistentList<WalletSettingsItemUM> = persistentListOf<WalletSettingsItemUM>() ): PersistentList<WalletSettingsItemUM> = persistentListOf<WalletSettingsItemUM>()
@ -48,9 +46,7 @@ internal class ItemsBuilder @Inject constructor() {
.addAll( .addAll(
buildUpgradeWalletItem( buildUpgradeWalletItem(
userWallet = userWallet, userWallet = userWallet,
walletUpgradeDismissed = walletUpgradeDismissed,
onUpgradeWalletClick = onUpgradeWalletClick, onUpgradeWalletClick = onUpgradeWalletClick,
onDismissUpgradeWalletClick = onDismissUpgradeWalletClick,
), ),
) )
.addAll(buildAccessCodeItem(userWallet, onAccessCodeClick)) .addAll(buildAccessCodeItem(userWallet, onAccessCodeClick))
@ -122,24 +118,17 @@ internal class ItemsBuilder @Inject constructor() {
private fun buildUpgradeWalletItem( private fun buildUpgradeWalletItem(
userWallet: UserWallet, userWallet: UserWallet,
walletUpgradeDismissed: Boolean,
onUpgradeWalletClick: () -> Unit, onUpgradeWalletClick: () -> Unit,
onDismissUpgradeWalletClick: () -> Unit,
): List<WalletSettingsItemUM> = when (userWallet) { ): List<WalletSettingsItemUM> = when (userWallet) {
is UserWallet.Cold -> emptyList() is UserWallet.Cold -> emptyList()
is UserWallet.Hot -> if (!walletUpgradeDismissed) { is UserWallet.Hot -> listOf(
listOf( WalletSettingsItemUM.UpgradeWallet(
WalletSettingsItemUM.UpgradeWallet( id = "upgrade_wallet",
id = "upgrade_wallet", title = resourceReference(id = R.string.hw_upgrade_to_cold_banner_title),
title = resourceReference(id = R.string.hw_upgrade_to_cold_banner_title), description = resourceReference(id = R.string.hw_upgrade_to_cold_banner_description),
description = resourceReference(id = R.string.hw_upgrade_to_cold_banner_description), onClick = onUpgradeWalletClick,
onClick = onUpgradeWalletClick, ),
onDismissClick = onDismissUpgradeWalletClick, )
),
)
} else {
emptyList()
}
} }
private fun buildNotificationsPermissionItem() = WalletSettingsItemUM.NotificationPermission( private fun buildNotificationsPermissionItem() = WalletSettingsItemUM.NotificationPermission(

View file

@ -83,7 +83,7 @@ internal fun AnimatedContentScope.WelcomeSelectWallet(state: WelcomeUM.SelectWal
BottomFade(modifier = Modifier.align(Alignment.BottomCenter)) BottomFade(modifier = Modifier.align(Alignment.BottomCenter))
if (state.showUnlockWithBiometricButton) { if (state.showUnlockWithBiometricButton) {
SecondaryButton( PrimaryButton(
modifier = Modifier modifier = Modifier
.align(Alignment.BottomCenter) .align(Alignment.BottomCenter)
.fillMaxWidth() .fillMaxWidth()