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 26a1ac0ce5..b16393478e 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 @@ -8,14 +8,22 @@ sealed class DeepLinkRoute { override val host: String = "onramp" } - data object Sell : DeepLinkRoute() { + data object SellRedirect : DeepLinkRoute() { override val host: String = "redirect_sell" } - data object Buy : DeepLinkRoute() { + data object Sell : DeepLinkRoute() { + override val host: String = "sell" + } + + data object BuyRedirect : DeepLinkRoute() { override val host: String = "redirect" } + data object Buy : DeepLinkRoute() { + override val host: String = "buy" + } + data object Referral : DeepLinkRoute() { override val host: String = "referral" } @@ -39,6 +47,10 @@ sealed class DeepLinkRoute { data object MarketTokenDetail : DeepLinkRoute() { override val host: String = "token_chart" } + + data object Swap : DeepLinkRoute() { + override val host: String = "swap" + } } enum class DeepLinkScheme(val scheme: String) { diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyDeepLinkHandler.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyDeepLinkHandler.kt index 75c2d61f29..13e8deb82e 100644 --- a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyDeepLinkHandler.kt +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyDeepLinkHandler.kt @@ -1,10 +1,8 @@ package com.tangem.features.onramp.deeplink -import kotlinx.coroutines.CoroutineScope - interface BuyDeepLinkHandler { interface Factory { - fun create(coroutineScope: CoroutineScope): BuyDeepLinkHandler + fun create(): BuyDeepLinkHandler } } \ No newline at end of file diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt new file mode 100644 index 0000000000..da300b5cc2 --- /dev/null +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/BuyRedirectDeepLinkHandler.kt @@ -0,0 +1,10 @@ +package com.tangem.features.onramp.deeplink + +import kotlinx.coroutines.CoroutineScope + +interface BuyRedirectDeepLinkHandler { + + interface Factory { + fun create(coroutineScope: CoroutineScope): BuyRedirectDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SellDeepLinkHandler.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SellDeepLinkHandler.kt new file mode 100644 index 0000000000..086f028f40 --- /dev/null +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SellDeepLinkHandler.kt @@ -0,0 +1,8 @@ +package com.tangem.features.onramp.deeplink + +interface SellDeepLinkHandler { + + interface Factory { + fun create(): SellDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SwapDeepLinkHandler.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SwapDeepLinkHandler.kt new file mode 100644 index 0000000000..dce01989cc --- /dev/null +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/deeplink/SwapDeepLinkHandler.kt @@ -0,0 +1,8 @@ +package com.tangem.features.onramp.deeplink + +interface SwapDeepLinkHandler { + + interface Factory { + fun create(): SwapDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt new file mode 100644 index 0000000000..3e3f70ce4a --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultBuyRedirectDeepLinkHandler.kt @@ -0,0 +1,49 @@ +package com.tangem.features.onramp.deeplink + +import arrow.core.getOrElse +import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.domain.tokens.GetCryptoCurrencyUseCase +import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent +import com.tangem.domain.wallets.models.isMultiCurrency +import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase +import com.tangem.features.onramp.OnrampFeatureToggles +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import timber.log.Timber + +internal class DefaultBuyRedirectDeepLinkHandler @AssistedInject constructor( + @Assisted scope: CoroutineScope, + onrampFeatureToggles: OnrampFeatureToggles, + getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, + getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase, + analyticsEventHandler: AnalyticsEventHandler, +) : BuyRedirectDeepLinkHandler { + + init { + // It is okay here, we are navigating from outside, and there is no other way to getting UserWallet + getSelectedWalletSyncUseCase().fold( + ifLeft = { + Timber.e("Error on getting user wallet: $it") + }, + ifRight = { userWallet -> + if (!onrampFeatureToggles.isFeatureEnabled && !userWallet.isMultiCurrency) { + scope.launch { + val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrElse { + Timber.e("Error on getting cryptoCurrency: $it") + return@launch + } + analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol)) + } + } + }, + ) + } + + @AssistedFactory + interface Factory : BuyRedirectDeepLinkHandler.Factory { + override fun create(coroutineScope: CoroutineScope): DefaultBuyRedirectDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt new file mode 100644 index 0000000000..ee38f9501a --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSellDeepLinkHandler.kt @@ -0,0 +1,31 @@ +package com.tangem.features.onramp.deeplink + +import com.tangem.common.routing.AppRoute +import com.tangem.common.routing.AppRouter +import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import timber.log.Timber + +internal class DefaultSellDeepLinkHandler @AssistedInject constructor( + router: AppRouter, + getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, +) : SellDeepLinkHandler { + + init { + // It is okay here, we are navigating from outside, and there is no other way to getting UserWallet + getSelectedWalletSyncUseCase().fold( + ifLeft = { + Timber.e("Error on getting user wallet: $it") + }, + ifRight = { userWallet -> + router.push(AppRoute.SellCrypto(userWallet.walletId)) + }, + ) + } + + @AssistedFactory + interface Factory : SellDeepLinkHandler.Factory { + override fun create(): DefaultSellDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt new file mode 100644 index 0000000000..7fff8ef48c --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/DefaultSwapDeepLinkHandler.kt @@ -0,0 +1,31 @@ +package com.tangem.features.onramp.deeplink + +import com.tangem.common.routing.AppRoute +import com.tangem.common.routing.AppRouter +import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import timber.log.Timber + +internal class DefaultSwapDeepLinkHandler @AssistedInject constructor( + router: AppRouter, + getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, +) : SwapDeepLinkHandler { + + init { + // It is okay here, we are navigating from outside, and there is no other way to getting UserWallet + getSelectedWalletSyncUseCase().fold( + ifLeft = { + Timber.e("Error on getting user wallet: $it") + }, + ifRight = { userWallet -> + router.push(AppRoute.SwapCrypto(userWallet.walletId)) + }, + ) + } + + @AssistedFactory + interface Factory : SwapDeepLinkHandler.Factory { + override fun create(): DefaultSwapDeepLinkHandler + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt index 418baeccc3..9b44b6bd3d 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/deeplink/di/OnrampDeeplinkModule.kt @@ -19,7 +19,21 @@ internal interface OnrampDeeplinkModule { @Singleton fun bindOnrampDeepLinkHandlerFactory(impl: DefaultOnrampDeepLinkHandler.Factory): OnrampDeepLinkHandler.Factory + @Binds + @Singleton + fun bindBuyRedirectDeepLinkHandler( + impl: DefaultBuyRedirectDeepLinkHandler.Factory, + ): BuyRedirectDeepLinkHandler.Factory + @Binds @Singleton fun bindBuyDeepLinkHandler(impl: DefaultBuyDeepLinkHandler.Factory): BuyDeepLinkHandler.Factory + + @Binds + @Singleton + fun bindSellDeepLinkHandler(impl: DefaultSellDeepLinkHandler.Factory): SellDeepLinkHandler.Factory + + @Binds + @Singleton + fun bindSwapDeepLinkHandler(impl: DefaultSwapDeepLinkHandler.Factory): SwapDeepLinkHandler.Factory } \ No newline at end of file diff --git a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellDeepLinkHandler.kt b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellRedirectDeepLinkHandler.kt similarity index 67% rename from features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellDeepLinkHandler.kt rename to features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellRedirectDeepLinkHandler.kt index 32d263693a..a9d945790b 100644 --- a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellDeepLinkHandler.kt +++ b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/deeplink/SellRedirectDeepLinkHandler.kt @@ -2,9 +2,9 @@ package com.tangem.features.send.v2.api.deeplink import kotlinx.coroutines.CoroutineScope -interface SellDeepLinkHandler { +interface SellRedirectDeepLinkHandler { interface Factory { - fun create(coroutineScope: CoroutineScope, queryParams: Map): SellDeepLinkHandler + fun create(coroutineScope: CoroutineScope, queryParams: Map): SellRedirectDeepLinkHandler } } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellDeepLinkHandler.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt similarity index 91% rename from features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellDeepLinkHandler.kt rename to features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt index 49aeba8204..5320f622ed 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellDeepLinkHandler.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/DefaultSellRedirectDeepLinkHandler.kt @@ -5,7 +5,7 @@ import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter import com.tangem.domain.tokens.GetCryptoCurrencyUseCase import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase -import com.tangem.features.send.v2.api.deeplink.SellDeepLinkHandler +import com.tangem.features.send.v2.api.deeplink.SellRedirectDeepLinkHandler import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -14,13 +14,13 @@ import kotlinx.coroutines.launch import timber.log.Timber @Suppress("ComplexCondition") -internal class DefaultSellDeepLinkHandler @AssistedInject constructor( +internal class DefaultSellRedirectDeepLinkHandler @AssistedInject constructor( @Assisted scope: CoroutineScope, @Assisted queryParams: Map, appRouter: AppRouter, getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase, -) : SellDeepLinkHandler { +) : SellRedirectDeepLinkHandler { init { val currencyId = queryParams[CURRENCY_ID_KEY] @@ -70,11 +70,11 @@ internal class DefaultSellDeepLinkHandler @AssistedInject constructor( } @AssistedFactory - interface Factory : SellDeepLinkHandler.Factory { + interface Factory : SellRedirectDeepLinkHandler.Factory { override fun create( coroutineScope: CoroutineScope, queryParams: Map, - ): DefaultSellDeepLinkHandler + ): DefaultSellRedirectDeepLinkHandler } private companion object { diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/di/SendDeepLinkModule.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/di/SendDeepLinkModule.kt index 6cd2bca80d..4187cff72b 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/di/SendDeepLinkModule.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/deeplink/di/SendDeepLinkModule.kt @@ -1,7 +1,7 @@ package com.tangem.features.send.v2.deeplink.di -import com.tangem.features.send.v2.api.deeplink.SellDeepLinkHandler -import com.tangem.features.send.v2.deeplink.DefaultSellDeepLinkHandler +import com.tangem.features.send.v2.api.deeplink.SellRedirectDeepLinkHandler +import com.tangem.features.send.v2.deeplink.DefaultSellRedirectDeepLinkHandler import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -14,5 +14,5 @@ internal interface SendDeepLinkModule { @Binds @Singleton - fun bindFactory(impl: DefaultSellDeepLinkHandler.Factory): SellDeepLinkHandler.Factory + fun bindFactory(impl: DefaultSellRedirectDeepLinkHandler.Factory): SellRedirectDeepLinkHandler.Factory } \ No newline at end of file