From d327640e9f54613cc88f89b8d4f673ecd7a2a878 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 16 Jul 2025 18:02:31 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/routing/utils/ChildFactory.kt | 2 +- .../core/analytics/models/AnalyticsParam.kt | 1 + features/hot-wallet/impl/build.gradle.kts | 1 + .../root/AddExistingWalletModel.kt | 8 ++++++ .../routing/AddExistingWalletChildFactory.kt | 11 +++++++- .../root/routing/AddExistingWalletRoute.kt | 3 +++ .../push-notifications/api/build.gradle.kts | 3 +++ .../api/PushNotificationsComponent.kt | 12 ++++++++- .../impl/DefaultPushNotificationsComponent.kt | 7 +++-- .../impl/model/PushNotificationsModel.kt | 26 +++++++++++++++---- 10 files changed, 64 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index 2e75544715..084e92653f 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -365,7 +365,7 @@ internal class ChildFactory @Inject constructor( is AppRoute.PushNotification -> { createComponentChild( context = context, - params = Unit, + params = PushNotificationsComponent.Params.Route(AppRoute.Home), componentFactory = pushNotificationsComponentFactory, ) } diff --git a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt index 1dd4445077..6667534f25 100644 --- a/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt +++ b/core/analytics/models/src/main/java/com/tangem/core/analytics/models/AnalyticsParam.kt @@ -83,6 +83,7 @@ sealed class AnalyticsParam { data object Onboarding : ScreensSources("Onboarding") data object LongTap : ScreensSources("Long Tap") data object Markets : ScreensSources("Markets") + data object HotWallet : ScreensSources("Hot Wallet") } sealed class TxSentFrom(val value: String) { diff --git a/features/hot-wallet/impl/build.gradle.kts b/features/hot-wallet/impl/build.gradle.kts index 8fff322004..f80932c0e5 100644 --- a/features/hot-wallet/impl/build.gradle.kts +++ b/features/hot-wallet/impl/build.gradle.kts @@ -14,6 +14,7 @@ android { dependencies { /** Api */ implementation(projects.features.hotWallet.api) + implementation(projects.features.pushNotifications.api) /** Core modules */ implementation(projects.core.configToggles) diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/AddExistingWalletModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/AddExistingWalletModel.kt index dd9a7da008..f0d230ef97 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/AddExistingWalletModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/AddExistingWalletModel.kt @@ -9,6 +9,7 @@ import com.tangem.core.decompose.navigation.Router import com.tangem.features.hotwallet.addexistingwallet.start.AddExistingWalletStartComponent import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent import com.tangem.features.hotwallet.addexistingwallet.root.routing.AddExistingWalletRoute +import com.tangem.features.pushnotifications.api.PushNotificationsComponent import com.tangem.utils.coroutines.CoroutineDispatcherProvider import javax.inject.Inject @@ -20,6 +21,7 @@ internal class AddExistingWalletModel @Inject constructor( val addExistingWalletStartModelCallbacks = AddExistingWalletStartModelCallbacks() val addExistingWalletImportModelCallbacks = AddExistingWalletImportModelCallbacks() + val pushNotificationsComponentModelCallbacks = PushNotificationsComponentModelCallbacks() val stackNavigation = StackNavigation() @@ -38,4 +40,10 @@ internal class AddExistingWalletModel @Inject constructor( stackNavigation.pop() } } + + inner class PushNotificationsComponentModelCallbacks : PushNotificationsComponent.ModelCallbacks { + override fun onResult() { + // TODO [REDACTED_TASK_KEY] + } + } } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletChildFactory.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletChildFactory.kt index 4c1e57c968..9f8e3716a6 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletChildFactory.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletChildFactory.kt @@ -5,9 +5,12 @@ import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.features.hotwallet.addexistingwallet.root.AddExistingWalletModel import com.tangem.features.hotwallet.addexistingwallet.start.AddExistingWalletStartComponent import com.tangem.features.hotwallet.addexistingwallet.im.port.AddExistingWalletImportComponent +import com.tangem.features.pushnotifications.api.PushNotificationsComponent import javax.inject.Inject -internal class AddExistingWalletChildFactory @Inject constructor() { +internal class AddExistingWalletChildFactory @Inject constructor( + private val pushNotificationsComponent: PushNotificationsComponent.Factory, +) { fun createChild( route: AddExistingWalletRoute, @@ -27,6 +30,12 @@ internal class AddExistingWalletChildFactory @Inject constructor() { callbacks = model.addExistingWalletImportModelCallbacks, ), ) + is AddExistingWalletRoute.PushNotifications -> pushNotificationsComponent.create( + context = childContext, + params = PushNotificationsComponent.Params.Callbacks( + callbacks = model.pushNotificationsComponentModelCallbacks, + ), + ) } } } \ No newline at end of file diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletRoute.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletRoute.kt index 1566d1bc74..2b26cc1e69 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletRoute.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/addexistingwallet/root/routing/AddExistingWalletRoute.kt @@ -10,4 +10,7 @@ internal sealed class AddExistingWalletRoute : Route { @Serializable object Import : AddExistingWalletRoute() + + @Serializable + object PushNotifications : AddExistingWalletRoute() } \ No newline at end of file diff --git a/features/push-notifications/api/build.gradle.kts b/features/push-notifications/api/build.gradle.kts index 3366d4511c..23997238e3 100644 --- a/features/push-notifications/api/build.gradle.kts +++ b/features/push-notifications/api/build.gradle.kts @@ -16,4 +16,7 @@ dependencies { implementation(projects.core.decompose) implementation(projects.core.ui) implementation(projects.core.analytics.models) + + /** Common */ + implementation(projects.common.routing) } \ No newline at end of file diff --git a/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/PushNotificationsComponent.kt b/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/PushNotificationsComponent.kt index 515492abe3..fd0b224d91 100644 --- a/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/PushNotificationsComponent.kt +++ b/features/push-notifications/api/src/main/java/com/tangem/features/pushnotifications/api/PushNotificationsComponent.kt @@ -1,9 +1,19 @@ package com.tangem.features.pushnotifications.api +import com.tangem.common.routing.AppRoute import com.tangem.core.decompose.factory.ComponentFactory import com.tangem.core.ui.decompose.ComposableContentComponent interface PushNotificationsComponent : ComposableContentComponent { - interface Factory : ComponentFactory + interface Factory : ComponentFactory + + interface ModelCallbacks { + fun onResult() + } + + sealed class Params { + data class Callbacks(val callbacks: ModelCallbacks) : Params() + data class Route(val route: AppRoute) : Params() + } } \ No newline at end of file diff --git a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/DefaultPushNotificationsComponent.kt b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/DefaultPushNotificationsComponent.kt index 07278cd29d..35ed4ef76a 100644 --- a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/DefaultPushNotificationsComponent.kt +++ b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/DefaultPushNotificationsComponent.kt @@ -19,7 +19,7 @@ import dagger.assisted.AssistedInject internal class DefaultPushNotificationsComponent @AssistedInject constructor( @Assisted appComponentContext: AppComponentContext, - @Assisted params: Unit, + @Assisted params: PushNotificationsComponent.Params, ) : PushNotificationsComponent, AppComponentContext by appComponentContext { private val model: PushNotificationsModel = getOrCreateModel(params) @@ -41,6 +41,9 @@ internal class DefaultPushNotificationsComponent @AssistedInject constructor( @AssistedFactory interface Factory : PushNotificationsComponent.Factory { - override fun create(context: AppComponentContext, params: Unit): DefaultPushNotificationsComponent + override fun create( + context: AppComponentContext, + params: PushNotificationsComponent.Params, + ): DefaultPushNotificationsComponent } } \ No newline at end of file diff --git a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/model/PushNotificationsModel.kt b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/model/PushNotificationsModel.kt index de2d442132..1d34193a8f 100644 --- a/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/model/PushNotificationsModel.kt +++ b/features/push-notifications/impl/src/main/java/com/tangem/features/pushnotifications/impl/model/PushNotificationsModel.kt @@ -1,15 +1,16 @@ package com.tangem.features.pushnotifications.impl.model import androidx.compose.runtime.Stable -import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.analytics.models.AnalyticsParam import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer import com.tangem.domain.notifications.toggles.NotificationsFeatureToggles import com.tangem.domain.settings.NeverRequestPermissionUseCase import com.tangem.domain.settings.NeverToInitiallyAskPermissionUseCase +import com.tangem.features.pushnotifications.api.PushNotificationsComponent import com.tangem.features.pushnotifications.api.analytics.PushNotificationAnalyticEvents import com.tangem.features.pushnotifications.api.utils.PUSH_PERMISSION import com.tangem.features.pushnotifications.impl.presentation.state.PushNotificationsUM @@ -21,15 +22,19 @@ import javax.inject.Inject @Stable @ModelScoped +@Suppress("LongParameterList") internal class PushNotificationsModel @Inject constructor( + paramsContainer: ParamsContainer, override val dispatchers: CoroutineDispatcherProvider, private val neverRequestPermissionUseCase: NeverRequestPermissionUseCase, private val neverToInitiallyAskPermissionUseCase: NeverToInitiallyAskPermissionUseCase, private val appRouter: AppRouter, private val analyticHandler: AnalyticsEventHandler, - private val notificationsFeatureToggles: NotificationsFeatureToggles, + notificationsFeatureToggles: NotificationsFeatureToggles, ) : Model(), PushNotificationsClickIntents { + private val params: PushNotificationsComponent.Params = paramsContainer.require() + private val _state = MutableStateFlow( PushNotificationsUM( showInfoAboutNotifications = notificationsFeatureToggles.isNotificationsEnabled, @@ -51,7 +56,7 @@ internal class PushNotificationsModel @Inject constructor( modelScope.launch { neverRequestPermissionUseCase(PUSH_PERMISSION) neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION) - appRouter.push(AppRoute.Home) + onResult() } } @@ -62,7 +67,7 @@ internal class PushNotificationsModel @Inject constructor( modelScope.launch { neverRequestPermissionUseCase(PUSH_PERMISSION) neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION) - appRouter.push(AppRoute.Home) + onResult() } } @@ -73,7 +78,18 @@ internal class PushNotificationsModel @Inject constructor( modelScope.launch { neverRequestPermissionUseCase(PUSH_PERMISSION) neverToInitiallyAskPermissionUseCase(PUSH_PERMISSION) - appRouter.push(AppRoute.Home) + onResult() + } + } + + private fun onResult() { + when (params) { + is PushNotificationsComponent.Params.Callbacks -> { + params.callbacks.onResult() + } + is PushNotificationsComponent.Params.Route -> { + appRouter.push(params.route) + } } } } \ No newline at end of file