Post payment csat screen in gold (#7094)

* TP-32174 | Post Payment CSAT Screen in GOLD

* TP-34105 | csat analytics integration

* TP-34105 | integration changes

* TP-34105 | hide keyboard on touch
This commit is contained in:
Apoorv Nigam
2023-07-06 15:17:22 +05:30
committed by GitHub Enterprise
parent fa3585da4e
commit 76350b80b5
7 changed files with 100 additions and 7 deletions

View File

@@ -8411,6 +8411,11 @@ class NaviAnalytics private constructor() {
const val BLOCKER_SCREEN = "blocker_screen"
const val PL_APPLICATION_IN_PROGRESS = "PL_Application_In_Progress"
const val GOLD_VAULT_FTUE_EXIT_CLICK = "gold_vault_ftue_exit_click"
const val GOLD_VAULT_CSAT_BOTTOMSHEET_INIT = "gold_vault_csat_bottomsheet_init"
const val GOLD_VAULT_CSAT_BOTTOMSHEET_CLOSE = "gold_vault_csat_bottomsheet_close"
const val GOLD_VAULT_CSAT_BOTTOMSHEET_SUBMIT = "gold_vault_csat_bottomsheet_submit"
const val GOLD_VAULT_GPLAY_BOTTOMSHEET_INIT = "gold_vault_gplay_bottomsheet_init"
const val FEEDBACK = "feedback"
const val FINARKEIN = "finarkein"
const val PL_FINARKEIN_STATUS_API_SUCCESS = "pl_finarkein_status_api_success"
const val PL_FINARKEIN_STATUS_API_FAILURE = "pl_finarkein_status_api_failure"

View File

@@ -21,4 +21,7 @@ class DigitalGoldTransactionRepo @Inject constructor(private val retrofitService
suspend fun fetchDigitalGoldInvoiceDownloadUrl(transactionId: String) =
apiResponseCallback(retrofitService.fetchDigitalGoldInvoiceDownloadUrl(transactionId = transactionId))
suspend fun fetchDigitalGoldCSATResponse(featureName:String?, productId: String?) =
apiResponseCallback(retrofitService.fetchDigitalGoldCsatResponse(featureName = featureName, productId = productId))
}

View File

@@ -19,10 +19,15 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.navi.amc.utils.Constant.THOUSAND
import com.navi.base.model.CtaType
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.model.AnalyticsEvent
import com.navi.base.model.NaviClickAction
import com.navi.base.utils.BaseUtils
import com.navi.base.utils.isNotNull
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.common.csat.CsatBottomSheet
import com.navi.common.csat.CsatCompletionListener
import com.navi.common.csat.models.NetPromoterScoreRequest
import com.navi.base.utils.orTrue
import com.navi.common.downloader.DownloadUtil
import com.navi.common.model.ModuleNameV2
@@ -38,9 +43,12 @@ import com.navi.naviwidgets.actions.NaviWidgetClick
import com.navi.naviwidgets.adapters.NaviAdapter
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.models.response.CSATResponse
import com.navi.naviwidgets.models.response.CsatWidget
import com.navi.naviwidgets.models.NaviWidget
import com.navi.naviwidgets.viewholder.ViewHolderFactoryImpl
import com.naviapp.R
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.analytics.utils.NaviAnalytics.Companion.DIGITAL_GOLD_TRANSACTION_SCREEN
import com.naviapp.common.navigator.NaviDeepLinkNavigator
import com.naviapp.databinding.ActivityDigitalGoldTransactionBinding
@@ -50,18 +58,20 @@ import com.naviapp.home.model.WidgetResponse
import com.naviapp.utils.Constants
import com.naviapp.utils.GOLD_PAYMENT
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.net.URI
@AndroidEntryPoint
class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompletionListener {
private lateinit var binding: ActivityDigitalGoldTransactionBinding
private var playStoreInAppRatingHelper: PlayStoreInAppRatingHelper? = null
private val viewModel by lazy { ViewModelProvider(this).get(DigitalGoldTransactionVM::class.java) }
private val bottomSheetSharedVM by viewModels<WidgetSupportedBottomSheetSharedVM>()
private lateinit var widgetSupportedBottomSheet: WidgetsSupportedBottomSheet
private var csatFlowJob: Job? = null
private val naviAdapter = NaviAdapter(
widgetCallback = this,
factory = ViewHolderFactoryImpl(),
@@ -86,7 +96,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
showFullScreenError = true,
dialogOnBackPressed = { onBackPressed() }
)
fetchDigitalTransactionPageDetails()
fetchData()
}
override fun onBackPressed() {
@@ -128,11 +138,10 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
widgetResponse.contentWidget?.let { listOfWidgets ->
naviAdapter.setData(listOfWidgets)
}
lifecycleScope.launch {
if (intent.extras?.getBoolean(GOLD_PAYMENT) == true) {
delay(3 * THOUSAND)
requestInappRatingFlow()
}
csatFlowJob?.cancel()
csatFlowJob = lifecycleScope.launch {
delay(3 * THOUSAND)
startCsat()
}
}
viewModel.invoiceDownloadData.observeNonNull(this@DigitalGoldTransactionActivity) { invoiceDownloadData ->
@@ -179,6 +188,11 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
}
}
private fun fetchData() {
fetchDigitalTransactionPageDetails()
viewModel.fetchDigitalGoldCSATResponse(DG_TRANSACTION, null)
}
private fun fetchDigitalTransactionPageDetails() {
showLoader()
viewModel.fetchDigitalGoldTransactionDetails()
@@ -222,6 +236,39 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
safelyShowBottomSheet(widgetSupportedBottomSheet, WidgetsSupportedBottomSheet.TAG)
}
private fun startCsat() {
(viewModel.csatResponse.value?.content?.firstOrNull() as? CsatWidget)?.widgetData?.let { data ->
NaviTrackEvent.trackEvent(NaviAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_INIT)
val bottomSheet = CsatBottomSheet.getInstance(data)
bottomSheet.setListener(this)
safelyShowBottomSheet(bottomSheet, CsatBottomSheet.TAG)
}
}
override fun handleCsatCompletion(csatResponse: CSATResponse?) {
}
override fun handlePartialFill(
netPromoterScoreRequest: NetPromoterScoreRequest?,
analyticsEvent: AnalyticsEvent?
) {
NaviTrackEvent.trackEvent(
analyticsEvent?.name.orEmpty(),
analyticsEvent?.properties.orEmpty()
)
val rating = netPromoterScoreRequest?.ratingSelectedIndex?.toIntOrNull()
if (rating.isNotNull()) {
NaviTrackEvent.trackEvent(
NaviAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_SUBMIT,
mapOf(NaviAnalytics.FEEDBACK to rating.toString())
)
}
if ((netPromoterScoreRequest?.ratingSelectedIndex?.toIntOrNull() ?: 0) >= THREE) {
requestInappRatingFlow()
}
NaviTrackEvent.trackEvent(NaviAnalytics.GOLD_VAULT_CSAT_BOTTOMSHEET_CLOSE)
}
private fun requestInappRatingFlow() {
try {
playStoreInAppRatingHelper?.inAppRating(this)
@@ -240,4 +287,9 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback {
override val moduleName: ModuleNameV2 = ModuleNameV2.COMMON
companion object {
const val DG_TRANSACTION = "DG_TRANSACTION"
const val THREE = 3
}
}

View File

@@ -13,6 +13,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.navi.base.utils.isNull
import com.navi.common.viewmodel.BaseVM
import com.navi.naviwidgets.models.response.CSATResponse
import com.naviapp.digitalgold.repo.DigitalGoldTransactionRepo
import com.naviapp.home.model.InvoiceDownloadData
import com.naviapp.home.model.WidgetResponse
@@ -32,6 +33,10 @@ class DigitalGoldTransactionVM @Inject constructor(private val goldTransactionRe
val invoiceDownloadData: LiveData<InvoiceDownloadData>
get() = _invoiceDownloadData
private val _csatResponse = MutableLiveData<CSATResponse?>()
val csatResponse: LiveData<CSATResponse?>
get() = _csatResponse
fun fetchDigitalGoldTransactionDetails() {
coroutineScope.launch {
val response = goldTransactionRepo.fetchDigitalGoldTransactionDetails()
@@ -53,4 +58,13 @@ class DigitalGoldTransactionVM @Inject constructor(private val goldTransactionRe
}
}
}
fun fetchDigitalGoldCSATResponse(featureName: String?, productId: String?) {
coroutineScope.launch {
val response = goldTransactionRepo.fetchDigitalGoldCSATResponse(featureName, productId)
if (response.data != null && response.error == null && response.errors.isNullOrEmpty()) {
_csatResponse.value = response.data
}
}
}
}

View File

@@ -1666,6 +1666,12 @@ interface RetrofitService {
@Query("loanAccountNumber") loanAccountNumber: String?
): Response<GenericResponse<CSATResponse>>
@GET("/csat/{featureName}")
suspend fun fetchDigitalGoldCsatResponse(
@Path("featureName") featureName: String?,
@Query("productId") productId: String?
): Response<GenericResponse<CSATResponse>>
@POST("/csat/{featureName}/complete")
suspend fun fetchFeatureCompletionResponse(
@Path("featureName") featureName: String?,

View File

@@ -34,6 +34,7 @@ import com.navi.common.network.ApiConstants.NO_INTERNET
import com.navi.common.ui.fragment.BaseBottomSheet
import com.navi.common.utils.Constants
import com.navi.common.utils.Constants.DATA
import com.navi.common.utils.hideSoftKeyboardOnTouch
import com.navi.common.utils.observeNonNull
import com.navi.design.utils.dpToPx
import com.navi.design.utils.getNaviDrawable
@@ -108,6 +109,10 @@ class CsatBottomSheet : BaseBottomSheet(), OthersInputBoxListener {
}
}
binding.dataLayout.hideSoftKeyboardOnTouch()
binding.horizontalScrollview.hideSoftKeyboardOnTouch()
binding.gridReasons.hideSoftKeyboardOnTouch()
binding.tryAgainBtn.setOnClickListener {
binding.errorLayout.visibility = View.GONE
binding.fullScreenMessageContainer.visibility = View.GONE

View File

@@ -507,3 +507,11 @@ fun com.navi.payment.model.GenericErrorResponse.toCommonGenericErrorResponse():
apiUrl = apiUrl
)
}
fun View.hideSoftKeyboardOnTouch() {
this.setOnTouchListener { view, motionEvent ->
val imm = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
false
}
}