From 8a8907e41501dc18f9aef74418b994a2e0321aa5 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 2 Mar 2022 19:29:13 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/common/analytics/AnalyticsHandler.kt | 15 +++++++++- .../analytics/AppsFlyerAnalyticsHandler.kt | 29 +++++++++++++++++++ .../analytics/FirebaseAnalyticsHandler.kt | 28 ++++++++++++++++++ .../analytics/GlobalAnalyticsHandler.kt | 13 +++++++++ .../tap/common/shop/TangemShopService.kt | 14 +++++++++ .../tap/features/shop/redux/ShopAction.kt | 2 ++ .../tap/features/shop/redux/ShopMiddleware.kt | 11 +++++++ .../tap/features/shop/redux/ShopReducer.kt | 1 + .../tap/features/shop/ui/ShopFragment.kt | 2 +- 9 files changed, 113 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt index caa5f0117b..424f06d9ce 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AnalyticsHandler.kt @@ -1,5 +1,6 @@ package com.tangem.tap.common.analytics +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError import com.tangem.tap.common.extensions.filterNotNull @@ -13,6 +14,11 @@ abstract class AnalyticsHandler { params: Map = emptyMap() ) + abstract fun triggerEvent( + event: String, + params: Map + ) + abstract fun logCardSdkError( error: TangemSdkError, actionToLog: Analytics.ActionToLog, @@ -71,6 +77,13 @@ abstract class AnalyticsHandler { ) } } - } + + fun logShopifyOrder(order: Storefront.Order) { + triggerEvent(getOrderEvent(), getOrderParams(order)) + } + + protected abstract fun getOrderEvent(): String + + protected abstract fun getOrderParams(order: Storefront.Order): Map } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt index 9692defe86..64beb11b4a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/AppsFlyerAnalyticsHandler.kt @@ -1,7 +1,10 @@ package com.tangem.tap.common.analytics import android.app.Application +import com.appsflyer.AFInAppEventParameterName +import com.appsflyer.AFInAppEventType import com.appsflyer.AppsFlyerLib +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -30,4 +33,30 @@ class AppsFlyerAnalyticsHandler(val context: Application): AnalyticsHandler() { //TODO } + override fun getOrderEvent(): String = AFInAppEventType.PURCHASE + + override fun getOrderParams(order: Storefront.Order): Map { + + val sku = order.lineItems.edges.firstOrNull()?.node?.variant?.sku ?: "unknown" + + val discountCode = + (order.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication)?.code + + val discountParams = if (discountCode != null ){ + mapOf(AFInAppEventParameterName.COUPON_CODE to discountCode) + } else { + mapOf() + } + + return mapOf( + AFInAppEventParameterName.CONTENT_ID to sku, + AFInAppEventParameterName.REVENUE to order.totalPriceV2.amount, + AFInAppEventParameterName.CURRENCY to order.currencyCode.name + ) + discountParams + } + + override fun triggerEvent(event: String, params: Map) { + AppsFlyerLib.getInstance().logEvent(context, event, params) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt index 106c07aae9..4e0371206a 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/FirebaseAnalyticsHandler.kt @@ -2,9 +2,11 @@ package com.tangem.tap.common.analytics import android.os.Bundle import androidx.core.os.bundleOf +import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.ktx.analytics import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.ktx.Firebase +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -57,4 +59,30 @@ object FirebaseAnalyticsHandler : AnalyticsHandler() { params.forEach { (key, value) -> FirebaseCrashlytics.getInstance().setCustomKey(key, value) } FirebaseCrashlytics.getInstance().recordException(error) } + + override fun getOrderEvent(): String = FirebaseAnalytics.Event.PURCHASE + + override fun getOrderParams(order: Storefront.Order): Map { + + val sku = order.lineItems.edges.firstOrNull()?.node?.variant?.sku ?: "unknown" + + val discountCode = + (order.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication)?.code + + val discountParams = if (discountCode != null ){ + mapOf(FirebaseAnalytics.Param.DISCOUNT to discountCode) + } else { + mapOf() + } + + return mapOf( + FirebaseAnalytics.Param.ITEM_ID to sku, + FirebaseAnalytics.Param.VALUE to order.totalPriceV2.amount, + FirebaseAnalytics.Param.CURRENCY to order.currencyCode.name + ) + discountParams + } + + override fun triggerEvent(event: String, params: Map) { + Firebase.analytics.logEvent(event, params.toBundle()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt index da77c37e05..b4824b60a3 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/GlobalAnalyticsHandler.kt @@ -1,6 +1,7 @@ package com.tangem.tap.common.analytics import android.app.Application +import com.shopify.buy3.Storefront import com.tangem.common.card.Card import com.tangem.common.core.TangemSdkError @@ -15,6 +16,10 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : analyticsHandlers.forEach { it.triggerEvent(event, card, blockchain) } } + override fun triggerEvent(event: String, params: Map) { + analyticsHandlers.forEach { it.triggerEvent(event, params) } + } + override fun logCardSdkError( error: TangemSdkError, actionToLog: Analytics.ActionToLog, @@ -28,6 +33,14 @@ class GlobalAnalyticsHandler(val analyticsHandlers: List) : analyticsHandlers.forEach { it.logError(error, params) } } + override fun getOrderEvent(): String { + return "" + } + + override fun getOrderParams(order: Storefront.Order): Map { + return emptyMap() + } + companion object { fun createDefaultAnalyticHandlers(context: Application): GlobalAnalyticsHandler { return GlobalAnalyticsHandler( diff --git a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt index d428a9d197..3da94dc568 100644 --- a/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt +++ b/app/src/main/java/com/tangem/tap/common/shop/TangemShopService.kt @@ -4,9 +4,11 @@ import android.app.Application import android.content.Intent import com.google.android.gms.wallet.PaymentData import com.shopify.buy3.Storefront +import com.tangem.tap.common.analytics.AnalyticsHandler import com.tangem.tap.common.shop.data.ProductType import com.tangem.tap.common.shop.data.TangemProduct import com.tangem.tap.common.shop.data.TotalSum +import com.tangem.tap.common.shop.shopify.ShopifyService import com.tangem.tap.common.shop.shopify.ShopifyShop import com.tangem.tap.common.shop.shopify.data.CheckoutItem import kotlinx.coroutines.async @@ -197,6 +199,18 @@ class TangemShopService(application: Application, shopifyShop: ShopifyShop) { return checkouts[productType]!!.webUrl } + suspend fun waitForCheckout( + productType: ProductType, + analyticsHandler: AnalyticsHandler? + ) { + val result = shopifyService.checkout(true, checkouts[productType]!!.id) + result.onSuccess { + if (it.order != null) { + analyticsHandler?.logShopifyOrder(order = it.order) + } + } + } + companion object { const val TANGEM_WALLET_2_CARDS_SKU = "TG115x2" const val TANGEM_WALLET_3_CARDS_SKU = "TG115x3" diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt index 9f7e7937b4..500cc39285 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopAction.kt @@ -34,5 +34,7 @@ sealed class ShopAction : Action { data class SelectProduct(val productType: ProductType) : ShopAction() + object FinishSuccessfulOrder : ShopAction() + object ResetState : ShopAction() } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt index 605d5fe9d2..464a99de96 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopMiddleware.kt @@ -110,7 +110,18 @@ private fun handle(action: Action) { } ShopAction.StartWebCheckout -> { store.dispatchOpenUrl(shopService.getCheckoutUrl(shopState.selectedProduct)) + store.dispatch(ShopAction.FinishSuccessfulOrder) } + + is ShopAction.FinishSuccessfulOrder -> { + scope.launch { + shopService.waitForCheckout( + productType = shopState.selectedProduct, + analyticsHandler = store.state.globalState.analyticsHandlers + ) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt index 8d4b4ff2a7..ee12f53109 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/redux/ShopReducer.kt @@ -63,6 +63,7 @@ private fun internalReduce(action: Action, state: ShopState): ShopState { ShopAction.BuyWithGooglePay.UserCancelled -> { state } + ShopAction.FinishSuccessfulOrder -> state ShopAction.ResetState -> ShopState() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt index b8ce7afd51..96e2c8619c 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt @@ -137,7 +137,7 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) - imvThird?.show(show) + imvThird.show(show) } }) }