NTP-5952 | Clean up PE OE events (#13928)

Co-authored-by: siddiboina-susai_navi <siddiboina.susai@navi.com>
Co-authored-by: Shivam Goyal <shivam.goyal@navi.com>
This commit is contained in:
shankar yadav
2024-12-05 23:32:40 +05:30
committed by GitHub
parent fdc02786bd
commit de430c656c
23 changed files with 134 additions and 40 deletions

View File

@@ -1505,6 +1505,7 @@ class NaviAnalytics private constructor() {
const val NAV_LOAN_CLICKED = "NaviApp_Nav_Loan_Clicked"
const val NEW_CLOSED_LOAN_SCREEN = "NaviApp_Closed_Loan_Lands"
const val NEW_HOME_ACTIVITY = "new_home_activity"
const val LOANS_TAB = "loans_tab"
const val PROFILE_SCREEN = "profile_screen"
const val NEW_USER_EXPERIENCE_ACTIVITY = "new_user_experience_activity"
const val NAVI_DEEPLINK_MANAGEMENT_ACTIVITY = "NaviDeeplinkManagementActivityLanded"

View File

@@ -882,7 +882,7 @@ class HomePageActivity :
// To be removed when the NUX is driven by backend CTA using post-render action
private fun fetchNuxScreenDataForEligibleUsers() {
if (redirectionUseCase.isUpiNuxRedirection(intent.extras).not()) {
homeVM.fetchNuxScreenDataForEligibleUsers {
homeVM.fetchNuxScreenDataForEligibleUsers(naeScreenName = screenName) {
redirectionUseCase.navigateToUpiNuxScreen(HOME)
}
}

View File

@@ -25,6 +25,7 @@ import com.navi.base.utils.orFalse
import com.navi.common.ui.errorview.FullScreenErrorComposeView
import com.navi.common.utils.Constants.CTAData
import com.navi.common.utils.Constants.ERROR_CODE
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.common.web.NaviWebViewCallBack
import com.naviapp.common.web.NaviWebViewCallBack.Companion.JAVA_SCRIPT_NAME_DEFAULT
import com.naviapp.home.compose.activity.HomePageActivity
@@ -178,13 +179,15 @@ private fun LoansTabWebView(
) {
val lifecycleOwner = LocalLifecycleOwner.current
val showLoaderState = remember { mutableStateOf(true) }
LaunchedEffect(Unit) { loansTabVm.fetchAuthTokenData() }
LaunchedEffect(Unit) { loansTabVm.fetchAuthTokenData(naeScreenName = NaviAnalytics.LOANS_TAB) }
when (val webViewUrl = loansTabVm.webViewUrl.collectAsState().value) {
is AuthTokenState.Nothing -> {}
is AuthTokenState.Error -> {
FullScreenErrorComposeView(
error = webViewUrl.error,
onRetryClick = { loansTabVm.fetchAuthTokenData() }
onRetryClick = {
loansTabVm.fetchAuthTokenData(naeScreenName = NaviAnalytics.LOANS_TAB)
}
)
}
is AuthTokenState.Success -> {

View File

@@ -15,6 +15,7 @@ import com.navi.base.utils.BaseUtils
import com.navi.base.utils.generateRandomString
import com.navi.base.utils.generateSHA256Hash
import com.navi.base.utils.isNotNull
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.GenericErrorResponse
import com.navi.common.uitron.model.action.CtaAction
@@ -105,14 +106,19 @@ constructor(
}
}
fun fetchAuthTokenData() {
fun fetchAuthTokenData(naeScreenName: String) {
viewModelScope.safeLaunch(Dispatchers.IO) {
val codeVerifier = generateRandomString(32)
val codeChallenger = generateSHA256Hash(codeVerifier)
val response =
webRedirectionRepository.fetchTemporarySessionToken(
codeChallenger = codeChallenger,
appSessionToken = BaseUtils.getSessionToken().toString()
appSessionToken = BaseUtils.getSessionToken().toString(),
metricInfo =
MetricInfo.LEMetric(
screen = naeScreenName,
isNae = { !it.isValidResponse() }
)
)
if (response.isValidResponse()) {
_webViewUrl.value =

View File

@@ -326,9 +326,13 @@ constructor(
}
}
fun fetchNuxScreenDataForEligibleUsers(navigateToNuxScreen: () -> Unit) {
fun fetchNuxScreenDataForEligibleUsers(naeScreenName: String, navigateToNuxScreen: () -> Unit) {
viewModelScope.safeLaunch((Dispatchers.IO)) {
nuxHandler.fetchNuxScreenDataForEligibleUsers(UPI_NUX_SCREEN, navigateToNuxScreen)
nuxHandler.fetchNuxScreenDataForEligibleUsers(
UPI_NUX_SCREEN,
navigateToNuxScreen,
naeScreenName
)
}
}

View File

@@ -62,10 +62,12 @@ constructor(
suspend fun fetchNuxScreenDataForEligibleUsers(
screenId: String,
navigateToNuxScreen: () -> Unit
navigateToNuxScreen: () -> Unit,
naeScreenName: String
) {
if (isUserEligibleForNux(screenId).not()) return
val naviCacheAltSourceEntity = getNaviCacheAltSourceEntity(screenId)
val naviCacheAltSourceEntity =
getNaviCacheAltSourceEntity(screenId, naeScreenName = naeScreenName)
if (naviCacheAltSourceEntity.value.isNotNullAndNotEmpty()) {
canRedirectUserToNux = true
navigateToNuxScreen()
@@ -82,7 +84,8 @@ constructor(
suspend fun getNuxScreenDefinition(
queryMap: MutableMap<String, String?>,
onSuccess: (data: AlchemistScreenDefinition) -> Unit,
onFailure: () -> Unit
onFailure: () -> Unit,
naeScreenName: String
) {
this.queryMap = queryMap
val screenId = queryMap[SCREEN_ID].orEmpty()
@@ -90,7 +93,7 @@ constructor(
naviCacheRepository.getDataOrFetchFromAltSource(
key = screenId,
version = BuildConfig.VERSION_CODE.toLong(),
getDataFromAltSource = { getNaviCacheAltSourceEntity(screenId) }
getDataFromAltSource = { getNaviCacheAltSourceEntity(screenId, naeScreenName) }
)
dataDeserializers
.fromJson(cachedResponse?.value, AlchemistScreenDefinition::class.java)
@@ -105,13 +108,17 @@ constructor(
naviCacheRepository.clear(screenId)
}
private suspend fun getNaviCacheAltSourceEntity(screenId: String): NaviCacheAltSourceEntity {
private suspend fun getNaviCacheAltSourceEntity(
screenId: String,
naeScreenName: String
): NaviCacheAltSourceEntity {
val response =
nuxRepository.fetchNuxScreenResponse(
AlchemistScreenRequest(
screenName = screenId,
inputMap = mapOf(SOURCE to queryMap[SOURCE])
)
),
naeScreenName = naeScreenName
)
if (response.isValidResponse()) {
systemBackAction = response.data?.screenStructure?.systemBackCta

View File

@@ -9,6 +9,7 @@ package com.naviapp.nux.repository
import com.navi.common.alchemist.model.AlchemistScreenDefinition
import com.navi.common.alchemist.model.AlchemistScreenRequest
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.RepoResult
import com.navi.common.utils.Constants.GZIP
@@ -23,7 +24,8 @@ constructor(@SuperAppRetroFit private val superAppRetrofitService: RetrofitServi
ResponseCallback() {
suspend fun fetchNuxScreenResponse(
screenRequest: AlchemistScreenRequest
screenRequest: AlchemistScreenRequest,
naeScreenName: String
): RepoResult<AlchemistScreenDefinition> =
apiResponseCallback(
superAppRetrofitService.fetchForgeAlchemistScreen(
@@ -31,6 +33,7 @@ constructor(@SuperAppRetroFit private val superAppRetrofitService: RetrofitServi
target = ModuleNameV2.FORGE.name,
verticalType = ModuleNameV2.FORGE.name,
request = screenRequest,
)
),
metricInfo = MetricInfo.AppMetric(screen = naeScreenName, isNae = { false })
)
}

View File

@@ -27,7 +27,8 @@ fun NuxGenericScreen(
state: MainScreenUiState,
effectFlow: Flow<MainScreenUiEffect>?,
getViewModel: () -> NuxViewModel,
onNavigationRequested: (MainScreenUiEffect.Navigation) -> Unit
onNavigationRequested: (MainScreenUiEffect.Navigation) -> Unit,
naeScreenName: String,
) {
LaunchedEffect(Unit) {
effectFlow
@@ -40,7 +41,9 @@ fun NuxGenericScreen(
}
?.collect()
}
LaunchedEffect(Unit) { getViewModel.invoke().getScreenDefinition() }
LaunchedEffect(Unit) {
getViewModel.invoke().getScreenDefinition(naeScreenName = naeScreenName)
}
BackHandler { getViewModel().setEffect { MainScreenUiEffect.Navigation.Back } }

View File

@@ -41,6 +41,7 @@ fun NuxGenericScreenDestination(bundle: Bundle?, viewModel: NuxViewModel = hiltV
}
}
}
}
},
naeScreenName = activity.screenName,
)
}

View File

@@ -29,12 +29,13 @@ class NuxViewModel @Inject constructor(val nuxHandler: NewUserExperienceHandler)
private var queryMap: MutableMap<String, String?> = mutableMapOf()
fun getScreenDefinition() {
fun getScreenDefinition(naeScreenName: String) {
viewModelScope.safeLaunch(Dispatchers.IO) {
nuxHandler.getNuxScreenDefinition(
queryMap = queryMap,
onSuccess = { sendEvent(NuxGenericScreenUiEvent.RenderUI(it)) },
onFailure = { setEffect { MainScreenUiEffect.Navigation.Back } }
onFailure = { setEffect { MainScreenUiEffect.Navigation.Back } },
naeScreenName = naeScreenName,
)
}
}

View File

@@ -7,12 +7,14 @@
package com.naviapp.payment.repositories
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.model.AsyncRequestData
import com.navi.common.model.InitiateRescheduleLoanAgreementGenerationRequest
import com.navi.common.model.InitiateRescheduleLoanAgreementGenerationResponse
import com.navi.common.model.PaymentOrderDetail
import com.navi.common.model.UploadDataAsyncResponse
import com.navi.common.network.models.RepoResult
import com.navi.common.network.models.isSuccessWithData
import com.navi.naviwidgets.models.response.BottomSheetInfoV2
import com.navi.payment.paymenthandler.model.PaymentStatusData
import com.navi.payment.paymenthandler.model.SyncPaymentResponse
@@ -163,8 +165,12 @@ class PaymentRepository @Inject constructor() : ResponseCallback() {
suspend fun closeLoan(loanAccountNumber: String?, request: ForecloseLoanRequest?) =
apiResponseCallback(retrofitService().forecloseLoan(loanAccountNumber, request))
suspend fun fetchPaymentBehaviourWidget(type: String) =
apiResponseCallback(retrofitService().fetchPaymentBehaviourWidget(type))
suspend fun fetchPaymentBehaviourWidget(type: String, naeScreenName: String) =
apiResponseCallback(
retrofitService().fetchPaymentBehaviourWidget(type),
metricInfo =
MetricInfo.LEMetric(screen = naeScreenName, isNae = { !it.isSuccessWithData() })
)
suspend fun fetchPaymentFailureBottomSheetData(
data: InitiatePaymentRequest

View File

@@ -139,7 +139,7 @@ class PaymentBehaviourFragment :
private fun init() {
isPositiveReinforcement = arguments?.getString(TYPE) == POSITIVE
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
launch { paymentBehaviourVM.fetchData(arguments) }
launch { paymentBehaviourVM.fetchData(arguments, screenName) }
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
launch {

View File

@@ -33,13 +33,17 @@ class PaymentBehaviourVM @Inject constructor(private val paymentRepository: Paym
private var _paymentInfoResponse = MutableStateFlow<GenericWidgetState>(GenericWidgetState.Init)
var paymentInfoResponse = _paymentInfoResponse.asStateFlow()
fun fetchData(arguments: Bundle?) {
fun fetchData(arguments: Bundle?, naeScreenName: String) {
val behaviourType = arguments?.getString(Constants.TYPE)
when (val type = behaviourType ?: Constants.NEGATIVE) {
Constants.NEGATIVE -> {
coroutineScope.launch {
_negativeReinforcementResponse.emit(GenericWidgetState.Loading)
val response = paymentRepository.fetchPaymentBehaviourWidget(type)
val response =
paymentRepository.fetchPaymentBehaviourWidget(
type,
naeScreenName = naeScreenName
)
if (
response.error == null &&
response.errors.isNullOrEmpty() &&
@@ -57,7 +61,11 @@ class PaymentBehaviourVM @Inject constructor(private val paymentRepository: Paym
else -> {
coroutineScope.launch {
_positiveReinforcementResponse.emit(GenericWidgetState.Loading)
val response = paymentRepository.fetchPaymentBehaviourWidget(type)
val response =
paymentRepository.fetchPaymentBehaviourWidget(
type,
naeScreenName = naeScreenName
)
if (
response.error == null &&
response.errors.isNullOrEmpty() &&

View File

@@ -472,7 +472,7 @@ class RegistrationActivity :
}
private fun makApiCalls() {
homeVM.fetchNuxScreenDataForEligibleUsers {}
homeVM.fetchNuxScreenDataForEligibleUsers(naeScreenName = screenName) {}
naviFirebaseAuthHelper.get().initFirebaseAuth()
}

View File

@@ -111,7 +111,7 @@ class WebRedirectionActivity : BaseActivity() {
)
}
initialiseDataIngestion()
webRedirectionVM.fetchTemporarySessionToken()
webRedirectionVM.fetchTemporarySessionToken(naeScreenName = screenName)
observeWebRedirectionNavigation()
observeSmsUploadDataResponse()
}
@@ -270,7 +270,9 @@ class WebRedirectionActivity : BaseActivity() {
trackEvent(eventName = REDIRECTION_TO_WEB_AUTH_API_FAILED)
FullScreenErrorComposeView(
error = data.error,
onRetryClick = { webRedirectionVM.fetchTemporarySessionToken() }
onRetryClick = {
webRedirectionVM.fetchTemporarySessionToken(naeScreenName = screenName)
}
)
}
else -> {
@@ -300,7 +302,9 @@ class WebRedirectionActivity : BaseActivity() {
trackEvent(eventName = REDIRECTION_TO_WEB_AUTH_API_FAILED)
FullScreenErrorComposeView(
error = data.error,
onRetryClick = { webRedirectionVM.fetchTemporarySessionToken() }
onRetryClick = {
webRedirectionVM.fetchTemporarySessionToken(naeScreenName = screenName)
}
)
}
is UiState.Success -> {

View File

@@ -20,6 +20,7 @@ import com.navi.base.utils.generateRandomString
import com.navi.base.utils.generateSHA256Hash
import com.navi.base.utils.isNotNullAndNotEmpty
import com.navi.base.utils.orFalse
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.constants.APP_VERSION_CODE
import com.navi.common.constants.OS_VERSION
import com.navi.common.constants.OS_VERSION_NAME
@@ -86,14 +87,19 @@ constructor(
private var businessUnit: String? = null
fun fetchTemporarySessionToken() {
fun fetchTemporarySessionToken(naeScreenName: String) {
viewModelScope.safeLaunch(Dispatchers.IO) {
val codeVerifier = generateRandomString(RANDOM_STRING_LENGTH)
val codeChallenger = generateSHA256Hash(codeVerifier)
val response =
repository.fetchTemporarySessionToken(
codeChallenger = codeChallenger,
appSessionToken = BaseUtils.getSessionToken().toString()
appSessionToken = BaseUtils.getSessionToken().toString(),
metricInfo =
MetricInfo.LEMetric(
screen = naeScreenName,
isNae = { !it.isValidResponse() }
)
)
if (response.isValidResponse()) {
generateUrlForWebRedirect(codeVerifier, response.data?.code.toString()).let {

View File

@@ -108,7 +108,7 @@ class CRMWebViewActivity : BaseActivity() {
viewModel.showError.value = true
} else {
viewModel.showLoader.value = false
viewModel.getCrmWebViewUrl(pathUrl = pathUrl.toString())
viewModel.getCrmWebViewUrl(pathUrl = pathUrl.toString(), naeScreenName = screenName)
}
initObservers()

View File

@@ -51,6 +51,7 @@ import com.navi.chat.utils.WEB
import com.navi.common.CommonLibManager
import com.navi.common.awsupload.FileDownloadManager
import com.navi.common.awsupload.model.DownloadTask
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.constants.APP_VERSION_CODE
import com.navi.common.constants.OS_VERSION_NAME
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
@@ -88,14 +89,19 @@ constructor(
val showError: MutableLiveData<Boolean>
get() = _showError
fun getCrmWebViewUrl(pathUrl: String) {
fun getCrmWebViewUrl(pathUrl: String, naeScreenName: String) {
viewModelScope.safeLaunch(Dispatchers.IO) {
val codeVerifier = generateRandomString(32)
val codeChallenger = generateSHA256Hash(codeVerifier)
val response =
webRedirectionRepository.fetchTemporarySessionToken(
codeChallenger = codeChallenger,
appSessionToken = BaseUtils.getSessionToken().toString()
appSessionToken = BaseUtils.getSessionToken().toString(),
metricInfo =
MetricInfo.ChatMetric(
screen = naeScreenName,
isNae = { !it.isValidResponse() }
)
)
val crmWebViewUrl =

View File

@@ -125,6 +125,13 @@ sealed class MetricInfo<T>(
isNae = isNae
)
data class LEMetric<T>(
override val screen: String,
override val isNae: (RepoResult<T>) -> Boolean = {
it.error != null || !it.errors.isNullOrEmpty()
},
) : MetricInfo<RepoResult<T>>(screen = screen, vertical = ModuleNameV2.LE.name, isNae = isNae)
data class CommonMetric<T>(
override val screen: String,
override val isNae: (RepoResult<T>) -> Boolean = {
@@ -210,6 +217,22 @@ sealed class MetricInfo<T>(
defaultNaeDefinition = { !it.isSuccess() }
)
}
ModuleNameV2.LE.name,
ModuleNameV2.PL.name,
ModuleNameV2.HL.name -> {
getVerticalNae(
requestMethod = apiRequestMethod,
isNaeDefinition = { !it.isSuccessWithData() },
defaultNaeDefinition = { !it.isSuccess() }
)
}
ModuleNameV2.CHAT.name -> {
getVerticalNae(
requestMethod = apiRequestMethod,
isNaeDefinition = { !it.isSuccessWithData() },
defaultNaeDefinition = { !it.isSuccess() }
)
}
else -> {
getVerticalNae(
requestMethod = apiRequestMethod,
@@ -229,6 +252,10 @@ sealed class MetricInfo<T>(
ModuleNameV2.REWARDS.name -> RewardMetric(screenName, isNae)
ModuleNameV2.App.name -> AppMetric(screenName, isNae)
ModuleNameV2.GOLD.name -> GoldMetric(screenName, isNae)
ModuleNameV2.LE.name,
ModuleNameV2.PL.name,
ModuleNameV2.HL.name -> LEMetric(screenName, isNae)
ModuleNameV2.CHAT.name -> ChatMetric(screenName, isNae)
else -> CommonMetric(screenName, isNae)
}
}

View File

@@ -10,6 +10,7 @@ package com.navi.common.model
enum class ModuleNameV2 {
APP_SHELL,
CYCS,
LE,
PL, // For Personal Loan Activities
HL, // For Home Loan Activities
AMC, // For AMC Activities

View File

@@ -7,12 +7,16 @@
package com.navi.common.repo
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.network.retrofit.ResponseCallback
import com.navi.common.utils.retrofitService
import javax.inject.Inject
class FirebaseAuthRepository @Inject constructor() : ResponseCallback() {
suspend fun fetchFirebaseAuthToken() =
apiResponseCallback(retrofitService().generateFirebaseAuthToken())
suspend fun fetchFirebaseAuthToken(naeScreenName: String) =
apiResponseCallback(
retrofitService().generateFirebaseAuthToken(),
metricInfo = MetricInfo.CommonMetric(screen = naeScreenName, isNae = { false })
)
}

View File

@@ -45,7 +45,7 @@ class FirebaseAuthHelper @Inject constructor(private val repository: FirebaseAut
private fun fetchFirebaseAuthToken(onAuth: (authStatus: FirebaseAuthStatus) -> Unit) {
coroutineScope.launch {
val tokenData = repository.fetchFirebaseAuthToken()
val tokenData = repository.fetchFirebaseAuthToken(naeScreenName = "FirebaseAuthHelper")
if (tokenData.error == null && tokenData.errors.isNullOrEmpty()) {
tokenData.data?.authToken?.let { refreshFirebaseToken(it, onAuth) }
} else {

View File

@@ -7,6 +7,7 @@
package com.navi.common.webredirection.data
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.network.models.RedirectionAuthTokenRequest
import com.navi.common.network.models.RedirectionAuthTokenResponse
import com.navi.common.network.models.RepoResult
@@ -21,7 +22,8 @@ class WebRedirectionRepository @Inject constructor(private val retrofitService:
suspend fun fetchTemporarySessionToken(
codeChallenger: String,
appSessionToken: String,
codeChallengeMethod: String = Constants.SHA_256
codeChallengeMethod: String = Constants.SHA_256,
metricInfo: MetricInfo<RepoResult<RedirectionAuthTokenResponse>>
): RepoResult<RedirectionAuthTokenResponse> {
return apiResponseCallback(
retrofitService.fetchTemporarySessionToken(
@@ -30,7 +32,8 @@ class WebRedirectionRepository @Inject constructor(private val retrofitService:
sessionToken = appSessionToken,
codeChallengeMethod = codeChallengeMethod
)
)
),
metricInfo = metricInfo
)
}
}