From feb5b7d3fb31f493e4b311bdb2b297e29c1450fb Mon Sep 17 00:00:00 2001 From: Kshitij Pramod Ghongadi Date: Thu, 28 Mar 2024 12:12:34 +0530 Subject: [PATCH] TP-61032 | RN Quote PageTesting fixes (#10203) Co-authored-by: Raaj Gopal --- .../java/com/naviapp/app/NaviApplication.kt | 2 +- .../insurance/health/viewmodel/QuoteVM.kt | 2 + .../models/response/QuoteGenericResponse.kt | 1 + .../NaviInsuranceDeeplinkNavigator.kt | 4 +- .../insurance/quoteredesign/QuoteActivity.kt | 21 ++++++++ .../fragments/PolicyAddonFragment.kt | 5 ++ components/StyledLottie.tsx | 50 ------------------- components/reusable/cta-button/CtaButton.tsx | 2 +- .../widgets/HeaderLottieAnimationWidget.tsx | 2 +- components/widgets/HeaderWithAssetsWidget.tsx | 16 +++--- components/widgets/TitleWithAssetsWidget.tsx | 8 +-- .../FooterWithCardWidget.tsx | 34 +++++++++++-- .../widgets/styled-lottie/StyledLottie.tsx | 8 ++- 13 files changed, 83 insertions(+), 72 deletions(-) delete mode 100644 components/StyledLottie.tsx diff --git a/android/app/src/main/java/com/naviapp/app/NaviApplication.kt b/android/app/src/main/java/com/naviapp/app/NaviApplication.kt index 0728c63f81..87ffdc75cd 100644 --- a/android/app/src/main/java/com/naviapp/app/NaviApplication.kt +++ b/android/app/src/main/java/com/naviapp/app/NaviApplication.kt @@ -99,7 +99,7 @@ open class NaviApplication : MultiDexApplication(), Application.ActivityLifecycl private val applicationScope = CoroutineScope(Dispatchers.IO + rnJob) override val reactNativeHost = object : DefaultReactNativeHost(this) { - override fun getUseDeveloperSupport() = false + override fun getUseDeveloperSupport() = BuildConfig.DEBUG override fun getPackages(): List { val packages = PackageList(this).packages.toMutableList() packages.add(NativePackage()) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/health/viewmodel/QuoteVM.kt b/android/navi-insurance/src/main/java/com/navi/insurance/health/viewmodel/QuoteVM.kt index 90b0209211..e6820224d2 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/health/viewmodel/QuoteVM.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/health/viewmodel/QuoteVM.kt @@ -165,6 +165,8 @@ constructor(private val repository: QuoteRepository, actionHandler: ActionHandle get() = _isQuotePageScrollingDown val refreshQuotePage = SingleLiveEvent() + var ctaData: CtaData? = null + fun turnOffLaunchFlag(key: String) { _launchBottomSheet.value?.set(key, false) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/models/response/QuoteGenericResponse.kt b/android/navi-insurance/src/main/java/com/navi/insurance/models/response/QuoteGenericResponse.kt index 0b4d4d234a..265b12f179 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/models/response/QuoteGenericResponse.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/models/response/QuoteGenericResponse.kt @@ -34,6 +34,7 @@ data class QuoteGenericResponse( @SerializedName("callbackData") val callbackData: CallbackData? = null, @SerializedName("floatingButtonData") val floatingButtonData: FloatingButtonData? = null, + @SerializedName("backCta") val backCta: CtaData? = null ) @Parcelize diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/navigator/NaviInsuranceDeeplinkNavigator.kt b/android/navi-insurance/src/main/java/com/navi/insurance/navigator/NaviInsuranceDeeplinkNavigator.kt index 7f7b9a09f3..864b93733d 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/navigator/NaviInsuranceDeeplinkNavigator.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/navigator/NaviInsuranceDeeplinkNavigator.kt @@ -422,7 +422,9 @@ object NaviInsuranceDeeplinkNavigator { ) { Intent(activity, QuoteActivity::class.java) } else null - intent?.action = deepLink + intent?.action = + ctaData.parameters?.find { it.key == "actionUrl" }?.value + ?: deepLink intent?.putExtra(FROM_DEEP_LINK, true) } catch (e: Exception) { Timber.e(e) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/QuoteActivity.kt b/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/QuoteActivity.kt index 4b66f88463..0df9ccfbf7 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/QuoteActivity.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/QuoteActivity.kt @@ -34,6 +34,7 @@ import com.navi.base.sharedpref.CommonPrefConstants.USER_EXTERNAL_ID import com.navi.base.sharedpref.PreferenceManager import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse +import com.navi.base.utils.orTrue import com.navi.common.callback.RequestToCallbackHandler import com.navi.common.juspay.HyperServicesHolder import com.navi.common.model.ModuleName @@ -153,6 +154,7 @@ class QuoteActivity : val insuranceAnalyticsHandler = InsuranceAnalyticsHandler() private var isDeeplinkNavigationDone = false private val paymentScreenAnalytics by lazy { NaviPaymentScreenAnalytics.naviAnalytics.PaymentMethodAnalytics() } + public var backCta: CtaData? = null @Inject lateinit var callbackActionButton: CallbackActionButton @@ -434,11 +436,30 @@ class QuoteActivity : } ) } + } else if(backCta != null){ + sendAnalyticsEvent(backCta) + NaviInsuranceDeeplinkNavigator.navigate( + this, + backCta!!, + finish = backCta?.finish.orTrue(), + clearTask = backCta?.clearTask.orFalse() + ) + backCta = null + } else { super.onBackPressed() } } + private fun sendAnalyticsEvent(ctaData: CtaData?) { + ctaData?.analyticsEventProperties?.name?.let { analyticsEventName -> + NaviInsuranceAnalytics.postAnalyticsEvent( + eventName = analyticsEventName, + eventProperties = backCta?.analyticsEventProperties?.properties + ) + } + } + private fun shouldShowSurveyBottomSheet(): Boolean { val isExperimentEnabled = quoteViewModel.quoteResponse.value diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/fragments/PolicyAddonFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/fragments/PolicyAddonFragment.kt index 0907595dda..09becf7a3b 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/fragments/PolicyAddonFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/quoteredesign/fragments/PolicyAddonFragment.kt @@ -46,6 +46,7 @@ import com.navi.naviwidgets.adapters.NaviAdapter import com.navi.naviwidgets.callbacks.WidgetCallback import com.navi.design.utils.isValidHexColor import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator +import com.navi.insurance.quoteredesign.QuoteActivity import com.navi.naviwidgets.extensions.FloatingButtonOverlay import com.navi.naviwidgets.models.GenericWidgetDataInfo import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl @@ -61,6 +62,7 @@ class PolicyAddonFragment : BaseFragment(), WidgetCallback, View.OnClickListener private val FIRST_ITEM = 0 private var apiErrorHandler: ApiErrorHandler? = null private var analyticsEventHandler: AnalyticsEventHandler? = null + private var parentActivity: QuoteActivity? = null @Inject lateinit var insuranceAnalyticsHandler: InsuranceAnalyticsHandler @@ -76,6 +78,7 @@ class PolicyAddonFragment : BaseFragment(), WidgetCallback, View.OnClickListener container, false ) + parentActivity = activity as? QuoteActivity startShimmerLoading() initObservers() initListeners() @@ -167,6 +170,8 @@ class PolicyAddonFragment : BaseFragment(), WidgetCallback, View.OnClickListener sharedViewModel.addOnResponse.observe(viewLifecycleOwner) { widgetGenericResponse -> widgetGenericResponse?.let { stopShimmerLoading() + sharedViewModel.ctaData = it.backCta + if (parentActivity != null) parentActivity?.backCta = sharedViewModel.ctaData it.contentWidget?.let { widgetConfigList -> if (binding.addonRv.adapter == null) { @Suppress("UNCHECKED_CAST") diff --git a/components/StyledLottie.tsx b/components/StyledLottie.tsx deleted file mode 100644 index c2be6c76e1..0000000000 --- a/components/StyledLottie.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React, { useRef, useEffect } from "react"; -import LottieView from "lottie-react-native"; -import { LottieFieldData } from "../App/common/interface/widgets/widgetData/TitleWidgetData"; -import { StyleSheet, TouchableOpacity } from "react-native"; -import { CtaData } from "../App/common/interface"; - -export const StyledLottie = ({ - lottieFieldData, - handleClick, -}: { - lottieFieldData: LottieFieldData; - handleClick?: (ctaData: CtaData) => void; -}) => { - const animationRef = useRef(null); - - useEffect(() => { - setTimeout(() => { - animationRef.current?.play(); - }, lottieFieldData?.delayAnimationBy ?? 0); - }, []); - - return ( - { - lottieFieldData.cta && handleClick && handleClick(lottieFieldData.cta); - }} - style={styles.touchableOpacity} - activeOpacity={1} - > - - - ); -}; - -const styles = StyleSheet.create({ - lottie: { - flex: 1, - width: "100%", - height: "100%", - }, - touchableOpacity: { - flex: 1, - }, -}); diff --git a/components/reusable/cta-button/CtaButton.tsx b/components/reusable/cta-button/CtaButton.tsx index 350aed9aae..9e28fde051 100644 --- a/components/reusable/cta-button/CtaButton.tsx +++ b/components/reusable/cta-button/CtaButton.tsx @@ -2,7 +2,7 @@ import { TouchableHighlight, ViewStyle } from "react-native"; import { Lottie } from "../../../App/common/constants/StringConstant"; import { ButtonState } from "../../../App/common/interface/widgets/widgetData/FooterWithCardWidgetData"; import { LottieFieldData } from "../../../App/common/interface/widgets/widgetData/TitleWidgetData"; -import { StyledLottie } from "../../StyledLottie"; +import { StyledLottie } from "../../widgets/styled-lottie/StyledLottie"; import styles from "./CtaButtonStyle"; const CtaButton = ({ diff --git a/components/widgets/HeaderLottieAnimationWidget.tsx b/components/widgets/HeaderLottieAnimationWidget.tsx index bbd559145e..aafc729c9d 100644 --- a/components/widgets/HeaderLottieAnimationWidget.tsx +++ b/components/widgets/HeaderLottieAnimationWidget.tsx @@ -5,7 +5,7 @@ import { NaviLinearGradient } from "../../App/common/hooks/useGradient"; import { CtaData } from "../../App/common/interface"; import { HeaderLottieAnimationWidgetData } from "../../App/common/interface/widgets/widgetData/HeaderLottieAnimationWidgetData"; import Colors from "../../assets/colors/colors"; -import { StyledLottie } from "../StyledLottie"; +import { StyledLottie } from "./styled-lottie/StyledLottie"; import { StyledText } from "./styled-text/StyledText"; const HeaderLottieAnimationWidget = ({ diff --git a/components/widgets/HeaderWithAssetsWidget.tsx b/components/widgets/HeaderWithAssetsWidget.tsx index 3171c200a7..714c0daeb6 100644 --- a/components/widgets/HeaderWithAssetsWidget.tsx +++ b/components/widgets/HeaderWithAssetsWidget.tsx @@ -1,18 +1,18 @@ +import { useEffect } from "react"; import { + BackHandler, + Image, + StyleSheet, + TouchableOpacity, View, ViewStyle, - StyleSheet, - BackHandler, - TouchableOpacity, - Image, } from "react-native"; import { GenericActionPayload } from "../../App/common/actions/GenericAction"; -import { StyledImage } from "../StyledImage"; -import { StyledLottie } from "../StyledLottie"; -import { HeaderWithAssetsWidgetData } from "../../App/common/interface/widgets/widgetData/HeaderWithAssetsWidgetData"; import { CtaData } from "../../App/common/interface"; +import { HeaderWithAssetsWidgetData } from "../../App/common/interface/widgets/widgetData/HeaderWithAssetsWidgetData"; +import { StyledImage } from "../StyledImage"; +import { StyledLottie } from "./styled-lottie/StyledLottie"; import { StyledText } from "./styled-text/StyledText"; -import { useEffect } from "react"; const HeaderWithAssetsWidget = ({ widgetData, diff --git a/components/widgets/TitleWithAssetsWidget.tsx b/components/widgets/TitleWithAssetsWidget.tsx index 7a8b7e1e8e..c0b6c3998d 100644 --- a/components/widgets/TitleWithAssetsWidget.tsx +++ b/components/widgets/TitleWithAssetsWidget.tsx @@ -1,10 +1,10 @@ -import { View, ViewStyle, StyleSheet, TouchableOpacity } from "react-native"; +import { StyleSheet, TouchableOpacity, View, ViewStyle } from "react-native"; import { GenericActionPayload } from "../../App/common/actions/GenericAction"; -import { StyledImage } from "../StyledImage"; -import { StyledLottie } from "../StyledLottie"; -import { TitleWithAssetsWidgetData } from "../../App/common/interface/widgets/widgetData/TitleWithAssetsWidgetData"; import { CtaData } from "../../App/common/interface"; +import { TitleWithAssetsWidgetData } from "../../App/common/interface/widgets/widgetData/TitleWithAssetsWidgetData"; import Colors from "../../assets/colors/colors"; +import { StyledImage } from "../StyledImage"; +import { StyledLottie } from "./styled-lottie/StyledLottie"; import { StyledText } from "./styled-text/StyledText"; const TitleWithAssetsWidget = ({ diff --git a/components/widgets/footer-with-card-widget/FooterWithCardWidget.tsx b/components/widgets/footer-with-card-widget/FooterWithCardWidget.tsx index 9e49363ca7..1e5814365c 100644 --- a/components/widgets/footer-with-card-widget/FooterWithCardWidget.tsx +++ b/components/widgets/footer-with-card-widget/FooterWithCardWidget.tsx @@ -7,7 +7,8 @@ import { } from "react-native-gesture-handler"; import { commonStyles } from "../../../App/Container/Navi-Insurance/Styles"; import { GenericActionPayload } from "../../../App/common/actions/GenericAction"; -import { CtaData } from "../../../App/common/interface"; +import { sendAsAnalyticsEvent } from "../../../App/common/hooks/useAnalyticsEvent"; +import { AnalyticsEvent, CtaData } from "../../../App/common/interface"; import { ButtonState, CardInfo, @@ -65,7 +66,17 @@ const FooterWithCardWidget = ({ }; const throttledHandleActions = useCallback( - _.throttle(() => handleActions(null, widgetData?.action), 700, { + _.throttle( + ({ + action, + actionEvent, + }: { + action: GenericActionPayload | undefined; + actionEvent: AnalyticsEvent | undefined; + }) => { + if (!!actionEvent) sendAsAnalyticsEvent(actionEvent); + handleActions(null, action); + }, 700, { leading: true, trailing: false, }), @@ -81,7 +92,15 @@ const FooterWithCardWidget = ({ {widgetData?.cardInfo?.title?.text && widgetData?.cardInfo?.rightTitle?.text && ( - + { + throttledHandleActions({ + action: widgetData?.action, + actionEvent: + widgetData?.cardAction?.metaData?.at(0) + ?.analyticsEventProperties, + }); + } + }> - + { + throttledHandleActions({ + action: widgetData?.action, + actionEvent: + widgetData?.titleAction?.metaData?.at(0) + ?.analyticsEventProperties, + }); + }}> (null); useEffect(() => { - animationRef.current?.play(); - }, []); + const timeoutId = setTimeout(() => { + animationRef.current?.play(); + }, lottieFieldData?.delayAnimationBy ?? 0); + + return () => clearTimeout(timeoutId); + }, [lottieFieldData]); return (