Updated on 2026-08-14

This commit is contained in:
Tangem 2025-06-03 21:07:28 +04:00
parent 5aff097e3e
commit 84802cb6e2
14 changed files with 132 additions and 18 deletions

View file

@ -36,6 +36,7 @@ dependencies {
implementation(projects.domain.wallets.models)
implementation(projects.domain.demo)
implementation(projects.domain.nft)
implementation(projects.domain.settings)
implementation(projects.domain.notifications.toggles)
implementation(projects.domain.notifications.models)
implementation(projects.domain.notifications)

View file

@ -35,6 +35,7 @@ internal class PreviewWalletSettingsComponent : WalletSettingsComponent {
isNotificationsFeatureEnabled = true,
onCheckedNotificationsChanged = {},
onNotificationsDescriptionClick = {},
isNotificationsPermissionGranted = false,
),
requestPushNotificationsPermission = false,
onPushNotificationPermissionGranted = {},

View file

@ -37,4 +37,10 @@ internal sealed class WalletSettingsItemUM {
val more: TextReference,
val onClick: () -> Unit,
) : WalletSettingsItemUM()
data class NotificationPermission(
override val id: String,
val title: TextReference,
val description: TextReference,
) : WalletSettingsItemUM()
}

View file

@ -1,5 +1,6 @@
package com.tangem.feature.walletsettings.model
import android.os.Build
import arrow.core.getOrElse
import com.arkivanov.decompose.router.slot.SlotNavigation
import com.arkivanov.decompose.router.slot.activate
@ -22,6 +23,7 @@ import com.tangem.domain.nft.DisableWalletNFTUseCase
import com.tangem.domain.nft.EnableWalletNFTUseCase
import com.tangem.domain.nft.GetWalletNFTEnabledUseCase
import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles
import com.tangem.domain.settings.repositories.PermissionRepository
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.isMultiCurrency
import com.tangem.domain.wallets.models.requireColdWallet
@ -65,6 +67,7 @@ internal class WalletSettingsModel @Inject constructor(
private val getWalletNotificationsEnabledUseCase: GetWalletNotificationsEnabledUseCase,
private val setNotificationsEnabledUseCase: SetNotificationsEnabledUseCase,
private val settingsManager: SettingsManager,
private val permissionsRepository: PermissionRepository,
) : Model() {
val params: WalletSettingsComponent.Params = paramsContainer.require()
@ -98,6 +101,7 @@ internal class WalletSettingsModel @Inject constructor(
isNFTEnabled = nftEnabled,
isNotificationsEnabled = notificationsEnabled,
isNotificationsFeatureEnabled = notificationsToggles.isNotificationsEnabled,
isNotificationsPermissionGranted = isNotificationsPermissionGranted(),
),
)
}
@ -105,6 +109,16 @@ internal class WalletSettingsModel @Inject constructor(
.launchIn(modelScope)
}
private fun isNotificationsPermissionGranted(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
permissionsRepository.hasRuntimePermission(
android.Manifest.permission.POST_NOTIFICATIONS,
)
} else {
true
}
}
private fun buildItems(
userWallet: UserWallet,
dialogNavigation: SlotNavigation<DialogConfig>,
@ -113,6 +127,7 @@ internal class WalletSettingsModel @Inject constructor(
isNFTEnabled: Boolean,
isNotificationsFeatureEnabled: Boolean,
isNotificationsEnabled: Boolean,
isNotificationsPermissionGranted: Boolean,
): PersistentList<WalletSettingsItemUM> = itemsBuilder.buildItems(
userWalletId = userWallet.walletId,
userWalletName = userWallet.name,
@ -147,6 +162,7 @@ internal class WalletSettingsModel @Inject constructor(
onReferralClick = { onReferralClick(userWallet) },
isNotificationsEnabled = isNotificationsEnabled,
isNotificationsFeatureEnabled = isNotificationsFeatureEnabled,
isNotificationsPermissionGranted = isNotificationsPermissionGranted,
onCheckedNotificationsChanged = ::onCheckedNotificationsChange,
onNotificationsDescriptionClick = ::onNotificationsDescriptionClick,
)

View file

@ -21,6 +21,8 @@ import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM
import com.tangem.core.ui.components.block.BlockCard
import com.tangem.core.ui.components.block.BlockItem
import com.tangem.core.ui.components.items.DescriptionItem
import com.tangem.core.ui.components.notifications.Notification
import com.tangem.core.ui.components.notifications.NotificationConfig
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
@ -109,6 +111,10 @@ private fun Content(state: WalletSettingsUM, modifier: Modifier = Modifier) {
yOffset = DESCRIPTION_OFFSET,
onDescriptionClick = item.onClick,
)
is WalletSettingsItemUM.NotificationPermission -> NotificationAlertBlock(
modifier = itemModifier,
model = item,
)
}
}
}
@ -216,6 +222,18 @@ private fun SwitchBlock(model: WalletSettingsItemUM.WithSwitch, modifier: Modifi
}
}
@Composable
private fun NotificationAlertBlock(model: WalletSettingsItemUM.NotificationPermission, modifier: Modifier = Modifier) {
Notification(
config = NotificationConfig(
title = model.title,
subtitle = model.description,
iconResId = R.drawable.ic_alert_triangle_20,
),
modifier = modifier,
)
}
@Composable
private fun DescriptionWithMoreBlock(
model: WalletSettingsItemUM.DescriptionWithMore,

View file

@ -36,6 +36,7 @@ internal class ItemsBuilder @Inject constructor(
onCheckedNFTChange: (Boolean) -> Unit,
isNotificationsFeatureEnabled: Boolean,
isNotificationsEnabled: Boolean,
isNotificationsPermissionGranted: Boolean,
onCheckedNotificationsChanged: (Boolean) -> Unit,
onNotificationsDescriptionClick: () -> Unit,
forgetWallet: () -> Unit,
@ -61,24 +62,34 @@ internal class ItemsBuilder @Inject constructor(
onReferralClick = onReferralClick,
),
)
.run {
if (isNotificationsFeatureEnabled) {
add(
buildNotificationsSwitchItem(
isNotificationsEnabled,
onCheckedNotificationsChanged,
),
).add(
buildNotificationsDescriptionItem(
onDescriptionClick = onNotificationsDescriptionClick,
),
)
} else {
this
}
}
.addAll(
buildNotificationItems(
isNotificationsFeatureEnabled = isNotificationsFeatureEnabled,
isNotificationsPermissionGranted = isNotificationsPermissionGranted,
isNotificationsEnabled = isNotificationsEnabled,
onCheckedNotificationsChanged = onCheckedNotificationsChanged,
onNotificationsDescriptionClick = onNotificationsDescriptionClick,
),
)
.add(buildForgetItem(forgetWallet))
private fun buildNotificationItems(
isNotificationsFeatureEnabled: Boolean,
isNotificationsPermissionGranted: Boolean,
isNotificationsEnabled: Boolean,
onCheckedNotificationsChanged: (Boolean) -> Unit,
onNotificationsDescriptionClick: () -> Unit,
): List<WalletSettingsItemUM> {
if (!isNotificationsFeatureEnabled) return emptyList()
return buildList {
if (!isNotificationsPermissionGranted) {
add(buildNotificationsPermissionItem())
}
add(buildNotificationsSwitchItem(isNotificationsEnabled, onCheckedNotificationsChanged))
add(buildNotificationsDescriptionItem(onNotificationsDescriptionClick))
}
}
private fun buildNameItem(walletName: String, isRenameWalletAvailable: Boolean, renameWallet: () -> Unit) =
WalletSettingsItemUM.WithText(
id = "wallet_name",
@ -96,6 +107,12 @@ internal class ItemsBuilder @Inject constructor(
onCheckedChange = onCheckedNFTChange,
)
private fun buildNotificationsPermissionItem() = WalletSettingsItemUM.NotificationPermission(
id = "notifications_permission",
title = resourceReference(id = R.string.transaction_notifications_warning_title),
description = resourceReference(id = R.string.transaction_notifications_warning_description),
)
private fun buildNotificationsSwitchItem(isNFTEnabled: Boolean, onCheckedNFTChange: (Boolean) -> Unit) =
WalletSettingsItemUM.WithSwitch(
id = "notifications",