diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt index ad1b90eded..34ed4f6c85 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/ui/NaviPayCommonView.kt @@ -734,7 +734,7 @@ fun getAnnotatedDescriptionForSuccessBottomSheet(description: String): Annotated SpanStyle( fontSize = 14.sp, fontFamily = naviFontFamily, - color = NaviPayColor.ctaPrimary, + color = ctaPrimary, textDecoration = TextDecoration.Underline, fontWeight = getFontWeight(FontWeightEnum.NAVI_HEADLINE_REGULAR) ), diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/MandateDetailScreenOfPendingCategory.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/MandateDetailScreenOfPendingCategory.kt index cf3215c090..e49431a692 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/MandateDetailScreenOfPendingCategory.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/MandateDetailScreenOfPendingCategory.kt @@ -74,7 +74,6 @@ import com.navi.pay.common.ui.RenderBottomSheetMenuOptionItem import com.navi.pay.common.ui.SecondaryRoundedButton import com.navi.pay.common.ui.ShadowStrip import com.navi.pay.common.ui.SuccessBottomSheetContent -import com.navi.pay.common.ui.ThemeRoundedButton import com.navi.pay.common.utils.NaviPayNotificationHandler import com.navi.pay.common.utils.SnackBarPredefinedConfig import com.navi.pay.common.utils.launchOnboardingSDK @@ -88,6 +87,7 @@ import com.navi.pay.management.mandate.model.view.MandateCategory import com.navi.pay.management.mandate.model.view.MandateEntity import com.navi.pay.management.mandate.model.view.MandateOnboardingAction import com.navi.pay.management.mandate.model.view.MandateScreenBackNavigation +import com.navi.pay.management.mandate.viewmodel.CtaLoaderType import com.navi.pay.management.mandate.viewmodel.MandateDetailOfPendingCategoryBottomSheetState import com.navi.pay.management.mandate.viewmodel.MandateDetailOfPendingCategoryViewModel import com.navi.pay.management.mandate.viewmodel.MandateDetailUIStateOfPendingCategory @@ -131,8 +131,8 @@ fun MandateDetailScreenOfPendingCategory( mandateDetailOfPendingCategoryViewModel.showSnackBar.collectAsStateWithLifecycle() val bottomSheetStateHolder by mandateDetailOfPendingCategoryViewModel.bottomSheetStateHolder.collectAsStateWithLifecycle() - val showLoader by - mandateDetailOfPendingCategoryViewModel.showLoader.collectAsStateWithLifecycle() + val ctaLoaderType by + mandateDetailOfPendingCategoryViewModel.ctaLoaderType.collectAsStateWithLifecycle() val selectedBankAccount by mandateDetailOfPendingCategoryViewModel.selectedBankAccount.collectAsStateWithLifecycle() @@ -143,6 +143,20 @@ fun MandateDetailScreenOfPendingCategory( ) val scope = rememberCoroutineScope() + val onBackClick = { + if (bottomSheetState.isVisible && bottomSheetStateHolder.showBottomSheet) { + scope.launch { + mandateDetailOfPendingCategoryViewModel.updateBottomSheetUIState( + showBottomSheet = false + ) + } + } else { + resultNavigator.navigateBack( + result = mandateDetailOfPendingCategoryViewModel.mandateScreenBackNavigationState + ) + } + } + val onDismissBottomSheet: () -> Unit = { scope .launch { bottomSheetState.hide() } @@ -151,6 +165,8 @@ fun MandateDetailScreenOfPendingCategory( mandateDetailOfPendingCategoryViewModel.updateBottomSheetUIState( showBottomSheet = false ) + } else { + onBackClick() } } } @@ -207,19 +223,7 @@ fun MandateDetailScreenOfPendingCategory( } } - BackHandler { - if (bottomSheetState.isVisible) { - scope.launch { - mandateDetailOfPendingCategoryViewModel.updateBottomSheetUIState( - showBottomSheet = false - ) - } - } else { - resultNavigator.navigateBack( - result = mandateDetailOfPendingCategoryViewModel.mandateScreenBackNavigationState - ) - } - } + BackHandler { onBackClick() } val onApproveButtonClicked = { naviPayAnalytics.onManageDetailsApproveClick(mandateEntity = mandateEntity) @@ -296,7 +300,7 @@ fun MandateDetailScreenOfPendingCategory( mandateDetailOfPendingCategoryViewModel, bottomSheetUIState = bottomSheetStateHolder.bottomSheetUIState, naviPayAnalytics = naviPayAnalytics, - showLoader = showLoader, + ctaLoaderType = ctaLoaderType, onDeclineMandateActionClicked = onDeclineMandateActionClicked, mandateEntity = mandateDetailOfPendingCategoryViewModel.mandateEntity, onAddAccountClicked = onAddAccountClicked, @@ -348,7 +352,8 @@ fun MandateDetailScreenOfPendingCategory( ) } }, - snackBarState = snackBarState + snackBarState = snackBarState, + ctaLoaderType = ctaLoaderType ) } is MandateDetailUIStateOfPendingCategory.Success -> { @@ -378,7 +383,8 @@ fun RenderMandateDetailScreenOfPendingCategory( mandateDetailOfPendingCategoryViewModel: MandateDetailOfPendingCategoryViewModel, onApproveButtonClicked: () -> Unit, onDeclineButtonClicked: () -> Unit, - snackBarState: Boolean + snackBarState: Boolean, + ctaLoaderType: CtaLoaderType ) { val coroutineScope = rememberCoroutineScope() @@ -539,7 +545,8 @@ fun RenderMandateDetailScreenOfPendingCategory( mandateDetailOfPendingCategoryViewModel, onDeclineButtonClicked = onDeclineButtonClicked, onApproveButtonClicked = onApproveButtonClicked, - mandateEntity = mandateEntity + mandateEntity = mandateEntity, + ctaLoaderType = ctaLoaderType ) } }, @@ -568,7 +575,8 @@ fun AccountSelectionFooter( mandateDetailOfPendingCategoryViewModel: MandateDetailOfPendingCategoryViewModel, onDeclineButtonClicked: () -> Unit, onApproveButtonClicked: () -> Unit, - mandateEntity: MandateEntity? + mandateEntity: MandateEntity?, + ctaLoaderType: CtaLoaderType ) { val bankAccountState by @@ -617,7 +625,7 @@ fun AccountSelectionFooter( paddingValues = PaddingValues(16.dp), enabled = positiveButtonEnabled, lottieFileName = NAVI_PAY_PRIMARY_CTA_LOADER_LOTTIE, - showLoader = false + showLoader = ctaLoaderType == CtaLoaderType.Approve ) { onApproveButtonClicked() } @@ -635,10 +643,14 @@ fun AccountSelectionFooter( Spacer(modifier = Modifier.width(16.dp)) - ThemeRoundedButton( - text = stringResource(id = R.string.approve), + LoaderRoundedButton( modifier = Modifier.weight(1f), - enabled = positiveButtonEnabled + text = stringResource(id = R.string.approve), + paddingValues = PaddingValues(vertical = 14.dp, horizontal = 10.dp), + enabled = positiveButtonEnabled, + lottieFileName = NAVI_PAY_PRIMARY_CTA_LOADER_LOTTIE, + showLoader = ctaLoaderType == CtaLoaderType.Approve, + debounceTime = 800L ) { onApproveButtonClicked() } @@ -683,7 +695,7 @@ private fun RenderBottomSheetOfMandateDetailOfPendingCategory( mandateDetailOfPendingCategoryViewModel: MandateDetailOfPendingCategoryViewModel, bottomSheetUIState: MandateDetailOfPendingCategoryBottomSheetState, naviPayAnalytics: NaviPayAnalytics.NaviPayManageAutoPay, - showLoader: Boolean, + ctaLoaderType: CtaLoaderType, onDeclineMandateActionClicked: () -> Unit, mandateEntity: MandateEntity?, onPayButtonClicked: () -> Unit, @@ -740,7 +752,7 @@ private fun RenderBottomSheetOfMandateDetailOfPendingCategory( ) } }, - showLoader = showLoader + showLoader = ctaLoaderType == CtaLoaderType.Decline ) is MandateDetailOfPendingCategoryBottomSheetState.Error -> { diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/PendingMandateAccountSelectionBottomsheetView.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/PendingMandateAccountSelectionBottomsheetView.kt index 4e59a1f2cc..12019ddfd4 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/PendingMandateAccountSelectionBottomsheetView.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/ui/PendingMandateAccountSelectionBottomsheetView.kt @@ -46,6 +46,7 @@ import com.navi.pay.common.ui.BottomSheetTopGradientBox import com.navi.pay.common.ui.LoaderRoundedButton import com.navi.pay.management.common.sendmoney.model.view.BankAccountsState import com.navi.pay.management.mandate.model.view.MandateEntity +import com.navi.pay.management.mandate.viewmodel.CtaLoaderType import com.navi.pay.management.mandate.viewmodel.MandateDetailOfPendingCategoryViewModel import com.navi.pay.utils.NAVI_PAY_PRIMARY_CTA_LOADER_LOTTIE import com.navi.pay.utils.getDisplayableAmount @@ -65,7 +66,7 @@ fun PendingMandateAccountSelectionBottomSheetView( val selectedBankAccount by mandateDetailOfPendingCategoryViewModel.selectedBankAccount.collectAsStateWithLifecycle() val showPayButtonLoader by - mandateDetailOfPendingCategoryViewModel.showLoader.collectAsStateWithLifecycle() + mandateDetailOfPendingCategoryViewModel.ctaLoaderType.collectAsStateWithLifecycle() val sheetHeight = LocalConfiguration.current.screenHeightDp.dp * 0.85f Column( @@ -130,7 +131,7 @@ fun PendingMandateAccountSelectionBottomSheetView( paddingValues = PaddingValues(16.dp), enabled = primaryButtonEnabled, lottieFileName = NAVI_PAY_PRIMARY_CTA_LOADER_LOTTIE, - showLoader = showPayButtonLoader + showLoader = showPayButtonLoader == CtaLoaderType.Approve ) { onPayButtonClicked() } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/viewmodel/MandateDetailOfPendingCategoryViewModel.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/viewmodel/MandateDetailOfPendingCategoryViewModel.kt index d7cacb9658..c1a79384d1 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/viewmodel/MandateDetailOfPendingCategoryViewModel.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/management/mandate/viewmodel/MandateDetailOfPendingCategoryViewModel.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.navi.base.cache.datastore.DataStoreHelper import com.navi.base.utils.DateUtils +import com.navi.base.utils.EMPTY import com.navi.base.utils.ResourceProvider import com.navi.common.network.models.RepoResult import com.navi.common.network.models.isSuccess @@ -146,8 +147,8 @@ constructor( private val _showSnackBar = MutableStateFlow(false) val showSnackBar = _showSnackBar.asStateFlow() - private val _showLoader = MutableStateFlow(false) - val showLoader = _showLoader.asStateFlow() + private val _ctaLoaderType = MutableStateFlow(CtaLoaderType.None) + val ctaLoaderType = _ctaLoaderType.asStateFlow() private val _navigateToNextScreen = MutableSharedFlow() @@ -289,8 +290,8 @@ constructor( } } - private fun updateShowLoaderState(showLoader: Boolean) { - _showLoader.update { showLoader } + private fun updateCtaLoaderTypeState(loaderType: CtaLoaderType) { + _ctaLoaderType.update { loaderType } } private fun initMandateEntity() { @@ -375,19 +376,21 @@ constructor( featureTags = validateVpaResponse.featureTags, screenName = screenName ) + val isAccountEligible = + accountEligibilityMerchantHelper.getAccountEligibility( + eligibility = accountTypeEligibilityMap[linkedAccountEntity.accountType], + amount = mandateEntity?.amount?.toDouble() ?: 0.0 + ) return EligibilityState( - isAccountEligible = - accountEligibilityMerchantHelper.getAccountEligibility( - eligibility = - accountTypeEligibilityMap[linkedAccountEntity.accountType], - amount = mandateEntity?.amount?.toDouble() ?: 0.0 - ), + isAccountEligible = isAccountEligible, inEligibilityReason = - accountEligibilityMerchantHelper.getIneligibilityReason( - eligibility = - accountTypeEligibilityMap[linkedAccountEntity.accountType], - accountType = linkedAccountEntity.accountType - ) + if (!isAccountEligible) + accountEligibilityMerchantHelper.getIneligibilityReason( + eligibility = + accountTypeEligibilityMap[linkedAccountEntity.accountType], + accountType = linkedAccountEntity.accountType + ) + else EMPTY ) } } else { // For approve mandate, only payer VPA account is eligible @@ -511,7 +514,7 @@ constructor( return@launch } - updateShowLoaderState(true) + updateCtaLoaderTypeState(CtaLoaderType.Approve) updateBottomSheetUIState(showBottomSheet = false, allowStateChange = false) if (isPendingMandateOfTypeCreate) { @@ -519,7 +522,7 @@ constructor( } else { approveMandate() } - updateShowLoaderState(false) + updateCtaLoaderTypeState(CtaLoaderType.None) } } @@ -900,7 +903,7 @@ constructor( return@launch } - updateShowLoaderState(true) + updateCtaLoaderTypeState(CtaLoaderType.Decline) val declineMandateRequest = ReviewMandateRequest( @@ -941,6 +944,7 @@ constructor( when (declineMandateData.state) { MandateResponseState.SUCCESS.name -> { naviPayAnalytics.onMandateDeclineSuccess(mandateEntity) + updateBottomSheetUIState(showBottomSheet = false) updateNavigateToNextScreen( navigateToNextScreen = NavigateToNextScreenFromMandateDetailOfPendingCategory.MandateScreen( @@ -970,7 +974,7 @@ constructor( ) } } - updateShowLoaderState(false) + updateCtaLoaderTypeState(CtaLoaderType.None) } } @@ -1122,3 +1126,9 @@ sealed class NavigateToNextScreenFromMandateDetailOfPendingCategory { data class MandateActiveOrCompletedDetailScreen(val mandateEntity: MandateEntity?) : NavigateToNextScreenFromMandateDetailOfPendingCategory() } + +enum class CtaLoaderType { + Approve, + Decline, + None +}