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:
committed by
GitHub Enterprise
parent
fa3585da4e
commit
76350b80b5
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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?,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user