From e5c441a9f0db352d391dc31dc62065b47ba56eb0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 24 Jun 2026 17:31:01 +0500 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 10 + .../tangem/tap/routing/utils/ChildFactory.kt | 19 ++ .../tap/routing/utils/DeepLinkFactory.kt | 3 + .../tap/routing/utils/DeepLinkFactoryTest.kt | 6 + .../com/tangem/common/routing/AppRoute.kt | 18 ++ .../tangem/common/routing/DeepLinkRoute.kt | 4 + .../pay/models/response/CustomerMeResponse.kt | 10 + .../onboarding/api/build.gradle.kts | 9 + .../VirtualAccountOnboardingComponent.kt | 21 ++ .../OnboardVirtualAccountsDeepLinkHandler.kt | 10 + .../onboarding/impl/build.gradle.kts | 19 +- ...efaultVirtualAccountOnboardingComponent.kt | 35 +++ ...ltOnboardVirtualAccountsDeepLinkHandler.kt | 35 +++ .../VirtualAccountOnboardingFeatureModule.kt | 25 ++ .../VirtualAccountOnboardingModelsModule.kt | 20 ++ .../model/VirtualAccountOnboardingModel.kt | 96 ++++++++ .../ui/VirtualAccountOnboardingScreen.kt | 213 ++++++++++++++++++ .../ui/VirtualAccountOnboardingUM.kt | 22 ++ .../bg_virtual_account_onboarding.webp | Bin 0 -> 53770 bytes 19 files changed, 573 insertions(+), 2 deletions(-) create mode 100644 features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/VirtualAccountOnboardingComponent.kt create mode 100644 features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/OnboardVirtualAccountsDeepLinkHandler.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/DefaultVirtualAccountOnboardingComponent.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/DefaultOnboardVirtualAccountsDeepLinkHandler.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingFeatureModule.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingModelsModule.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/model/VirtualAccountOnboardingModel.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingScreen.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingUM.kt create mode 100644 features/virtual-accounts/onboarding/impl/src/main/res/drawable/bg_virtual_account_onboarding.webp diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dcb214db57..eb8e94ac35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -313,6 +313,16 @@ + + + + + + + + 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 f7c46d1d64..ec6982db3a 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 @@ -43,6 +43,7 @@ import com.tangem.features.tangempay.components.TangemPayHotWalletOnboardingComp import com.tangem.features.tangempay.components.TangemPayOnboardingComponent import com.tangem.features.tangempay.components.TangemPayOnboardingComponent.Params.* import com.tangem.features.tokendetails.TokenDetailsComponent +import com.tangem.features.virtualaccount.onboarding.component.VirtualAccountOnboardingComponent import com.tangem.features.wallet.WalletEntryComponent import com.tangem.features.walletconnect.components.WalletConnectEntryComponent import com.tangem.features.yield.supply.api.YieldSupplyEntryComponent @@ -114,6 +115,7 @@ internal class ChildFactory @Inject constructor( private val tangemPayDetailsContainerComponentFactory: TangemPayDetailsContainerComponent.Factory, private val tangemPayOnboardingComponentFactory: TangemPayOnboardingComponent.Factory, private val tangemPayWalletOnboardingComponentFactory: TangemPayHotWalletOnboardingComponent.Factory, + private val virtualAccountOnboardingComponentFactory: VirtualAccountOnboardingComponent.Factory, private val kycComponentFactory: KycComponent.Factory, private val surveyComponentFactory: SurveyComponent.Factory, private val yieldSupplyEntryComponentFactory: YieldSupplyEntryComponent.Factory, @@ -703,6 +705,23 @@ internal class ChildFactory @Inject constructor( componentFactory = tangemPayWalletOnboardingComponentFactory, ) } + is AppRoute.VirtualAccountOnboarding -> { + createComponentChild( + context = context, + params = when (val mode = route.mode) { + is AppRoute.VirtualAccountOnboarding.Mode.Deeplink -> + VirtualAccountOnboardingComponent.Params.Deeplink( + userWalletId = mode.userWalletId, + deeplink = mode.deeplink, + ) + is AppRoute.VirtualAccountOnboarding.Mode.FromMain -> + VirtualAccountOnboardingComponent.Params.FromMain(userWalletId = mode.userWalletId) + is AppRoute.VirtualAccountOnboarding.Mode.FromDetailsScreen -> + VirtualAccountOnboardingComponent.Params.FromDetailsScreen(userWalletId = mode.userWalletId) + }, + componentFactory = virtualAccountOnboardingComponentFactory, + ) + } is AppRoute.Kyc -> { createComponentChild( context = context, diff --git a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt index 378e230a37..c30d377259 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/DeepLinkFactory.kt @@ -21,6 +21,7 @@ import com.tangem.features.send.api.deeplink.SellRedirectDeepLinkHandler import com.tangem.features.staking.api.deeplink.StakingDeepLinkHandler import com.tangem.features.survey.deeplink.SurveyDeepLinkHandler import com.tangem.features.tangempay.deeplink.OnboardVisaDeepLinkHandler +import com.tangem.features.virtualaccount.onboarding.deeplink.OnboardVirtualAccountsDeepLinkHandler import com.tangem.features.tangempay.deeplink.TangemPayMainDeepLinkHandler import com.tangem.features.tokendetails.deeplink.TokenDetailsDeepLinkHandler import com.tangem.features.wallet.deeplink.PromoDeeplinkHandler @@ -57,6 +58,7 @@ internal class DeepLinkFactory @Inject constructor( private val swapDeepLink: SwapDeepLinkHandler.Factory, private val promoDeepLink: PromoDeeplinkHandler.Factory, private val onboardVisaDeepLink: OnboardVisaDeepLinkHandler.Factory, + private val onboardVirtualAccountsDeepLink: OnboardVirtualAccountsDeepLinkHandler.Factory, private val marketsTokenExchangesDeepLink: MarketsTokenExchangesDeepLinkHandler.Factory, private val tangemPayMainDeepLink: TangemPayMainDeepLinkHandler.Factory, private val newsDetailsDeepLink: NewsDetailsDeepLinkHandler.Factory, @@ -173,6 +175,7 @@ internal class DeepLinkFactory @Inject constructor( DeepLinkRoute.WalletConnect.host -> walletConnectDeepLink.create(deeplinkUri) DeepLinkRoute.Promo.host -> promoDeepLink.create(coroutineScope, queryParams) DeepLinkRoute.OnboardVisa.host -> onboardVisaDeepLink.create(deeplinkUri) + DeepLinkRoute.OnboardVirtualAccounts.host -> onboardVirtualAccountsDeepLink.create(deeplinkUri) DeepLinkRoute.News.host -> newsDeepLink.create(queryParams) DeepLinkRoute.Earn.host -> earnDeepLink.create(queryParams) DeepLinkRoute.Yield.host -> yieldDeepLink.create(coroutineScope, queryParams) diff --git a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt index c6cfb8973c..c6744e1b77 100644 --- a/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt +++ b/app/src/test/kotlin/com/tangem/tap/routing/utils/DeepLinkFactoryTest.kt @@ -19,6 +19,7 @@ import com.tangem.features.onramp.deeplink.SwapDeepLinkHandler import com.tangem.features.send.api.deeplink.SellRedirectDeepLinkHandler import com.tangem.features.staking.api.deeplink.StakingDeepLinkHandler import com.tangem.features.tangempay.deeplink.OnboardVisaDeepLinkHandler +import com.tangem.features.virtualaccount.onboarding.deeplink.OnboardVirtualAccountsDeepLinkHandler import com.tangem.features.tangempay.deeplink.TangemPayMainDeepLinkHandler import com.tangem.features.tokendetails.deeplink.TokenDetailsDeepLinkHandler import com.tangem.features.wallet.deeplink.PromoDeeplinkHandler @@ -84,6 +85,10 @@ class DeepLinkFactoryTest { every { create(any()) } returns mockk() } + private val onboardVirtualAccountsDeepLink = mockk(relaxed = true) { + every { create(any()) } returns mockk() + } + private val tangemPayMainDeepLink = mockk(relaxed = true) { every { create(any(), any()) } returns mockk() } @@ -140,6 +145,7 @@ class DeepLinkFactoryTest { swapDeepLink = swapDeepLinkFactory, promoDeepLink = promoDeepLinkFactory, onboardVisaDeepLink = onboardVisaDeepLink, + onboardVirtualAccountsDeepLink = onboardVirtualAccountsDeepLink, tangemPayMainDeepLink = tangemPayMainDeepLink, newsDetailsDeepLink = newsDeeplink, newsDeepLink = newsDeepLinkFactory, 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 cd1e1253a0..9536a684a0 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 @@ -509,6 +509,24 @@ sealed class AppRoute(val path: String) : Route { @Serializable data class Kyc(val userWalletId: UserWalletId) : AppRoute(path = "/kyc") + @Serializable + data class VirtualAccountOnboarding( + val mode: Mode, + ) : AppRoute(path = "/virtual_account_onboarding/$mode") { + + @Serializable + sealed class Mode { + @Serializable + data class Deeplink(val userWalletId: UserWalletId, val deeplink: String) : Mode() + + @Serializable + data class FromMain(val userWalletId: UserWalletId) : Mode() + + @Serializable + data class FromDetailsScreen(val userWalletId: UserWalletId) : Mode() + } + } + @Serializable data class Survey(val token: String, val displayId: String? = null) : AppRoute(path = "/survey") diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/DeepLinkRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/DeepLinkRoute.kt index e2e31a626c..9abdcf8b09 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/DeepLinkRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/DeepLinkRoute.kt @@ -68,6 +68,10 @@ sealed class DeepLinkRoute { override val host: String = "onboard-visa" } + data object OnboardVirtualAccounts : DeepLinkRoute() { + override val host: String = "onboard-virtual-account" + } + data object PayApp : DeepLinkRoute() { override val host: String = "tangem.com" } diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt index da654f8d16..17de6c4cd0 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt @@ -35,7 +35,17 @@ data class CustomerMeResponse( @Json(name = "display_name") val displayName: String?, @Json(name = "actual_card_limit") val actualCardLimit: CardLimit?, @Json(name = "admin_card_limit") val adminCardLimit: CardLimit?, + @Json(name = "product_specification_data_type") val specificationDataType: SpecificationDataType, ) { + @JsonClass(generateAdapter = false) + enum class SpecificationDataType { + @Json(name = "ACCOUNT") + ACCOUNT, + + @Json(name = "CARD") + CARD, + } + @JsonClass(generateAdapter = false) enum class Status { @Json(name = "NEW") diff --git a/features/virtual-accounts/onboarding/api/build.gradle.kts b/features/virtual-accounts/onboarding/api/build.gradle.kts index bd895bec0a..a409f095d3 100644 --- a/features/virtual-accounts/onboarding/api/build.gradle.kts +++ b/features/virtual-accounts/onboarding/api/build.gradle.kts @@ -9,4 +9,13 @@ android { } dependencies { + /** Core */ + 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/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/VirtualAccountOnboardingComponent.kt b/features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/VirtualAccountOnboardingComponent.kt new file mode 100644 index 0000000000..5aac13f9ca --- /dev/null +++ b/features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/VirtualAccountOnboardingComponent.kt @@ -0,0 +1,21 @@ +package com.tangem.features.virtualaccount.onboarding.component + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.models.wallet.UserWalletId + +interface VirtualAccountOnboardingComponent : ComposableContentComponent { + + sealed class Params { + + abstract val userWalletId: UserWalletId + + data class Deeplink(override val userWalletId: UserWalletId, val deeplink: String) : Params() + + data class FromMain(override val userWalletId: UserWalletId) : Params() + + data class FromDetailsScreen(override val userWalletId: UserWalletId) : Params() + } + + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/OnboardVirtualAccountsDeepLinkHandler.kt b/features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/OnboardVirtualAccountsDeepLinkHandler.kt new file mode 100644 index 0000000000..62350c86f4 --- /dev/null +++ b/features/virtual-accounts/onboarding/api/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/OnboardVirtualAccountsDeepLinkHandler.kt @@ -0,0 +1,10 @@ +package com.tangem.features.virtualaccount.onboarding.deeplink + +import android.net.Uri + +interface OnboardVirtualAccountsDeepLinkHandler { + + interface Factory { + fun create(uri: Uri): OnboardVirtualAccountsDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/build.gradle.kts b/features/virtual-accounts/onboarding/impl/build.gradle.kts index b187abb29a..8ea2dc7f4d 100644 --- a/features/virtual-accounts/onboarding/impl/build.gradle.kts +++ b/features/virtual-accounts/onboarding/impl/build.gradle.kts @@ -11,11 +11,23 @@ android { } dependencies { + /** Core */ + implementation(projects.core.decompose) + implementation(projects.core.error) + implementation(projects.core.ui) + implementation(projects.core.utils) + + /** Common */ + implementation(projects.common.routing) + implementation(projects.common.ui) + /** Api */ implementation(projects.features.virtualAccounts.onboarding.api) - /** Core modules */ - implementation(projects.core.configToggles) + /** Domain */ + implementation(projects.domain.common) + implementation(projects.domain.models) + implementation(projects.domain.visa) /** Compose */ implementation(deps.compose.foundation) @@ -27,4 +39,7 @@ dependencies { /** DI */ implementation(deps.hilt.android) kapt(deps.hilt.kapt) + + /** Other */ + implementation(deps.arrow.core) } \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/DefaultVirtualAccountOnboardingComponent.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/DefaultVirtualAccountOnboardingComponent.kt new file mode 100644 index 0000000000..253935756f --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/component/DefaultVirtualAccountOnboardingComponent.kt @@ -0,0 +1,35 @@ +package com.tangem.features.virtualaccount.onboarding.component + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.features.virtualaccount.onboarding.model.VirtualAccountOnboardingModel +import com.tangem.features.virtualaccount.onboarding.ui.VirtualAccountOnboardingScreen +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +internal class DefaultVirtualAccountOnboardingComponent @AssistedInject constructor( + @Assisted appComponentContext: AppComponentContext, + @Assisted params: VirtualAccountOnboardingComponent.Params, +) : VirtualAccountOnboardingComponent, AppComponentContext by appComponentContext { + + private val model: VirtualAccountOnboardingModel = getOrCreateModel(params) + + @Composable + override fun Content(modifier: Modifier) { + val state by model.uiState.collectAsStateWithLifecycle() + VirtualAccountOnboardingScreen(modifier = modifier, state = state) + } + + @AssistedFactory + interface Factory : VirtualAccountOnboardingComponent.Factory { + override fun create( + context: AppComponentContext, + params: VirtualAccountOnboardingComponent.Params, + ): DefaultVirtualAccountOnboardingComponent + } +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/DefaultOnboardVirtualAccountsDeepLinkHandler.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/DefaultOnboardVirtualAccountsDeepLinkHandler.kt new file mode 100644 index 0000000000..87dcb0729b --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/deeplink/DefaultOnboardVirtualAccountsDeepLinkHandler.kt @@ -0,0 +1,35 @@ +package com.tangem.features.virtualaccount.onboarding.deeplink + +import android.net.Uri +import com.tangem.common.routing.AppRoute +import com.tangem.common.routing.AppRouter +import com.tangem.domain.common.wallets.UserWalletsListRepository +import com.tangem.utils.logging.TangemLogger +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +internal class DefaultOnboardVirtualAccountsDeepLinkHandler @AssistedInject constructor( + @Assisted uri: Uri, + appRouter: AppRouter, + userWalletsListRepository: UserWalletsListRepository, +) : OnboardVirtualAccountsDeepLinkHandler { + + init { + val userWalletId = userWalletsListRepository.selectedUserWallet.value?.walletId + if (userWalletId == null) { + TangemLogger.e("Can not open virtual account onboarding deeplink: no selected wallet") + } else { + val mode = AppRoute.VirtualAccountOnboarding.Mode.Deeplink( + userWalletId = userWalletId, + deeplink = uri.toString(), + ) + appRouter.push(AppRoute.VirtualAccountOnboarding(mode)) + } + } + + @AssistedFactory + interface Factory : OnboardVirtualAccountsDeepLinkHandler.Factory { + override fun create(uri: Uri): DefaultOnboardVirtualAccountsDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingFeatureModule.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingFeatureModule.kt new file mode 100644 index 0000000000..3d1c743658 --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingFeatureModule.kt @@ -0,0 +1,25 @@ +package com.tangem.features.virtualaccount.onboarding.di + +import com.tangem.features.virtualaccount.onboarding.component.DefaultVirtualAccountOnboardingComponent +import com.tangem.features.virtualaccount.onboarding.component.VirtualAccountOnboardingComponent +import com.tangem.features.virtualaccount.onboarding.deeplink.DefaultOnboardVirtualAccountsDeepLinkHandler +import com.tangem.features.virtualaccount.onboarding.deeplink.OnboardVirtualAccountsDeepLinkHandler +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal interface VirtualAccountOnboardingFeatureModule { + + @Binds + fun bindFactory(impl: DefaultVirtualAccountOnboardingComponent.Factory): VirtualAccountOnboardingComponent.Factory + + @Binds + @Singleton + fun bindOnboardVirtualAccountsDeepLinkHandlerFactory( + impl: DefaultOnboardVirtualAccountsDeepLinkHandler.Factory, + ): OnboardVirtualAccountsDeepLinkHandler.Factory +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingModelsModule.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingModelsModule.kt new file mode 100644 index 0000000000..e14040c3ea --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/di/VirtualAccountOnboardingModelsModule.kt @@ -0,0 +1,20 @@ +package com.tangem.features.virtualaccount.onboarding.di + +import com.tangem.core.decompose.di.ModelComponent +import com.tangem.core.decompose.model.Model +import com.tangem.features.virtualaccount.onboarding.model.VirtualAccountOnboardingModel +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap + +@Module +@InstallIn(ModelComponent::class) +internal interface VirtualAccountOnboardingModelsModule { + + @Binds + @IntoMap + @ClassKey(VirtualAccountOnboardingModel::class) + fun bindVirtualAccountOnboardingModel(model: VirtualAccountOnboardingModel): Model +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/model/VirtualAccountOnboardingModel.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/model/VirtualAccountOnboardingModel.kt new file mode 100644 index 0000000000..9c30c6911e --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/model/VirtualAccountOnboardingModel.kt @@ -0,0 +1,96 @@ +package com.tangem.features.virtualaccount.onboarding.model + +import androidx.compose.runtime.Stable +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.core.decompose.navigation.Router +import com.tangem.domain.pay.repository.OnboardingRepository +import com.tangem.features.virtualaccount.onboarding.component.VirtualAccountOnboardingComponent +import com.tangem.features.virtualaccount.onboarding.ui.VirtualAccountOnboardingUM +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@Stable +@ModelScoped +internal class VirtualAccountOnboardingModel @Inject constructor( + paramsContainer: ParamsContainer, + override val dispatchers: CoroutineDispatcherProvider, + private val router: Router, + private val onboardingRepository: OnboardingRepository, +) : Model() { + + private val params = paramsContainer.require() + + val uiState: StateFlow + field = MutableStateFlow(VirtualAccountOnboardingUM.Loading(onBack = ::back)) + + init { + when (params) { + is VirtualAccountOnboardingComponent.Params.Deeplink -> validateDeeplinkAndShow(params.deeplink) + is VirtualAccountOnboardingComponent.Params.FromMain, + is VirtualAccountOnboardingComponent.Params.FromDetailsScreen, + -> showOnboarding() + } + } + + private fun validateDeeplinkAndShow(deeplink: String) { + modelScope.launch { + onboardingRepository.validateDeeplink(deeplink) + .onRight { isValid -> if (isValid) showOnboarding() else back() } + .onLeft { back() } + } + } + + private fun showOnboarding() { + uiState.update { + VirtualAccountOnboardingUM.Content( + onBack = ::back, + isLoading = false, + onGetCardClick = ::onGetCardClick, + onTermsClick = ::onTermsClick, + onPrivacyClick = ::onPrivacyClick, + ) + } + } + + private fun onTermsClick() { + // TODO([REDACTED_TASK_KEY]): open the provider Terms of Use link. + } + + private fun onPrivacyClick() { + // TODO([REDACTED_TASK_KEY]): open the provider Privacy Policy link. + } + + private fun onGetCardClick() { + modelScope.launch { + setLoading(isLoading = true) + delay(STUB_GET_CARD_DELAY_MS) + // TODO: create order and sign challenge [REDACTED_JIRA] + setLoading(isLoading = false) + } + } + + private fun setLoading(isLoading: Boolean) { + uiState.update { state -> + when (state) { + is VirtualAccountOnboardingUM.Content -> state.copy(isLoading = isLoading) + is VirtualAccountOnboardingUM.Loading -> state + } + } + } + + private fun back() { + router.pop() + } + + private companion object { + // TODO([REDACTED_TASK_KEY]): remove the stub delay once create-order + sign-challenge is implemented. + const val STUB_GET_CARD_DELAY_MS = 3000L + } +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingScreen.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingScreen.kt new file mode 100644 index 0000000000..537d302e29 --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingScreen.kt @@ -0,0 +1,213 @@ +package com.tangem.features.virtualaccount.onboarding.ui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withLink +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider +import androidx.compose.ui.unit.dp +import com.tangem.core.ui.ds.image.TangemIconUM +import com.tangem.core.ui.ds2.button.Close +import com.tangem.core.ui.ds2.button.TangemButton +import com.tangem.core.ui.extensions.annotatedReference +import com.tangem.core.ui.extensions.appendColored +import com.tangem.core.ui.extensions.resolveAnnotatedReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TangemThemePreviewRedesign +import com.tangem.features.virtualaccount.onboarding.impl.R + +private const val GRADIENT_TRANSPARENT_STOP = 0.45f +private const val GRADIENT_OPAQUE_STOP = 0.72f + +private const val TERMS_LINK_TAG = "VA_TERMS" +private const val PRIVACY_LINK_TAG = "VA_PRIVACY" + +@Composable +internal fun VirtualAccountOnboardingScreen(state: VirtualAccountOnboardingUM, modifier: Modifier = Modifier) { + Box( + modifier = modifier + .fillMaxSize() + .background(TangemTheme.colors3.bg.primary), + ) { + Image( + painter = painterResource(id = R.drawable.bg_virtual_account_onboarding), + contentDescription = null, + contentScale = ContentScale.Crop, + alignment = Alignment.TopCenter, + modifier = Modifier.fillMaxSize(), + ) + Box( + modifier = Modifier + .fillMaxSize() + .background( + Brush.verticalGradient( + colorStops = arrayOf( + 0f to TangemTheme.colors3.bg.primary.copy(alpha = 0f), + GRADIENT_TRANSPARENT_STOP to TangemTheme.colors3.bg.primary.copy(alpha = 0f), + GRADIENT_OPAQUE_STOP to TangemTheme.colors3.bg.primary, + 1f to TangemTheme.colors3.bg.primary, + ), + ), + ), + ) + + when (state) { + is VirtualAccountOnboardingUM.Loading -> Loading(modifier = Modifier.fillMaxSize()) + is VirtualAccountOnboardingUM.Content -> Content(state = state) + } + + TangemButton.Close( + modifier = Modifier + .align(Alignment.TopEnd) + .statusBarsPadding() + .padding(top = 4.dp, end = 16.dp), + onClick = state.onBack, + ) + } +} + +@Composable +private fun Loading(modifier: Modifier = Modifier) { + Box(modifier = modifier, contentAlignment = Alignment.Center) { + CircularProgressIndicator(color = TangemTheme.colors3.icon.primary) + } +} + +@Composable +private fun Content(state: VirtualAccountOnboardingUM.Content, modifier: Modifier = Modifier) { + Column( + modifier = modifier + .fillMaxSize() + .systemBarsPadding(), + ) { + Spacer(modifier = Modifier.weight(1f)) + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), + verticalArrangement = Arrangement.spacedBy(12.dp), + ) { + Text( + text = "Send USD from your bank. Receive USDC", + style = TangemTheme.typography3.heading.medium, + color = TangemTheme.colors3.text.primary, + ) + Text( + text = "A dedicated account with US banking details — no deposit or maintenance fees", + style = TangemTheme.typography3.subheading.medium, + color = TangemTheme.colors3.text.secondary, + ) + } + + TermsCard( + modifier = Modifier.padding(top = 24.dp, start = 8.dp, end = 8.dp), + state = state, + ) + } +} + +@Composable +private fun TermsCard(state: VirtualAccountOnboardingUM.Content, modifier: Modifier = Modifier) { + val shape = RoundedCornerShape(topStart = 24.dp, topEnd = 24.dp, bottomStart = 28.dp, bottomEnd = 28.dp) + Column( + modifier = modifier + .fillMaxWidth() + .clip(shape) + .background(TangemTheme.colors3.bg.opaque.primary) + .border(width = 1.dp, color = TangemTheme.colors3.border.secondary, shape = shape), + ) { + Text( + modifier = Modifier.padding(top = 12.dp, start = 16.dp, end = 16.dp), + text = buildTermsAndPolicy( + onTermsClick = state.onTermsClick, + onPrivacyClick = state.onPrivacyClick, + ).resolveAnnotatedReference(), + style = TangemTheme.typography3.caption.medium, + color = TangemTheme.colors3.text.secondary, + textAlign = TextAlign.Center, + ) + TangemButton( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp, vertical = 12.dp), + variant = TangemButton.Variant.Primary, + size = TangemButton.Size.X12, + text = stringReference("Open account"), + iconEnd = TangemIconUM.Icon(R.drawable.ic_tangem_24), + isLoading = state.isLoading, + onClick = state.onGetCardClick, + ) + } +} + +@Composable +private fun buildTermsAndPolicy(onTermsClick: () -> Unit, onPrivacyClick: () -> Unit) = annotatedReference { + val linkColor = TangemTheme.colors3.text.primary + append("By using service, you agree with provider ") + withLink( + link = LinkAnnotation.Clickable( + tag = TERMS_LINK_TAG, + linkInteractionListener = { onTermsClick() }, + ), + block = { appendColored(text = "Terms of Use", color = linkColor) }, + ) + append(" and ") + withLink( + link = LinkAnnotation.Clickable( + tag = PRIVACY_LINK_TAG, + linkInteractionListener = { onPrivacyClick() }, + ), + block = { appendColored(text = "Privacy Policy", color = linkColor) }, + ) +} + +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun VirtualAccountOnboardingScreenPreview( + @PreviewParameter(VirtualAccountOnboardingStateProvider::class) + state: VirtualAccountOnboardingUM, +) { + TangemThemePreviewRedesign { + VirtualAccountOnboardingScreen(state = state, modifier = Modifier.fillMaxSize()) + } +} + +private class VirtualAccountOnboardingStateProvider : + CollectionPreviewParameterProvider( + listOf( + VirtualAccountOnboardingUM.Loading(onBack = {}), + VirtualAccountOnboardingUM.Content( + onBack = {}, + isLoading = false, + onGetCardClick = {}, + onTermsClick = {}, + onPrivacyClick = {}, + ), + VirtualAccountOnboardingUM.Content( + onBack = {}, + isLoading = true, + onGetCardClick = {}, + onTermsClick = {}, + onPrivacyClick = {}, + ), + ), + ) \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingUM.kt b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingUM.kt new file mode 100644 index 0000000000..c5ab5b0a33 --- /dev/null +++ b/features/virtual-accounts/onboarding/impl/src/main/kotlin/com/tangem/features/virtualaccount/onboarding/ui/VirtualAccountOnboardingUM.kt @@ -0,0 +1,22 @@ +package com.tangem.features.virtualaccount.onboarding.ui + +import androidx.compose.runtime.Immutable + +/** + * UI model for the Virtual Account onboarding screen. + */ +@Immutable +internal sealed class VirtualAccountOnboardingUM { + + abstract val onBack: () -> Unit + + data class Loading(override val onBack: () -> Unit) : VirtualAccountOnboardingUM() + + data class Content( + override val onBack: () -> Unit, + val isLoading: Boolean, + val onGetCardClick: () -> Unit, + val onTermsClick: () -> Unit, + val onPrivacyClick: () -> Unit, + ) : VirtualAccountOnboardingUM() +} \ No newline at end of file diff --git a/features/virtual-accounts/onboarding/impl/src/main/res/drawable/bg_virtual_account_onboarding.webp b/features/virtual-accounts/onboarding/impl/src/main/res/drawable/bg_virtual_account_onboarding.webp new file mode 100644 index 0000000000000000000000000000000000000000..40030c0fd99abb4a820b1cc12414d0d2a6e0ed8e GIT binary patch literal 53770 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
o8#i|=PIKVXpk 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 SH3wiS4mt~UaJXuC00018KS4YI literal 0 HcmV?d00001