NTP-24573| Sidharth Bamba | Feature/saving bill error handling (#14714)

This commit is contained in:
Sidharth Bamba
2025-01-29 15:23:23 +05:30
committed by GitHub
parent 8a0a492f21
commit a7299d1d25
12 changed files with 123 additions and 9 deletions

View File

@@ -220,3 +220,6 @@ const val TXN_AMOUNT = "TXN_AMOUNT"
const val BAU = "BAU"
const val ALL = "ALL"
const val APP_VERSION_CODE = "APP_VERSION"
// url
const val SAVED_BILL_URL_PREFIX = "billpay-gateway/v1/billpay/bills/saved"

View File

@@ -183,4 +183,14 @@ constructor(
)
)
}
suspend fun getSavedBillsDetailsOnError(
path: String,
metricInfo: MetricInfo<RepoResult<Any?>>,
): RepoResult<Any?> {
return apiResponseCallback(
naviBbpsRetrofitService.savedBills(path),
metricInfo = metricInfo,
)
}
}

View File

@@ -33,6 +33,7 @@ import com.navi.bbps.common.CATEGORY_ID_MOBILE_PREPAID
import com.navi.bbps.common.CATEGORY_ID_WATER
import com.navi.bbps.common.MOBILE_NUMBER_LENGTH
import com.navi.bbps.common.NAVI_BBPS_TSTORE_ORDER_DETAILS_REDIRECTION
import com.navi.bbps.common.SAVED_BILL_URL_PREFIX
import com.navi.bbps.common.theme.NaviBbpsColor
import com.navi.bbps.customHide
import com.navi.common.checkmate.model.MetricInfo
@@ -229,4 +230,8 @@ object NaviBbpsCommonUtils {
fun isDiscountAmountGreaterThanZero(discountAmount: String): Boolean {
return discountAmount.toDoubleOrNull().orZero() > 0.0
}
fun isUrlPathValidForSavedBills(urlPath: String): Boolean {
return urlPath.isNotEmpty() && urlPath.startsWith(SAVED_BILL_URL_PREFIX)
}
}

View File

@@ -90,6 +90,7 @@ constructor(
private val naviBbpsSessionHelper: NaviBbpsSessionHelper,
private val getABTestingExperimentUseCase: GetABTestingExperimentUseCase,
private val litmusExperimentsUseCase: LitmusExperimentsUseCase,
private val naviBbpsCommonRepository: BbpsCommonRepository,
) :
NaviBbpsBaseVM(
naviBbpsVmData = NaviBbpsVmData(screen = NaviBbpsScreen.NAVI_BBPS_CUSTOMER_DATA_INPUT)
@@ -672,4 +673,11 @@ constructor(
}
}
}
suspend fun onSavedBillCtaClicked(apiUrl: String) {
naviBbpsCommonRepository.getSavedBillsDetailsOnError(
path = apiUrl,
metricInfo = getBbpsMetricInfo(screenName = naviBbpsVmData.screen.screenName),
)
}
}

View File

@@ -72,6 +72,7 @@ import com.navi.bbps.common.NAVI_HOME
import com.navi.bbps.common.NaviBbpsAnalytics
import com.navi.bbps.common.RCBP_CATEGORY
import com.navi.bbps.common.SCROLL_OFFSET_FOR_TITLE_IN_HEADER
import com.navi.bbps.common.model.view.NaviBbpsButtonAction
import com.navi.bbps.common.theme.NaviBbpsColor
import com.navi.bbps.common.ui.BbpsBillerConsentView
import com.navi.bbps.common.ui.BbpsCircleImage
@@ -83,6 +84,7 @@ import com.navi.bbps.common.ui.NaviBbpsHeader
import com.navi.bbps.common.ui.NaviBbpsModalBottomSheetLayout
import com.navi.bbps.common.ui.OfferRolodexWithShimmer
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isOfferExperimentEnabled
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isUrlPathValidForSavedBills
import com.navi.bbps.customHide
import com.navi.bbps.entry.NaviBbpsActivity
import com.navi.bbps.entry.NaviBbpsRouter
@@ -200,6 +202,22 @@ fun CustomerDataInputScreen(
val scope = rememberCoroutineScope()
LaunchedEffect(Unit) {
naviBbpsActivity.errorEventHandler.bbpsErrorCtaClickEvent.collectLatest { event ->
// In case of bill fetch error, go back to previous screen
if (
event.clickedButtonConfig.action is NaviBbpsButtonAction.Redirect &&
isUrlPathValidForSavedBills(urlPath = event.clickedButtonConfig.action.url)
) {
customerDataInputViewModel.onSavedBillCtaClicked(
apiUrl = event.clickedButtonConfig.action.url
)
bottomSheetState.hide()
navigator.navigateUp()
}
}
}
val openSheet = {
scope.launch { bottomSheetState.show() }
Unit

View File

@@ -37,6 +37,7 @@ import com.navi.bbps.common.NaviBbpsScreen
import com.navi.bbps.common.model.NaviBbpsVmData
import com.navi.bbps.common.model.config.NaviBbpsDefaultConfig
import com.navi.bbps.common.model.view.NaviBbpsSessionHelper
import com.navi.bbps.common.repository.BbpsCommonRepository
import com.navi.bbps.common.usecase.FetchBillHandler
import com.navi.bbps.common.usecase.GetABTestingExperimentUseCase
import com.navi.bbps.common.usecase.NaviBbpsConfigUseCase
@@ -131,6 +132,7 @@ constructor(
private val resProvider: ResourceProvider,
private val rewardsNudgeEntityFetchUseCase: RewardNudgeUseCase,
private val naviCacheRepository: NaviCacheRepository,
private val naviBbpsCommonRepository: BbpsCommonRepository,
) :
NaviBbpsBaseVM(
naviBbpsVmData = NaviBbpsVmData(screen = NaviBbpsScreen.NAVI_BBPS_PAY_BILL_SCREEN)
@@ -1210,4 +1212,11 @@ constructor(
_isArcProtected.update { isArcProtected }
}
}
suspend fun onSavedBillCtaClicked(apiUrl: String) {
naviBbpsCommonRepository.getSavedBillsDetailsOnError(
path = apiUrl,
metricInfo = getBbpsMetricInfo(screenName = naviBbpsVmData.screen.screenName),
)
}
}

View File

@@ -26,6 +26,7 @@ import com.navi.bbps.common.CATEGORY_ID_MOBILE_PREPAID
import com.navi.bbps.common.CoinsSyncManager
import com.navi.bbps.common.NaviBbpsScreen
import com.navi.bbps.common.model.view.NaviBbpsSessionHelper
import com.navi.bbps.common.repository.BbpsCommonRepository
import com.navi.bbps.common.usecase.FetchBillHandler
import com.navi.bbps.common.usecase.GetABTestingExperimentUseCase
import com.navi.bbps.common.usecase.NaviBbpsConfigUseCase
@@ -86,6 +87,7 @@ constructor(
private val litmusExperimentsUseCase: LitmusExperimentsUseCase,
private val naviPaymentRewardEventBus: NaviPaymentRewardsEventBus,
private val naviCacheRepository: NaviCacheRepository,
private val naviBbpsCommonRepository: BbpsCommonRepository,
) :
PayBillViewModel(
savedStateHandle = savedStateHandle,
@@ -104,6 +106,7 @@ constructor(
rewardsNudgeEntityFetchUseCase = rewardsNudgeEntityFetchUseCase,
payBillRepository = payBillRepository,
naviCacheRepository = naviCacheRepository,
naviBbpsCommonRepository = naviBbpsCommonRepository,
) {
companion object {

View File

@@ -66,6 +66,7 @@ import com.navi.bbps.common.NaviBbpsAnalytics
import com.navi.bbps.common.NaviBbpsDimens
import com.navi.bbps.common.NaviBbpsScreen
import com.navi.bbps.common.SCROLL_OFFSET_FOR_TITLE_IN_HEADER
import com.navi.bbps.common.model.view.NaviBbpsButtonAction
import com.navi.bbps.common.theme.NaviBbpsColor
import com.navi.bbps.common.ui.BbpsBillerConsentView
import com.navi.bbps.common.ui.BbpsCircleImage
@@ -75,6 +76,7 @@ import com.navi.bbps.common.ui.NaviBbpsModalBottomSheetLayout
import com.navi.bbps.common.ui.SetStatusBarColor
import com.navi.bbps.common.utils.NaviBbpsCommonUtils
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isCreditCardCategory
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isUrlPathValidForSavedBills
import com.navi.bbps.common.utils.getDisplayableAmount
import com.navi.bbps.customHide
import com.navi.bbps.entry.NaviBbpsActivity
@@ -196,15 +198,6 @@ fun PayBillScreen(
}
}
LaunchedEffect(Unit) {
naviBbpsActivity.errorEventHandler.bbpsErrorCtaClickEvent.collectLatest { event ->
// In case of bill fetch error, go back to previous screen
if (event.errorConfig.tag == PayBillViewModel.TAG_BILL_FETCH_ERROR) {
navigator.navigateUp()
}
}
}
LaunchedEffect(Unit) {
payBillViewModel.navigateToOrderDetailsScreen.collectLatest { navigateToOrderDetailsScreen
->
@@ -277,6 +270,24 @@ fun PayBillScreen(
confirmValueChange = { true },
)
LaunchedEffect(Unit) {
naviBbpsActivity.errorEventHandler.bbpsErrorCtaClickEvent.collectLatest { event ->
when {
event.errorConfig.tag == PayBillViewModel.TAG_BILL_FETCH_ERROR -> {
navigator.navigateUp()
}
event.clickedButtonConfig.action is NaviBbpsButtonAction.Redirect -> {
val apiUrl = event.clickedButtonConfig.action.url
if (isUrlPathValidForSavedBills(urlPath = apiUrl)) {
payBillViewModel.onSavedBillCtaClicked(apiUrl = apiUrl)
bottomSheetState.hide()
navigator.navigateUp()
}
}
}
}
}
if (billCategoryEntity.categoryId != CATEGORY_ID_CREDIT_CARD) {
SetStatusBarColor(activity = naviBbpsActivity, colorResId = R.color.bbps_bgAlt)
} else {

View File

@@ -87,6 +87,7 @@ import com.navi.bbps.common.SCROLL_OFFSET_FOR_TITLE_IN_HEADER
import com.navi.bbps.common.SYMBOL_RUPEE
import com.navi.bbps.common.model.config.NaviBbpsDefaultConfig
import com.navi.bbps.common.model.view.LoadingState
import com.navi.bbps.common.model.view.NaviBbpsButtonAction
import com.navi.bbps.common.theme.NaviBbpsColor
import com.navi.bbps.common.theme.NaviBbpsColor.ctaPrimary
import com.navi.bbps.common.ui.BbpsBillerConsentView
@@ -102,6 +103,7 @@ import com.navi.bbps.common.utils.NaviBbpsCommonUtils
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isCategoryOfTypeAmountChipsRequired
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isCreditCardCategory
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isRechargeCategory
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.isUrlPathValidForSavedBills
import com.navi.bbps.common.utils.getDisplayableAmount
import com.navi.bbps.customHide
import com.navi.bbps.entry.NaviBbpsActivity
@@ -114,6 +116,7 @@ import com.navi.bbps.feature.customerinput.model.view.BillerDetailsEntity
import com.navi.bbps.feature.destinations.MyBillHistoryDetailsScreenDestination
import com.navi.bbps.feature.mybills.model.view.MyBillEntity
import com.navi.bbps.feature.mybills.model.view.UnpaidBillDetails
import com.navi.bbps.feature.paybill.PayBillViewModel
import com.navi.bbps.feature.paybill.PayBillViewModelV2
import com.navi.bbps.feature.paybill.model.network.PayBillResponse
import com.navi.bbps.feature.paybill.model.network.PaymentAmountExactness
@@ -380,6 +383,24 @@ fun PayBillScreenV2(
skipHalfExpanded = true,
)
LaunchedEffect(Unit) {
naviBbpsActivity.errorEventHandler.bbpsErrorCtaClickEvent.collectLatest { event ->
when {
event.errorConfig.tag == PayBillViewModel.TAG_BILL_FETCH_ERROR -> {
navigator.navigateUp()
}
event.clickedButtonConfig.action is NaviBbpsButtonAction.Redirect -> {
val apiUrl = event.clickedButtonConfig.action.url
if (isUrlPathValidForSavedBills(urlPath = apiUrl)) {
payBillViewModelV2.onSavedBillCtaClicked(apiUrl = apiUrl)
bottomSheetState.hide()
navigator.navigateUp()
}
}
}
}
}
SetStatusBarColor(activity = naviBbpsActivity, colorResId = R.color.bbps_text_white)
val onBackClicked = {

View File

@@ -118,6 +118,7 @@ constructor(
private val rewardsNudgeEntityFetchUseCase: RewardNudgeUseCase,
private val naviBbpsSessionHelper: NaviBbpsSessionHelper,
@NaviBbpsGsonBuilder private val gson: Gson,
private val naviBbpsCommonRepository: BbpsCommonRepository,
savedStateHandle: SavedStateHandle,
) :
NaviBbpsBaseVM(
@@ -1082,6 +1083,13 @@ constructor(
private suspend fun updateNavigateToNextScreenOnHelpCta(ctaData: CtaData?) {
_navigateToNextScreenFromHelpCta.emit(ctaData)
}
suspend fun onSavedBillCtaClicked(apiUrl: String) {
naviBbpsCommonRepository.getSavedBillsDetailsOnError(
path = apiUrl,
metricInfo = getBbpsMetricInfo(screenName = naviBbpsVmData.screen.screenName),
)
}
}
sealed class PrepaidRechargeScreenBottomSheetUIState {

View File

@@ -47,6 +47,7 @@ import com.navi.bbps.common.DASH
import com.navi.bbps.common.NAVI_HOME
import com.navi.bbps.common.NaviBbpsAnalytics
import com.navi.bbps.common.RCBP_CATEGORY
import com.navi.bbps.common.model.view.NaviBbpsButtonAction
import com.navi.bbps.common.model.view.PrepaidPlanItemLoadingState
import com.navi.bbps.common.theme.NaviBbpsColor
import com.navi.bbps.common.ui.KeyboardVisibilityObserver
@@ -182,6 +183,18 @@ fun PrepaidRechargeScreen(
}
}
LaunchedEffect(Unit) {
naviBbpsActivity.errorEventHandler.bbpsErrorCtaClickEvent.collectLatest { event ->
if (event.clickedButtonConfig.action is NaviBbpsButtonAction.Redirect) {
prepaidRechargeViewModel.onSavedBillCtaClicked(
apiUrl = event.clickedButtonConfig.action.url
)
bottomSheetState.hide()
navigator.navigateUp()
}
}
}
val onBackClick = {
if (bottomSheetState.isVisible) {
closeSheet()

View File

@@ -173,4 +173,9 @@ interface NaviBbpsRetrofitService {
suspend fun fetchCoinDiscount(
@Query("product") product: String = "BBPS"
): Response<GenericResponse<CoinDiscountDetailsResponse>>
@PATCH("{url}")
suspend fun savedBills(
@Path("url", encoded = true) url: String
): Response<GenericResponse<Any?>>
}