Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-17 12:51:54 +05:00
parent 2746ee308a
commit a139dbca40
22 changed files with 252 additions and 39 deletions

View file

@ -162,6 +162,7 @@ dependencies {
implementation(projects.domain.walletManager.models) implementation(projects.domain.walletManager.models)
implementation(projects.domain.yieldSupply) implementation(projects.domain.yieldSupply)
implementation(projects.domain.blockaid) implementation(projects.domain.blockaid)
implementation(projects.domain.hotWallet)
implementation(projects.common) implementation(projects.common)
implementation(projects.common.routing) implementation(projects.common.routing)
@ -212,6 +213,7 @@ dependencies {
implementation(projects.data.swap) implementation(projects.data.swap)
implementation(projects.data.walletManager) implementation(projects.data.walletManager)
implementation(projects.data.yieldSupply) implementation(projects.data.yieldSupply)
implementation(projects.data.hotWallet)
/** Features */ /** Features */
implementation(projects.features.referral.impl) implementation(projects.features.referral.impl)

View file

@ -0,0 +1,27 @@
package com.tangem.tap.di.domain
import com.tangem.domain.hotwallet.GetAccessCodeSkippedUseCase
import com.tangem.domain.hotwallet.SetAccessCodeSkippedUseCase
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object HotWalletDomainModule {
@Provides
@Singleton
fun provideGetAccessCodeSkippedUseCase(hotWalletRepository: HotWalletRepository): GetAccessCodeSkippedUseCase {
return GetAccessCodeSkippedUseCase(hotWalletRepository)
}
@Provides
@Singleton
fun provideSetAccessCodeSkippedUseCase(hotWalletRepository: HotWalletRepository): SetAccessCodeSkippedUseCase {
return SetAccessCodeSkippedUseCase(hotWalletRepository)
}
}

View file

@ -551,6 +551,7 @@ internal class ChildFactory @Inject constructor(
context = context, context = context,
params = WalletActivationComponent.Params( params = WalletActivationComponent.Params(
userWalletId = route.userWalletId, userWalletId = route.userWalletId,
isBackupExists = route.isBackupExists,
), ),
componentFactory = walletActivationComponentFactory, componentFactory = walletActivationComponentFactory,
) )

View file

@ -358,6 +358,7 @@ sealed class AppRoute(val path: String) : Route {
@Serializable @Serializable
data class WalletActivation( data class WalletActivation(
val userWalletId: UserWalletId, val userWalletId: UserWalletId,
val isBackupExists: Boolean,
) : AppRoute(path = "/wallet_activation/${userWalletId.stringValue}") ) : AppRoute(path = "/wallet_activation/${userWalletId.stringValue}")
@Serializable @Serializable

View file

@ -121,6 +121,8 @@ object PreferencesKeys {
val YIELD_SUPPLY_WARNINGS_STATES_KEY by lazy { stringPreferencesKey(name = "yieldSupplyWarningsStates") } val YIELD_SUPPLY_WARNINGS_STATES_KEY by lazy { stringPreferencesKey(name = "yieldSupplyWarningsStates") }
val ACCESS_CODE_SKIPPED_STATES_KEY by lazy { stringPreferencesKey(name = "accessCodeSkippedStates") }
// region Notifications // region Notifications
val NOTIFICATIONS_APPLICATION_ID_KEY by lazy { stringPreferencesKey(name = "notificationsApplicationId") } val NOTIFICATIONS_APPLICATION_ID_KEY by lazy { stringPreferencesKey(name = "notificationsApplicationId") }

1
data/hot-wallet/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,27 @@
plugins {
alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android)
alias(deps.plugins.kotlin.kapt)
alias(deps.plugins.hilt.android)
id("configuration")
}
android {
namespace = "com.tangem.data.hotwallet"
}
dependencies {
implementation(projects.core.datasource)
implementation(projects.core.utils)
implementation(projects.domain.hotWallet)
implementation(projects.domain.models)
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
implementation(deps.androidx.datastore)
implementation(deps.kotlin.coroutines)
implementation(deps.moshi)
implementation(deps.moshi.kotlin)
}

View file

@ -0,0 +1,28 @@
package com.tangem.data.hotwallet
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys
import com.tangem.datasource.local.preferences.utils.getObjectMap
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
internal class DefaultHotWalletRepository(
private val appPreferencesStore: AppPreferencesStore,
) : HotWalletRepository {
override fun accessCodeSkipped(userWalletId: UserWalletId): Flow<Boolean> = appPreferencesStore
.getObjectMap<Boolean>(PreferencesKeys.ACCESS_CODE_SKIPPED_STATES_KEY)
.map { it[userWalletId.stringValue] == true }
override suspend fun setAccessCodeSkipped(userWalletId: UserWalletId, skipped: Boolean) {
appPreferencesStore.editData {
it.setObjectMap(
key = PreferencesKeys.ACCESS_CODE_SKIPPED_STATES_KEY,
value = it.getObjectMap<Boolean>(PreferencesKeys.ACCESS_CODE_SKIPPED_STATES_KEY)
.plus(userWalletId.stringValue to skipped),
)
}
}
}

View file

@ -0,0 +1,23 @@
package com.tangem.data.hotwallet.di
import com.tangem.data.hotwallet.DefaultHotWalletRepository
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal object HotWalletDataModule {
@Provides
@Singleton
fun provideHotWalletRepository(appPreferencesStore: AppPreferencesStore): HotWalletRepository {
return DefaultHotWalletRepository(
appPreferencesStore = appPreferencesStore,
)
}
}

1
domain/hot-wallet/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,17 @@
plugins {
alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android)
id("configuration")
}
android {
namespace = "com.tangem.domain.hotwallet"
}
dependencies {
implementation(projects.domain.core)
implementation(projects.domain.models)
implementation(projects.domain.wallets.models)
implementation(deps.kotlin.coroutines)
}

View file

@ -0,0 +1,14 @@
package com.tangem.domain.hotwallet
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
class GetAccessCodeSkippedUseCase(
private val hotWalletRepository: HotWalletRepository,
) {
operator fun invoke(userWalletId: UserWalletId): Flow<Boolean> = hotWalletRepository
.accessCodeSkipped(userWalletId)
.distinctUntilChanged()
}

View file

@ -0,0 +1,13 @@
package com.tangem.domain.hotwallet
import arrow.core.Either
import com.tangem.domain.hotwallet.repository.HotWalletRepository
import com.tangem.domain.models.wallet.UserWalletId
class SetAccessCodeSkippedUseCase(
private val hotWalletRepository: HotWalletRepository,
) {
suspend operator fun invoke(userWalletId: UserWalletId, skipped: Boolean): Either<Throwable, Unit> = Either.catch {
hotWalletRepository.setAccessCodeSkipped(userWalletId, skipped)
}
}

View file

@ -0,0 +1,11 @@
package com.tangem.domain.hotwallet.repository
import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.flow.Flow
interface HotWalletRepository {
fun accessCodeSkipped(userWalletId: UserWalletId): Flow<Boolean>
suspend fun setAccessCodeSkipped(userWalletId: UserWalletId, skipped: Boolean)
}

View file

@ -8,6 +8,7 @@ interface WalletActivationComponent : ComposableContentComponent {
data class Params( data class Params(
val userWalletId: UserWalletId, val userWalletId: UserWalletId,
val isBackupExists: Boolean,
) )
interface Factory : ComponentFactory<Params, WalletActivationComponent> interface Factory : ComponentFactory<Params, WalletActivationComponent>

View file

@ -37,6 +37,7 @@ dependencies {
implementation(projects.domain.settings) implementation(projects.domain.settings)
implementation(projects.domain.feedback) implementation(projects.domain.feedback)
implementation(projects.domain.feedback.models) implementation(projects.domain.feedback.models)
implementation(projects.domain.hotWallet)
/** Common */ /** Common */
implementation(projects.common.ui) implementation(projects.common.ui)

View file

@ -14,6 +14,7 @@ import com.tangem.core.ui.message.DialogMessage
import com.tangem.core.ui.message.EventMessageAction import com.tangem.core.ui.message.EventMessageAction
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.settings.ShouldAskPermissionUseCase import com.tangem.domain.settings.ShouldAskPermissionUseCase
import com.tangem.domain.hotwallet.SetAccessCodeSkippedUseCase
import com.tangem.features.hotwallet.addexistingwallet.entry.routing.AddExistingWalletRoute import com.tangem.features.hotwallet.addexistingwallet.entry.routing.AddExistingWalletRoute
import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent
import com.tangem.features.hotwallet.manualbackup.completed.ManualBackupCompletedComponent import com.tangem.features.hotwallet.manualbackup.completed.ManualBackupCompletedComponent
@ -34,6 +35,7 @@ internal class AddExistingWalletModel @Inject constructor(
private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase, private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase,
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender, @GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
private val trackingContextProxy: TrackingContextProxy, private val trackingContextProxy: TrackingContextProxy,
private val setAccessCodeSkippedUseCase: SetAccessCodeSkippedUseCase,
) : Model() { ) : Model() {
val hotWalletStepperComponentModelCallback = HotWalletStepperComponentModelCallback() val hotWalletStepperComponentModelCallback = HotWalletStepperComponentModelCallback()
@ -83,6 +85,12 @@ internal class AddExistingWalletModel @Inject constructor(
} }
private fun showSkipAccessCodeWarningDialog() { private fun showSkipAccessCodeWarningDialog() {
val userWalletId = when (val route = currentRoute.value) {
is AddExistingWalletRoute.SetAccessCode -> route.userWalletId
is AddExistingWalletRoute.ConfirmAccessCode -> route.userWalletId
else -> null
}
uiMessageSender.send( uiMessageSender.send(
DialogMessage( DialogMessage(
message = resourceReference(R.string.access_code_alert_skip_description), message = resourceReference(R.string.access_code_alert_skip_description),
@ -93,7 +101,14 @@ internal class AddExistingWalletModel @Inject constructor(
), ),
secondAction = EventMessageAction( secondAction = EventMessageAction(
title = resourceReference(R.string.access_code_alert_skip_ok), title = resourceReference(R.string.access_code_alert_skip_ok),
onClick = { navigateToPushNotificationsOrNext() }, onClick = {
if (userWalletId != null) {
modelScope.launch {
setAccessCodeSkippedUseCase(userWalletId, true)
}
}
navigateToPushNotificationsOrNext()
},
), ),
shouldDismissOnFirstAction = true, shouldDismissOnFirstAction = true,
), ),

View file

@ -17,6 +17,7 @@ import com.tangem.core.ui.message.DialogMessage
import com.tangem.core.ui.message.EventMessageAction import com.tangem.core.ui.message.EventMessageAction
import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.settings.ShouldAskPermissionUseCase import com.tangem.domain.settings.ShouldAskPermissionUseCase
import com.tangem.domain.hotwallet.SetAccessCodeSkippedUseCase
import com.tangem.features.hotwallet.manualbackup.check.ManualBackupCheckComponent import com.tangem.features.hotwallet.manualbackup.check.ManualBackupCheckComponent
import com.tangem.features.hotwallet.manualbackup.completed.ManualBackupCompletedComponent import com.tangem.features.hotwallet.manualbackup.completed.ManualBackupCompletedComponent
import com.tangem.features.hotwallet.manualbackup.phrase.ManualBackupPhraseComponent import com.tangem.features.hotwallet.manualbackup.phrase.ManualBackupPhraseComponent
@ -33,6 +34,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@Suppress("LongParameterList")
@ModelScoped @ModelScoped
internal class WalletActivationModel @Inject constructor( internal class WalletActivationModel @Inject constructor(
paramsContainer: ParamsContainer, paramsContainer: ParamsContainer,
@ -41,6 +43,7 @@ internal class WalletActivationModel @Inject constructor(
private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase, private val shouldAskPermissionUseCase: ShouldAskPermissionUseCase,
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender, @GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
private val trackingContextProxy: TrackingContextProxy, private val trackingContextProxy: TrackingContextProxy,
private val setAccessCodeSkippedUseCase: SetAccessCodeSkippedUseCase,
) : Model() { ) : Model() {
val params = paramsContainer.require<WalletActivationComponent.Params>() val params = paramsContainer.require<WalletActivationComponent.Params>()
@ -54,8 +57,13 @@ internal class WalletActivationModel @Inject constructor(
val pushNotificationsCallbacks = PushNotificationsCallbacks() val pushNotificationsCallbacks = PushNotificationsCallbacks()
val mobileWalletSetupFinishedModelCallbacks = MobileWalletSetupFinishedModelCallbacks() val mobileWalletSetupFinishedModelCallbacks = MobileWalletSetupFinishedModelCallbacks()
val isStartingWithAccessCode = params.isBackupExists
val stackNavigation = StackNavigation<WalletActivationRoute>() val stackNavigation = StackNavigation<WalletActivationRoute>()
val startRoute = WalletActivationRoute.ManualBackupStart val startRoute = if (isStartingWithAccessCode) {
WalletActivationRoute.SetAccessCode
} else {
WalletActivationRoute.ManualBackupStart
}
val currentRoute: MutableStateFlow<WalletActivationRoute> = MutableStateFlow(startRoute) val currentRoute: MutableStateFlow<WalletActivationRoute> = MutableStateFlow(startRoute)
init { init {
@ -73,7 +81,9 @@ internal class WalletActivationModel @Inject constructor(
is WalletActivationRoute.ManualBackupPhrase -> stackNavigation.pop() is WalletActivationRoute.ManualBackupPhrase -> stackNavigation.pop()
is WalletActivationRoute.ManualBackupCheck -> stackNavigation.pop() is WalletActivationRoute.ManualBackupCheck -> stackNavigation.pop()
is WalletActivationRoute.ManualBackupCompleted -> Unit is WalletActivationRoute.ManualBackupCompleted -> Unit
is WalletActivationRoute.SetAccessCode -> Unit is WalletActivationRoute.SetAccessCode -> if (isStartingWithAccessCode) {
router.pop()
}
is WalletActivationRoute.ConfirmAccessCode -> stackNavigation.pop() is WalletActivationRoute.ConfirmAccessCode -> stackNavigation.pop()
is WalletActivationRoute.PushNotifications -> Unit is WalletActivationRoute.PushNotifications -> Unit
is WalletActivationRoute.SetupFinished -> Unit is WalletActivationRoute.SetupFinished -> Unit
@ -96,6 +106,8 @@ internal class WalletActivationModel @Inject constructor(
} }
private fun showSkipAccessCodeWarningDialog() { private fun showSkipAccessCodeWarningDialog() {
val userWalletId = params.userWalletId
uiMessageSender.send( uiMessageSender.send(
DialogMessage( DialogMessage(
message = resourceReference(R.string.access_code_alert_skip_description), message = resourceReference(R.string.access_code_alert_skip_description),
@ -106,7 +118,12 @@ internal class WalletActivationModel @Inject constructor(
), ),
secondAction = EventMessageAction( secondAction = EventMessageAction(
title = resourceReference(R.string.access_code_alert_skip_ok), title = resourceReference(R.string.access_code_alert_skip_ok),
onClick = { navigateToPushNotificationsOrNext() }, onClick = {
modelScope.launch {
setAccessCodeSkippedUseCase(userWalletId, true)
}
navigateToPushNotificationsOrNext()
},
), ),
shouldDismissOnFirstAction = true, shouldDismissOnFirstAction = true,
), ),

View file

@ -36,6 +36,7 @@ dependencies {
implementation(deps.jodatime) implementation(deps.jodatime)
implementation(deps.kotlin.immutable.collections) implementation(deps.kotlin.immutable.collections)
implementation(deps.reKotlin) implementation(deps.reKotlin)
implementation(tangemDeps.hot.core)
implementation(tangemDeps.card.core) implementation(tangemDeps.card.core)
implementation(tangemDeps.blockchain) implementation(tangemDeps.blockchain)
implementation(deps.timber) implementation(deps.timber)
@ -82,6 +83,7 @@ dependencies {
implementation(projects.domain.networks) implementation(projects.domain.networks)
implementation(projects.domain.nft) implementation(projects.domain.nft)
implementation(projects.domain.nft.models) implementation(projects.domain.nft.models)
implementation(projects.domain.hotWallet)
implementation(projects.domain.onramp) implementation(projects.domain.onramp)
implementation(projects.domain.onramp.models) implementation(projects.domain.onramp.models)
implementation(projects.domain.promo) implementation(projects.domain.promo)

View file

@ -110,7 +110,7 @@ internal interface WalletWarningsClickIntents {
fun onDenyPermissions() fun onDenyPermissions()
fun onFinishWalletActivationClick(type: WalletActivationBannerType) fun onFinishWalletActivationClick(bannerType: WalletActivationBannerType, isBackupExists: Boolean)
} }
@Suppress("LargeClass", "LongParameterList", "TooManyFunctions") @Suppress("LargeClass", "LongParameterList", "TooManyFunctions")
@ -147,32 +147,6 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
private val uiMessageSender: UiMessageSender, private val uiMessageSender: UiMessageSender,
) : BaseWalletClickIntents(), WalletWarningsClickIntents { ) : BaseWalletClickIntents(), WalletWarningsClickIntents {
private val finalizeWalletSetupAlertBS
get() = bottomSheetMessage {
infoBlock {
icon(R.drawable.img_knight_shield_32) {
type = MessageBottomSheetUMV2.Icon.Type.Warning
backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.SameAsTint
}
title = resourceReference(R.string.hw_activation_need_title)
body = resourceReference(R.string.hw_activation_need_description)
}
secondaryButton {
text = resourceReference(R.string.common_later)
onClick {
closeBs()
}
}
primaryButton {
text = resourceReference(R.string.hw_activation_need_backup)
onClick {
val userWallet = getSelectedUserWallet() ?: return@onClick
appRouter.push(WalletActivation(userWallet.walletId))
closeBs()
}
}
}
override fun onAddBackupCardClick() { override fun onAddBackupCardClick() {
analyticsEventHandler.send(MainScreen.NoticeBackupYourWalletTapped) analyticsEventHandler.send(MainScreen.NoticeBackupYourWalletTapped)
@ -501,14 +475,38 @@ internal class WalletWarningsClickIntentsImplementor @Inject constructor(
} }
} }
override fun onFinishWalletActivationClick(type: WalletActivationBannerType) { override fun onFinishWalletActivationClick(bannerType: WalletActivationBannerType, isBackupExists: Boolean) {
when (type) { when (bannerType) {
WalletActivationBannerType.Attention -> { WalletActivationBannerType.Attention -> {
val userWallet = getSelectedUserWallet() ?: return val userWallet = getSelectedUserWallet() ?: return
appRouter.push(WalletActivation(userWallet.walletId)) appRouter.push(WalletActivation(userWallet.walletId, isBackupExists))
} }
WalletActivationBannerType.Warning -> { WalletActivationBannerType.Warning -> {
messageSender.send(finalizeWalletSetupAlertBS) val message = bottomSheetMessage {
infoBlock {
icon(R.drawable.img_knight_shield_32) {
type = MessageBottomSheetUMV2.Icon.Type.Warning
backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.SameAsTint
}
title = resourceReference(R.string.hw_activation_need_title)
body = resourceReference(R.string.hw_activation_need_description)
}
secondaryButton {
text = resourceReference(R.string.common_later)
onClick {
closeBs()
}
}
primaryButton {
text = resourceReference(R.string.hw_activation_need_backup)
onClick {
val userWallet = getSelectedUserWallet() ?: return@onClick
appRouter.push(WalletActivation(userWallet.walletId, isBackupExists))
closeBs()
}
}
}
messageSender.send(message)
} }
} }
} }

View file

@ -31,11 +31,13 @@ import com.tangem.domain.tokens.error.TokenListError
import com.tangem.domain.wallets.models.SeedPhraseNotificationsStatus import com.tangem.domain.wallets.models.SeedPhraseNotificationsStatus
import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase import com.tangem.domain.wallets.usecase.IsNeedToBackupUseCase
import com.tangem.domain.wallets.usecase.SeedPhraseNotificationUseCase import com.tangem.domain.wallets.usecase.SeedPhraseNotificationUseCase
import com.tangem.domain.hotwallet.GetAccessCodeSkippedUseCase
import com.tangem.feature.wallet.child.wallet.model.WalletActivationBannerType import com.tangem.feature.wallet.child.wallet.model.WalletActivationBannerType
import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents import com.tangem.feature.wallet.child.wallet.model.intents.WalletClickIntents
import com.tangem.feature.wallet.impl.R import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.account.AccountDependencies import com.tangem.feature.wallet.presentation.account.AccountDependencies
import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification import com.tangem.feature.wallet.presentation.wallet.state.model.WalletNotification
import com.tangem.hot.sdk.model.HotWalletId
import com.tangem.lib.crypto.BlockchainUtils.isBitcoin import com.tangem.lib.crypto.BlockchainUtils.isBitcoin
import com.tangem.utils.extensions.addIf import com.tangem.utils.extensions.addIf
import com.tangem.utils.extensions.isPositive import com.tangem.utils.extensions.isPositive
@ -62,6 +64,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
private val getOnrampCountryUseCase: GetOnrampCountryUseCase, private val getOnrampCountryUseCase: GetOnrampCountryUseCase,
private val notificationsRepository: NotificationsRepository, private val notificationsRepository: NotificationsRepository,
private val accountDependencies: AccountDependencies, private val accountDependencies: AccountDependencies,
private val getAccessCodeSkippedUseCase: GetAccessCodeSkippedUseCase,
) { ) {
@Suppress("UNCHECKED_CAST", "MagicNumber") @Suppress("UNCHECKED_CAST", "MagicNumber")
@ -98,6 +101,7 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.VisaPresale), shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.VisaPresale),
shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.Sepa), shouldShowPromoWalletUseCase(userWalletId = userWallet.walletId, promoId = PromoId.Sepa),
notificationsRepository.getShouldShowNotification(NotificationId.EnablePushesReminderNotification.key), notificationsRepository.getShouldShowNotification(NotificationId.EnablePushesReminderNotification.key),
getAccessCodeSkippedUseCase(userWallet.walletId),
) { array -> array } ) { array -> array }
.combine(tokenListFlow()) { array, any: Any -> arrayOf(any).plus(elements = array) } .combine(tokenListFlow()) { array, any: Any -> arrayOf(any).plus(elements = array) }
.map { array -> .map { array ->
@ -110,13 +114,14 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
val shouldShowVisaPromo = array[4] as Boolean val shouldShowVisaPromo = array[4] as Boolean
val shouldShowSepaBanner = array[5] as Boolean val shouldShowSepaBanner = array[5] as Boolean
val shouldShowEnablePushesReminderNotification = array[6] as Boolean val shouldShowEnablePushesReminderNotification = array[6] as Boolean
val accessCodeSkipped = array[7] as Boolean
buildList { buildList {
addUsedOutdatedDataNotification(totalFiatBalance) addUsedOutdatedDataNotification(totalFiatBalance)
addCriticalNotifications(userWallet, seedPhraseIssueStatus, clickIntents) addCriticalNotifications(userWallet, seedPhraseIssueStatus, clickIntents)
addFinishWalletActivationNotification(userWallet, totalFiatBalance, clickIntents) addFinishWalletActivationNotification(userWallet, totalFiatBalance, clickIntents, accessCodeSkipped)
addVisaPresalePromoNotification(clickIntents, shouldShowVisaPromo) addVisaPresalePromoNotification(clickIntents, shouldShowVisaPromo)
@ -405,10 +410,14 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
userWallet: UserWallet, userWallet: UserWallet,
totalFiatBalance: Lce<TokenListError, TotalFiatBalance>, totalFiatBalance: Lce<TokenListError, TotalFiatBalance>,
clickIntents: WalletClickIntents, clickIntents: WalletClickIntents,
accessCodeSkipped: Boolean,
) { ) {
if (userWallet !is UserWallet.Hot) return if (userWallet !is UserWallet.Hot) return
val shouldShowFinishActivation = !userWallet.backedUp val isBackupExists = userWallet.backedUp
val isAccessCodeRequired = userWallet.hotWalletId.authType == HotWalletId.AuthType.NoPassword &&
!accessCodeSkipped
val shouldShowFinishActivation = !isBackupExists || isAccessCodeRequired
val type = totalFiatBalance.fold( val type = totalFiatBalance.fold(
ifLoading = { it.getFinishWalletActivationType() }, ifLoading = { it.getFinishWalletActivationType() },
@ -427,11 +436,11 @@ internal class GetMultiWalletWarningsFactory @Inject constructor(
buttonsState = when (type) { buttonsState = when (type) {
WalletActivationBannerType.Warning -> ButtonsState.PrimaryButtonConfig( WalletActivationBannerType.Warning -> ButtonsState.PrimaryButtonConfig(
text = resourceReference(R.string.hw_activation_need_finish), text = resourceReference(R.string.hw_activation_need_finish),
onClick = { clickIntents.onFinishWalletActivationClick(type) }, onClick = { clickIntents.onFinishWalletActivationClick(type, isBackupExists) },
) )
else -> ButtonsState.SecondaryButtonConfig( else -> ButtonsState.SecondaryButtonConfig(
text = resourceReference(R.string.hw_activation_need_finish), text = resourceReference(R.string.hw_activation_need_finish),
onClick = { clickIntents.onFinishWalletActivationClick(type) }, onClick = { clickIntents.onFinishWalletActivationClick(type, isBackupExists) },
) )
}, },
), ),

View file

@ -348,6 +348,7 @@ include(":domain:promo")
include(":domain:promo:models") include(":domain:promo:models")
include(":domain:nft") include(":domain:nft")
include(":domain:nft:models") include(":domain:nft:models")
include(":domain:hot-wallet")
include(":domain:networks") include(":domain:networks")
include(":domain:quotes") include(":domain:quotes")
include(":domain:blockaid") include(":domain:blockaid")
@ -389,6 +390,7 @@ include(":data:markets")
include(":data:manage-tokens") include(":data:manage-tokens")
include(":data:networks") include(":data:networks")
include(":data:nft") include(":data:nft")
include(":data:hot-wallet")
include(":data:onramp") include(":data:onramp")
include(":data:quotes") include(":data:quotes")
include(":data:notifications") include(":data:notifications")