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 57dc3d376e..a3a9cf4047 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 @@ -660,8 +660,13 @@ internal class ChildFactory @Inject constructor( createComponentChild( context = context, params = when (val mode = route.mode) { - is AppRoute.TangemPayOnboarding.Mode.ContinueOnboarding -> ContinueOnboarding - is AppRoute.TangemPayOnboarding.Mode.Deeplink -> Deeplink(deeplink = mode.deeplink) + is AppRoute.TangemPayOnboarding.Mode.ContinueOnboarding -> ContinueOnboarding( + userWalletId = mode.userWalletId, + ) + is AppRoute.TangemPayOnboarding.Mode.Deeplink -> Deeplink( + deeplink = mode.deeplink, + userWalletId = mode.userWalletId, + ) }, componentFactory = tangemPayOnboardingComponentFactory, ) diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index f1c07144f6..4e22012973 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -431,10 +431,13 @@ sealed class AppRoute(val path: String) : Route { @Serializable data class Deeplink( val deeplink: String, + val userWalletId: UserWalletId?, ) : Mode() @Serializable - object ContinueOnboarding : Mode() + data class ContinueOnboarding( + val userWalletId: UserWalletId?, + ) : Mode() } } diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayWalletsManager.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayWalletsManager.kt index 054e839ebb..4423dddf32 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayWalletsManager.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayWalletsManager.kt @@ -33,7 +33,6 @@ class TangemPayWalletsManager @Inject constructor( private fun findColdWallet(userWallets: List?): UserWallet.Cold { return userWallets?.find { it is UserWallet.Cold && it.isMultiCurrency - } as? UserWallet.Cold - ?: error("Cannot find cold user wallet") + } as? UserWallet.Cold ?: error("Cannot find cold user wallet") } } \ No newline at end of file diff --git a/features/tangempay/onboarding/api/build.gradle.kts b/features/tangempay/onboarding/api/build.gradle.kts index a52e5bbccd..5d9c35cc08 100644 --- a/features/tangempay/onboarding/api/build.gradle.kts +++ b/features/tangempay/onboarding/api/build.gradle.kts @@ -13,6 +13,9 @@ dependencies { implementation(projects.core.decompose) implementation(projects.core.ui) + /** Domain */ + implementation(projects.domain.models) + /** Compose */ implementation(deps.compose.runtime) } \ No newline at end of file diff --git a/features/tangempay/onboarding/api/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayOnboardingComponent.kt b/features/tangempay/onboarding/api/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayOnboardingComponent.kt index 0ad307aa79..408d809672 100644 --- a/features/tangempay/onboarding/api/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayOnboardingComponent.kt +++ b/features/tangempay/onboarding/api/src/main/kotlin/com/tangem/features/tangempay/components/TangemPayOnboardingComponent.kt @@ -2,15 +2,22 @@ package com.tangem.features.tangempay.components import com.tangem.core.decompose.factory.ComponentFactory import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.models.wallet.UserWalletId interface TangemPayOnboardingComponent : ComposableContentComponent { sealed class Params { + + abstract val userWalletId: UserWalletId? + data class Deeplink( val deeplink: String, + override val userWalletId: UserWalletId?, ) : Params() - object ContinueOnboarding : Params() + data class ContinueOnboarding( + override val userWalletId: UserWalletId?, + ) : Params() } interface Factory : ComponentFactory diff --git a/features/tangempay/onboarding/impl/build.gradle.kts b/features/tangempay/onboarding/impl/build.gradle.kts index 0d109bd508..7b71ee3d94 100644 --- a/features/tangempay/onboarding/impl/build.gradle.kts +++ b/features/tangempay/onboarding/impl/build.gradle.kts @@ -30,6 +30,7 @@ dependencies { /** Domain */ implementation(projects.domain.visa) + implementation(projects.domain.wallets) /** Data **/ implementation(projects.data.visa) diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/deeplink/DefaultOnboardVisaDeepLinkHandler.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/deeplink/DefaultOnboardVisaDeepLinkHandler.kt index 15313ee912..cb6bf2f491 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/deeplink/DefaultOnboardVisaDeepLinkHandler.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/deeplink/DefaultOnboardVisaDeepLinkHandler.kt @@ -1,10 +1,11 @@ package com.tangem.features.tangempay.deeplink import android.net.Uri -import dagger.assisted.Assisted import com.tangem.common.routing.AppRoute -import com.tangem.features.tangempay.TangemPayFeatureToggles import com.tangem.common.routing.AppRouter +import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase +import com.tangem.features.tangempay.TangemPayFeatureToggles +import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -12,11 +13,16 @@ internal class DefaultOnboardVisaDeepLinkHandler @AssistedInject constructor( @Assisted uri: Uri, appRouter: AppRouter, tangemPayFeatureToggles: TangemPayFeatureToggles, + getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, ) : OnboardVisaDeepLinkHandler { init { if (tangemPayFeatureToggles.isTangemPayEnabled) { - val mode = AppRoute.TangemPayOnboarding.Mode.Deeplink(uri.toString()) + val userWallet = getSelectedWalletSyncUseCase.invoke().getOrNull() + val mode = AppRoute.TangemPayOnboarding.Mode.Deeplink( + deeplink = uri.toString(), + userWalletId = userWallet?.walletId, + ) appRouter.push(AppRoute.TangemPayOnboarding(mode)) } else { appRouter.push(AppRoute.Home()) diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt index de4d3018a3..246b7a1ce7 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt @@ -9,9 +9,13 @@ import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.decompose.navigation.Router import com.tangem.core.navigation.url.UrlOpener import com.tangem.data.pay.util.TangemPayWalletsManager +import com.tangem.domain.models.wallet.UserWalletId +import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.pay.repository.OnboardingRepository import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase import com.tangem.domain.tangempay.TangemPayAnalyticsEvents +import com.tangem.domain.wallets.usecase.GetSelectedWalletUseCase +import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.features.tangempay.TangemPayConstants import com.tangem.features.tangempay.components.TangemPayOnboardingComponent import com.tangem.features.tangempay.model.transformers.TangemPayOnboardingButtonLoadingTransformer @@ -37,6 +41,8 @@ internal class TangemPayOnboardingModel @Inject constructor( private val produceInitialDataUseCase: ProduceTangemPayInitialDataUseCase, private val urlOpener: UrlOpener, private val tangemPayWalletsManager: TangemPayWalletsManager, + private val getUserWalletUseCase: GetUserWalletUseCase, + private val getSelectedWalletUseCase: GetSelectedWalletUseCase, ) : Model() { private val params = paramsContainer.require() @@ -74,8 +80,9 @@ internal class TangemPayOnboardingModel @Inject constructor( private suspend fun checkCustomerInfo() { // TODO implement selector + val userWalletId = getUserWalletForPay(params.userWalletId) repository.getCustomerInfo( - userWalletId = tangemPayWalletsManager.getDefaultWalletForTangemPayBlocking().walletId, + userWalletId = userWalletId, ) // selector .onRight { customerInfo -> @@ -92,6 +99,24 @@ internal class TangemPayOnboardingModel @Inject constructor( .onLeft { back() } } + private fun getUserWalletForPay(userWalletId: UserWalletId?): UserWalletId { + val userWallet = userWalletId?.let { getUserWalletUseCase(it).getOrNull() } + return if (userWallet?.isMultiCurrency == true) { + userWallet.walletId + } else { + tryGetSelectedWalletId() + } + } + + private fun tryGetSelectedWalletId(): UserWalletId { + val selectedWallet = getSelectedWalletUseCase.sync().getOrNull() + return if (selectedWallet?.isMultiCurrency == true) { + selectedWallet.walletId + } else { + tangemPayWalletsManager.getDefaultWalletForTangemPayBlocking().walletId + } + } + private fun onTermsClick() { analytics.send(TangemPayAnalyticsEvents.ViewTermsClicked) urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK) @@ -102,7 +127,7 @@ internal class TangemPayOnboardingModel @Inject constructor( uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = true)) modelScope.launch { // TODO implement selector - val userWalletId = tangemPayWalletsManager.getDefaultWalletForTangemPayBlocking().walletId + val userWalletId = getUserWalletForPay(params.userWalletId) val result = produceInitialDataUseCase(userWalletId) if (result.isLeft()) { Timber.e("Error producing initial data: ${result.leftOrNull()?.message}") @@ -134,7 +159,7 @@ internal class TangemPayOnboardingModel @Inject constructor( router.replaceAll( AppRoute.Wallet, AppRoute.Kyc( - userWalletId = tangemPayWalletsManager.getDefaultWalletForTangemPayBlocking().walletId, + userWalletId = getUserWalletForPay(params.userWalletId), ), ) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 5d2fbf72f2..98d68adf5f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -111,8 +111,14 @@ internal class DefaultWalletRouter @Inject constructor( ) } - override fun openTangemPayOnboarding() { - router.push(AppRoute.TangemPayOnboarding(AppRoute.TangemPayOnboarding.Mode.ContinueOnboarding)) + override fun openTangemPayOnboarding(userWalletId: UserWalletId) { + router.push( + AppRoute.TangemPayOnboarding( + AppRoute.TangemPayOnboarding.Mode.ContinueOnboarding( + userWalletId = userWalletId, + ), + ), + ) } override fun openTangemPayDetails(userWalletId: UserWalletId, config: TangemPayDetailsConfig) { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt index a71880095a..cf9d3ea617 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/InnerWalletRouter.kt @@ -63,7 +63,7 @@ internal interface InnerWalletRouter { fun openTokenReceiveBottomSheet(tokenReceiveConfig: TokenReceiveConfig) - fun openTangemPayOnboarding() + fun openTangemPayOnboarding(userWalletId: UserWalletId) fun openTangemPayDetails(userWalletId: UserWalletId, config: TangemPayDetailsConfig) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt index 4ba4c3e8f1..44174f221d 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/subscribers/TangemPayMainSubscriber.kt @@ -86,7 +86,7 @@ internal class TangemPayMainSubscriber @AssistedInject constructor( userWalletId = userWalletId, value = data, cardFrozenState = cardFrozenState, - onClickKyc = innerWalletRouter::openTangemPayOnboarding, + onClickKyc = { innerWalletRouter.openTangemPayOnboarding(userWalletId) }, onIssuingCard = clickIntents::onIssuingCardClicked, onIssuingFailed = clickIntents::onIssuingFailedClicked, openDetails = { config ->