NTP-42969 | Gold first investment reward migration (#15248)

Co-authored-by: Varun Jain <varun.jain@navi.com>
This commit is contained in:
Ayushman Sharma
2025-03-05 15:20:26 +05:30
committed by GitHub
parent baeb8f43d5
commit 3e03ea40d8
5 changed files with 79 additions and 26 deletions

View File

@@ -72,7 +72,7 @@ data class ExtraDataDetails(
@SerializedName("sipInfo") val sipInfo: SipInfo? = null,
@SerializedName("loaderScreen") val loaderScreen: ActionCheckResponse? = null,
@SerializedName("isUserInvested") val isUserInvested: Boolean? = null,
@SerializedName("isScratchCardEnabled") val isScratchCardEnabled: Boolean? = null,
@SerializedName("reward") val reward: Reward? = null,
) : Parcelable
@Parcelize data class CacheConfig(val ttl: Long? = 0, val maxConsumptions: Int? = 0) : Parcelable
@@ -154,3 +154,12 @@ data class SipInfo(
@SerializedName("installmentDate") val installmentDate: Int? = null,
@SerializedName("source") val source: String? = null,
) : Parcelable
@Parcelize
data class Reward(
@SerializedName("isScratchCardEnabled") val isScratchCardEnabled: Boolean? = null,
@SerializedName("actionData") val actionData: ActionData? = null,
@SerializedName("sourceType") val sourceType: String? = null,
@SerializedName("scratchCardRewardType") val scratchCardRewardType: String? = null,
@SerializedName("rewardEventId") val rewardEventId: String? = null,
) : Parcelable

View File

@@ -67,6 +67,9 @@ import com.navi.gold.util.CommonUtils.updateColorsBasedOnPosition
import com.navi.gold.util.Constants
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY
import com.navi.gold.util.Constants.CSAT_POPUP_DELAY_TIME
import com.navi.gold.util.Constants.GOLD_FIRST_INVESTMENT
import com.navi.gold.util.Constants.NAVI_UPI_TXN
import com.navi.gold.util.Constants.NONE
import com.navi.gold.util.Constants.REDIRECTION_SOURCE
import com.navi.gold.util.Constants.SHOW_REWARD_GRATIFICATION
import com.navi.gold.util.Constants.TYPE
@@ -256,19 +259,7 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
}
?: run {
setPageContent(widgetResponse)
widgetResponse.extraData?.screenDefinition?.let { screenDefinition ->
val gratificationFragment =
GratificationFragment.getInstance(
gratificationData = Gson().toJson(screenDefinition),
screenName = screenName,
dialogDismissListener = {
csatPopupDelay = 500
startCsat(csatPopupDelay)
},
)
safelyOpenFragment(gratificationFragment, GratificationFragment.TAG)
} ?: run { handleScratchCardResponse(widgetResponse) }
handleScratchCardResponse(widgetResponse)
}
widgetResponse.extraData?.launchToastInfo?.contentWidget?.let { toastWidgets ->
@@ -291,21 +282,38 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
viewModel.scratchCardResponse.observe(this@DigitalGoldTransactionActivity) {
scratchCardResponse ->
scratchCardSharedVm.setScratchCardScreenData(scratchCardResponse.data)
scratchCardResponse?.data?.scratchCardResponse?.rewardForm?.let { rewardForm ->
when (rewardForm) {
NONE -> {
scratchCardSharedVm.setScratchCardScreenData(scratchCardResponse.data)
val scratchCardFragment =
ScratchCardFragment.getInstance(
screenName = screenName,
dialogDismissListener = { startCsat(CSAT_POPUP_DELAY_TIME) },
)
val scratchCardFragment =
ScratchCardFragment.getInstance(
screenName = screenName,
dialogDismissListener = { startCsat(CSAT_POPUP_DELAY_TIME) },
)
safelyOpenFragment(scratchCardFragment, ScratchCardFragment.TAG)
safelyOpenFragment(scratchCardFragment, ScratchCardFragment.TAG)
}
else -> {
val gratificationFragment =
GratificationFragment.getInstance(
gratificationData =
Gson().toJson(scratchCardResponse.data.screenDefinition),
screenName = screenName,
dialogDismissListener = { startCsat(CSAT_POPUP_DELAY_TIME) },
)
safelyOpenFragment(gratificationFragment, GratificationFragment.TAG)
}
}
}
}
}
}
private fun handleScratchCardResponse(widgetResponse: WidgetResponse) {
if (widgetResponse.extraData?.isScratchCardEnabled.orFalse()) {
if (widgetResponse.extraData?.reward?.isScratchCardEnabled.orFalse()) {
fetchScratchCardData()
} else {
startCsat(CSAT_POPUP_DELAY_TIME)
@@ -313,9 +321,29 @@ class DigitalGoldTransactionActivity : BaseActivity(), WidgetCallback, CsatCompl
}
private fun fetchScratchCardData() {
intent.getStringExtra(UPI_REQUEST_ID)?.let {
viewModel.fetchScratchCardData(naviUpiRequestId = it, screenName = screenName)
intent.removeExtra(UPI_REQUEST_ID)
viewModel.digitalGoldTransactionWidgets.value?.extraData?.reward?.let { rewardData ->
val rewardEventId =
when (rewardData.scratchCardRewardType) {
GOLD_FIRST_INVESTMENT -> {
rewardData.rewardEventId
}
NAVI_UPI_TXN -> {
intent.getStringExtra(UPI_REQUEST_ID)?.let { rewardEventId ->
intent.removeExtra(UPI_REQUEST_ID)
rewardEventId
}
}
else -> {
null
}
}
rewardEventId?.let {
viewModel.fetchScratchCardOrGratificationData(
naviUpiRequestId = rewardEventId,
screenName = screenName,
)
}
}
}

View File

@@ -83,4 +83,8 @@ object Constants {
const val DIGITAL_GOLD_PAYMENT = "DIGITAL_GOLD_PAYMENT"
const val GOLD_OFFER_BOTTOM_SHEET = "GOLD_OFFER_BOTTOM_SHEET"
const val SHOW_OFFER_BOTTOMSHEET = "SHOW_OFFER_BOTTOMSHEET"
const val SCRATCH_CARD = "SCRATCH_CARD"
const val NONE = "NONE"
const val GOLD_FIRST_INVESTMENT = "GOLD_FIRST_INVESTMENT"
const val NAVI_UPI_TXN = "NAVI_UPI_TXN"
}

View File

@@ -192,7 +192,7 @@ constructor(
this.isAutoClickConsumed = true
}
fun fetchScratchCardData(naviUpiRequestId: String, screenName: String) {
fun fetchScratchCardOrGratificationData(naviUpiRequestId: String, screenName: String) {
viewModelScope.launch(Dispatchers.IO) {
scratchCardNudgeHelper
.getGratification(requestId = naviUpiRequestId, screenName = screenName)

View File

@@ -13,6 +13,7 @@ import com.navi.base.cache.repository.NaviCacheRepository
import com.navi.base.sharedpref.CommonPrefConstants
import com.navi.base.sharedpref.PreferenceManager
import com.navi.base.utils.FirestoreDataProviderImpl
import com.navi.base.utils.isNotNull
import com.navi.common.checkmate.model.MetricInfo
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.UPI_SCRATCH_CARD_REWARDS_POLLING_CONFIG
@@ -328,6 +329,7 @@ constructor(
amount = scratchCardData?.metadata?.subtitle,
rewardType = scratchCardData?.rewardType,
template = template,
rewardForm = scratchCardData?.rewardForm,
)
template?.screenStructure?.templates?.get(screenTemplate)?.let {
val inflatedTemplate =
@@ -353,9 +355,17 @@ constructor(
private fun getTemplateName(
amount: String?,
rewardType: String? = null,
rewardForm: String? = null,
template: ScreenDefinition?,
): String? {
val jsonMetaData = template?.jsonMetaData?.get(TEMPLATE_NAME).toJsonObject()
if (rewardForm.isNotNull() && rewardForm == NONE) {
return if (amount != ZERO_AMOUNT) {
jsonMetaData?.optJSONObject(rewardType)?.getString(INSTANT_REWARD)
} else {
null
}
}
return if (amount != ZERO_AMOUNT) {
jsonMetaData?.optJSONObject(rewardType)?.getString(REWARD)
} else {
@@ -373,6 +383,8 @@ constructor(
const val TEMPLATE_NAME = "templateName"
const val REWARD = "REWARD"
const val NO_REWARD = "NO_REWARD"
const val INSTANT_REWARD = "INSTANT_REWARD"
const val NONE = "NONE"
const val ZERO_AMOUNT = "0"
private val POLL_INTERVAL = 1.seconds // TODO("Need to check with product")
private const val MAX_POLL_COUNT = 20 // TODO("Need to check with product")