NTP-4550 | Investement tab downtime handeling (#12942)

Co-authored-by: saksham <saksham>
This commit is contained in:
Saksham Mahajan
2024-10-09 11:43:47 +05:30
committed by GitHub
parent 0554ca6c67
commit ee21188f04
18 changed files with 265 additions and 49 deletions

View File

@@ -639,7 +639,7 @@ class HomePageActivity :
}
}
private fun getNudgeDataForInternetDisconnected() =
fun getNudgeDataForInternetDisconnected() =
NetworkConnectivityNudgeData(
title = NaviTextComponent(text = Constants.NetworkConnectivity.DISCONNECTED_TITLE_TEXT),
titleColor = Constants.NetworkConnectivity.DISCONNECTED_TITLE_COLOR,

View File

@@ -17,6 +17,7 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.dashboard.viewmodels.DashboardSharedVM
import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper
import com.naviapp.home.compose.activity.HomePageActivity
@@ -39,7 +40,8 @@ fun HomeContentNavHost(
investmentListState: () -> LazyListState,
screenOverlayVM: ScreenOverlayVM,
handleAppUpdate: () -> Unit,
hopper: Hopper
hopper: Hopper,
bottomNavBarVM: BottomNavBarVM
) {
NavHost(
navController = navController,
@@ -62,7 +64,8 @@ fun HomeContentNavHost(
screenOverlayVM = screenOverlayVM,
hopper = hopper,
homeVM = homeViewModel,
handleAppUpdate = handleAppUpdate
handleAppUpdate = handleAppUpdate,
bottomNavBarVM = bottomNavBarVM
)
}
}

View File

@@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.dashboard.viewmodels.DashboardSharedVM
import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper
import com.naviapp.home.compose.activity.HomePageActivity
@@ -43,7 +44,8 @@ fun NavGraphNavigationItem(
naviHomeAnalytics: NaviAnalytics.Home,
investmentListState: () -> LazyListState,
screenOverlayVM: ScreenOverlayVM,
hopper: Hopper
hopper: Hopper,
bottomNavBarVM: BottomNavBarVM
) {
when (tabId) {
NavigationItem.Home.tabId ->
@@ -67,7 +69,8 @@ fun NavGraphNavigationItem(
.statusBarsPadding()
.background(Color.White),
sharedVM = sharedVM,
hopper = hopper
hopper = hopper,
bottomNavBarVM = bottomNavBarVM
)
NavigationItem.Loan.tabId ->
LoansTabScreen(

View File

@@ -12,9 +12,11 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -32,10 +34,12 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.navi.base.model.ActionData
import com.navi.common.model.common.AppUpdateData
import com.navi.common.model.common.InvestmentTabNudgeData
import com.navi.common.model.common.NetworkConnectivityNudgeData
import com.navi.design.font.FontWeightEnum
import com.navi.design.theme.FF191919
import com.navi.design.theme.FF1F002A
import com.navi.design.theme.FF444444
import com.navi.design.theme.getFontWeight
import com.navi.design.theme.ttComposeFontFamily
import com.navi.design.utils.parseColorSafe
@@ -65,6 +69,9 @@ fun BottomStickyNudgeUI(
bottomNudgeOnClick = bottomNudgeOnClick
)
}
is BottomStickyNudgeState.InvestmentTabNudgeState -> {
InvestmentTabNudge(data = nudgeState.investmentTabNudgeData)
}
null -> {}
}
}
@@ -171,3 +178,49 @@ fun AppUpdateBottomStickyNudge(data: AppUpdateData, bottomNudgeOnClick: (ActionD
}
}
}
@Composable
fun InvestmentTabNudge(data: InvestmentTabNudgeData? = null) {
data?.let {
Row(
modifier =
Modifier.fillMaxWidth().background(color = Color(data.bgColor.parseColorSafe())),
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier.padding(vertical = 16.dp, horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
ImageFromIconCodeOrUrl(iconCode = data.iconCode, modifier = Modifier.size(32.dp))
Spacer(modifier = Modifier.width(8.dp))
Column {
NaviText(
text = data.title ?: EMPTY,
color = FF191919,
fontWeight = getFontWeight(FontWeightEnum.TT_SEMI_BOLD),
style =
TextStyle(
fontSize = 14.sp,
fontFamily = ttComposeFontFamily,
lineHeight = 22.sp
),
modifier = Modifier.height(22.dp)
)
NaviText(
text = data.subtitle ?: EMPTY,
color = FF444444,
fontWeight = getFontWeight(FontWeightEnum.TT_MEDIUM),
style =
TextStyle(
fontSize = 12.sp,
fontFamily = ttComposeFontFamily,
lineHeight = 18.sp
),
modifier = Modifier.height(18.dp)
)
}
}
}
}
}

View File

@@ -56,7 +56,6 @@ fun HomeFooterRoot(
) {
val bottomStickyNudgeData by bottomNavBarVM.bottomStickyNudgeData.collectAsStateWithLifecycle()
val bottomNavBarState by sharedVM.bottomNavBarStateHolder.collectAsStateWithLifecycle()
val isHomeTabSelected = remember(selectedTabId) { selectedTabId == BottomBarTabType.HOME.name }
val showAppUpdateStrip = remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
@@ -70,7 +69,6 @@ fun HomeFooterRoot(
},
selectedTabId = selectedTabId,
bottomNudgeData = bottomStickyNudgeData,
isHomeTabSelected = isHomeTabSelected,
state =
HomeFooterStates(
showSnackBar = homeScreenSnackBarState,
@@ -100,7 +98,6 @@ fun HomeFooter(
modifier: Modifier,
selectedTabId: String,
bottomNudgeData: BottomStickyNudgeData? = null,
isHomeTabSelected: Boolean,
state: HomeFooterStates,
nudgeState: () -> NudgeState,
nudgeUitronRenderer: @Composable (UiTronResponse?) -> Unit,
@@ -113,26 +110,43 @@ fun HomeFooter(
if (state.showSnackBar) {
AppInstallSnackBar { onFooterEvent(HomeFooterEvents.SnackBarOnClick) }
}
if (isHomeTabSelected) {
NudgeContainer(
state = nudgeState,
nudgeUitronRenderer = nudgeUitronRenderer,
onNudgeEvent = onNudgeEvent,
onNudgeEffect = onNudgeEffect
)
bottomNudgeData?.let {
if (it.visible) {
BottomStickyNudgeUI(
showAppUpdateStrip = showAppUpdateStrip,
modifier = Modifier.fillMaxWidth(),
nudgeState = it.bottomStickyNudgeState,
bottomNudgeOnClick = { actionData ->
onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData))
}
)
when (selectedTabId) {
BottomBarTabType.HOME.name -> {
NudgeContainer(
state = nudgeState,
nudgeUitronRenderer = nudgeUitronRenderer,
onNudgeEvent = onNudgeEvent,
onNudgeEffect = onNudgeEffect
)
bottomNudgeData?.let {
if (it.visible) {
BottomStickyNudgeUI(
showAppUpdateStrip = showAppUpdateStrip,
modifier = Modifier.fillMaxWidth(),
nudgeState = it.bottomStickyNudgeState,
bottomNudgeOnClick = { actionData ->
onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData))
}
)
}
}
}
BottomBarTabType.INVESTMENT.name -> {
bottomNudgeData?.let {
if (it.visible) {
BottomStickyNudgeUI(
showAppUpdateStrip = showAppUpdateStrip,
modifier = Modifier.fillMaxWidth(),
nudgeState = it.bottomStickyNudgeState,
bottomNudgeOnClick = { actionData ->
onFooterEvent(HomeFooterEvents.BottomNudgeOnClick(actionData))
}
)
}
}
}
}
HomeBottomBar(
selectedTabId = selectedTabId,
bottomNavBarState = { state.bottomNavBarState },

View File

@@ -128,7 +128,8 @@ fun HomeContentFrame(
inAppUpdateVM = inAppUpdateVM
)
)
}
},
bottomNavBarVM = bottomNavBarVM,
)
},
footer = {

View File

@@ -8,6 +8,7 @@
package com.naviapp.home.compose.model
import com.navi.common.model.common.AppUpdateData
import com.navi.common.model.common.InvestmentTabNudgeData
import com.navi.common.model.common.NetworkConnectivityNudgeData
sealed class BottomStickyNudgeState {
@@ -16,4 +17,7 @@ sealed class BottomStickyNudgeState {
class NetworkConnectivityNudgeState(val networkConnectivityData: NetworkConnectivityNudgeData) :
BottomStickyNudgeState()
class InvestmentTabNudgeState(val investmentTabNudgeData: InvestmentTabNudgeData?) :
BottomStickyNudgeState()
}

View File

@@ -6,6 +6,7 @@
*/
import com.google.gson.annotations.SerializedName
import com.navi.common.model.common.InvestmentTabNudgeData
import com.navi.naviwidgets.models.response.FloatingButtonData
import com.naviapp.forge.model.ScreenStructure
import com.naviapp.home.dashboard.models.response.GenericComposableWidgetInfo
@@ -15,4 +16,6 @@ data class InvestmentTabResponse(
@SerializedName("screenStructure") var screenStructure: ScreenStructure? = null,
@SerializedName("content") var content: List<GenericComposableWidgetInfo>? = null,
@SerializedName("floatingButtonData") var floatingButtonData: FloatingButtonData? = null,
@SerializedName("bottomStickyNudgeData")
var bottomStickyNudgeData: InvestmentTabNudgeData? = null
)

View File

@@ -7,6 +7,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.home.compose.activity.HomePageActivity
import com.naviapp.home.dashboard.ui.compose.investmentTab.InitLifeCycleListener
import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper
@@ -17,12 +18,14 @@ import com.naviapp.home.utils.InvestmentTabEvents
fun InitInvestmentsScreenComponents(
activity: HomePageActivity,
investmentsTabVM: InvestmentsVm,
investmentsScreenHelper: InvestmentsScreenHelper
investmentsScreenHelper: InvestmentsScreenHelper,
bottomNavBarVM: BottomNavBarVM
) {
InitLifeCycleListener(
investmentsTabVM = investmentsTabVM,
investmentsScreenHelper = investmentsScreenHelper
investmentsScreenHelper = investmentsScreenHelper,
bottomNavBarVM = bottomNavBarVM
)
LaunchedEffect(Unit) {

View File

@@ -12,12 +12,14 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.home.dashboard.viewmodels.InvestmentsVm
@Composable
fun InitLifeCycleListener(
investmentsTabVM: InvestmentsVm,
investmentsScreenHelper: InvestmentsScreenHelper
investmentsScreenHelper: InvestmentsScreenHelper,
bottomNavBarVM: BottomNavBarVM
) {
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(key1 = lifecycleOwner) {
@@ -28,6 +30,7 @@ fun InitLifeCycleListener(
}
Lifecycle.Event.ON_STOP -> {
investmentsTabVM.onCutOffTimerClear()
bottomNavBarVM.setBottomNudge(false, null)
}
else -> {}
}

View File

@@ -15,6 +15,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.navi.common.ui.errorview.FullScreenErrorComposeView
import com.navi.common.utils.setStatusBarColorInt
import com.navi.design.utils.parseColorSafe
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper
import com.naviapp.home.compose.activity.HomePageActivity
import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper
@@ -29,7 +30,8 @@ fun InvestmentsScreen(
activity: HomePageActivity,
modifier: Modifier = Modifier,
sharedVM: SharedVM,
hopper: Hopper
hopper: Hopper,
bottomNavBarVM: BottomNavBarVM
) {
val investmentsTabVm by lazy { ViewModelProvider(activity)[InvestmentsVm::class.java] }
val investmentsScreenData =
@@ -40,7 +42,8 @@ fun InvestmentsScreen(
InitInvestmentsScreenComponents(
activity = context,
investmentsTabVM = investmentsTabVm,
investmentsScreenHelper = investmentsScreenHelper
investmentsScreenHelper = investmentsScreenHelper,
bottomNavBarVM = bottomNavBarVM
)
Box(modifier = modifier) {
@@ -64,7 +67,8 @@ fun InvestmentsScreen(
sharedVM = sharedVM,
hopper = hopper,
toggleStatusBarColor = { toggleStatusBarColor(activity, it) },
investmentsScreenHelper = investmentsScreenHelper
investmentsScreenHelper = investmentsScreenHelper,
bottomNavBarVM = bottomNavBarVM
)
}
}

View File

@@ -19,6 +19,7 @@ import com.navi.base.model.ActionData
import com.navi.base.model.CtaData
import com.navi.base.model.GenericAnalytics
import com.navi.base.utils.orFalse
import com.navi.common.model.common.InvestmentTabNudgeData
import com.navi.common.utils.toCtaData
import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper
import com.naviapp.home.compose.activity.HomePageActivity
@@ -30,6 +31,9 @@ import com.naviapp.home.model.HpBottomSheetState
import com.naviapp.home.model.InvestmentBottomSheetData
import com.naviapp.home.viewmodel.SharedVM
import com.naviapp.utils.Constants
import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_COLOR
import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_ICON
import com.naviapp.utils.Constants.INVESTMENT_TAB_BOTTOM_NUDGE_TITLE
class InvestmentsScreenHelper {
fun refreshInvestmentTabScreen(investmentsTabVm: InvestmentsVm) {
@@ -132,4 +136,12 @@ class InvestmentsScreenHelper {
)
}
}
fun getBottomStickyNudgeData(): InvestmentTabNudgeData {
return InvestmentTabNudgeData(
title = INVESTMENT_TAB_BOTTOM_NUDGE_TITLE,
bgColor = INVESTMENT_TAB_BOTTOM_NUDGE_COLOR,
iconCode = INVESTMENT_TAB_BOTTOM_NUDGE_ICON
)
}
}

View File

@@ -17,24 +17,29 @@ import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.navi.base.utils.ConnectivityObserver
import com.navi.base.utils.ConnectivityObserverImpl
import com.navi.base.utils.isNotNull
import com.navi.common.utils.parseColor
import com.navi.common.utils.setStatusBarColorInt
import com.navi.common.utils.toActionData
import com.navi.design.utils.parseColorSafe
import com.navi.naviwidgets.extensions.FloatingButtonOverlay
import com.navi.naviwidgets.extensions.isScrollingDown
import com.naviapp.R
import com.naviapp.common.viewmodel.BottomNavBarVM
import com.naviapp.home.common.hopperProcessor.processHandlerImpl.Hopper
import com.naviapp.home.compose.activity.HomePageActivity
import com.naviapp.home.compose.model.BottomStickyNudgeState
import com.naviapp.home.dashboard.viewmodels.InvestmentsVm
import com.naviapp.home.viewmodel.SharedVM
import com.naviapp.utils.Constants.LAST_UPDATED
import com.naviapp.utils.Constants.RANK_OF_SECTION
import com.naviapp.utils.Constants.WHITE_COLOR
import com.naviapp.utils.formatTimeStamp
import kotlinx.coroutines.flow.distinctUntilChanged
@OptIn(ExperimentalFoundationApi::class)
@@ -46,13 +51,18 @@ fun InvestmentsTab(
investmentsScreenHelper: InvestmentsScreenHelper,
hopper: Hopper,
toggleStatusBarColor: (String) -> Unit,
bottomNavBarVM: BottomNavBarVM
) {
val connectivityObserver: ConnectivityObserver by lazy {
ConnectivityObserverImpl(context = activity)
}
val investmentsTabScreenData =
investmentsTabVm.investmentsTabScreenData.collectAsStateWithLifecycle()
val scrollState = rememberLazyListState()
val statusBarColor = investmentsTabVm.statusBarColor.collectAsStateWithLifecycle()
val bottomStickyNudgeData = investmentsTabVm.bottomStickyNudgeData.collectAsStateWithLifecycle()
LaunchedEffect(remember { derivedStateOf { scrollState.firstVisibleItemIndex } }) {
LaunchedEffect(scrollState.firstVisibleItemIndex) {
snapshotFlow { scrollState.firstVisibleItemIndex }
.distinctUntilChanged()
.collect { firstVisibleItemIndex ->
@@ -65,7 +75,31 @@ fun InvestmentsTab(
}
LaunchedEffect(key1 = statusBarColor.value) {
activity.setStatusBarColorInt(statusBarColor.value.parseColorSafe())
activity.setStatusBarColorInt(statusBarColor.value.parseColor())
}
LaunchedEffect(key1 = investmentsTabScreenData.value) {
if (connectivityObserver.isInternetConnected().not()) {
bottomNavBarVM.setBottomNudge(
visible = true,
bottomStickyNudgeState =
BottomStickyNudgeState.NetworkConnectivityNudgeState(
activity.getNudgeDataForInternetDisconnected()
)
)
} else {
bottomNavBarVM.setBottomNudge(
visible = bottomStickyNudgeData.isNotNull(),
bottomStickyNudgeState =
BottomStickyNudgeState.InvestmentTabNudgeState(
bottomStickyNudgeData.value?.copy(
subtitle =
LAST_UPDATED +
investmentsTabVm.getLastUpdatedTime().formatTimeStamp()
)
)
)
}
}
investmentsTabScreenData.value.let { state ->

View File

@@ -20,8 +20,10 @@ import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.base.cache.util.NaviSharedDbKeys
import com.navi.base.model.CtaData
import com.navi.base.utils.isNotNull
import com.navi.base.utils.orFalse
import com.navi.common.model.ModuleNameV2
import com.navi.common.model.common.InvestmentTabNudgeData
import com.navi.common.network.models.ErrorUnifiedResponse
import com.navi.common.network.models.GenericErrorResponse
import com.navi.common.utils.isValidResponse
@@ -33,6 +35,7 @@ import com.naviapp.home.dashboard.models.investmentTabWidgetData.CutOffSlotData
import com.naviapp.home.dashboard.models.investmentTabWidgetData.CutOffTimerWidget
import com.naviapp.home.dashboard.models.response.GenericComposableWidgetInfo
import com.naviapp.home.dashboard.repo.InvestmentsTabRepository
import com.naviapp.home.dashboard.ui.compose.investmentTab.InvestmentsScreenHelper
import com.naviapp.home.utils.InvestmentTabEvents
import com.naviapp.home.utils.Timer
import com.naviapp.network.di.DataDeserializers
@@ -109,6 +112,10 @@ constructor(
private val eventFiredMap: HashMap<String, Boolean> =
InvestmentTabEvents.getAllEvents().associateWith { false } as HashMap<String, Boolean>
private val _bottomStickyNudgeData = MutableStateFlow<InvestmentTabNudgeData?>(null)
val bottomStickyNudgeData: StateFlow<InvestmentTabNudgeData?>
get() = _bottomStickyNudgeData
fun setTimerChangeData(data: String?) {
_cutOffTimerDataChange.value = data
}
@@ -207,20 +214,41 @@ constructor(
if (response.isValidResponse()) {
response.data?.let { data ->
_statusBarColor.emit(data.metaData?.get(STATUS_BAR_COLOR) ?: YELLOW_COLOR)
val investmentsTabResponse =
InvestmentTabResponse().apply {
metaData = data.metaData
screenStructure = data.screenStructure
content = data.content
floatingButtonData = data.floatingButtonData
data.bottomStickyNudgeData?.let {
_bottomStickyNudgeData.update { data.bottomStickyNudgeData }
if (isInvestmentTabPresentInCache()) {
setInvestmentTabResponseFromCache()
} else {
val investmentsTabResponse =
InvestmentTabResponse().apply {
metaData = data.metaData
screenStructure = data.screenStructure
content = data.content
floatingButtonData = data.floatingButtonData
bottomStickyNudgeData = data.bottomStickyNudgeData
}
_investmentsTabScreenData.update {
InvestmentsTabScreenState.Success(data = investmentsTabResponse)
}
}
_investmentsTabScreenData.update {
InvestmentsTabScreenState.Success(data = investmentsTabResponse)
}
saveInvestmentsTabResponseInCache(
data.content,
NaviSharedDbKeys.INVESTMENT_TAB.keyName
)
?: run {
val investmentsTabResponse =
InvestmentTabResponse().apply {
metaData = data.metaData
screenStructure = data.screenStructure
content = data.content
floatingButtonData = data.floatingButtonData
bottomStickyNudgeData = data.bottomStickyNudgeData
}
_investmentsTabScreenData.update {
InvestmentsTabScreenState.Success(data = investmentsTabResponse)
}
saveInvestmentsTabResponseInCache(
data.content,
NaviSharedDbKeys.INVESTMENT_TAB.keyName
)
}
}
} else {
val errorUnifiedResponse =
@@ -230,10 +258,19 @@ constructor(
errorUnifiedResponse,
ModuleNameV2.AMC.name
)
if (isInvestmentTabPresentInCache()) {
_bottomStickyNudgeData.update {
InvestmentsScreenHelper().getBottomStickyNudgeData()
}
}
setInvestmentTabResponseFromCache()
}
}
private suspend fun isInvestmentTabPresentInCache(): Boolean {
return naviCacheRepository.get(NaviSharedDbKeys.INVESTMENT_TAB.keyName).isNotNull()
}
private suspend fun saveInvestmentsTabResponseInCache(
investmentTabResponse: List<GenericComposableWidgetInfo>? = null,
cacheKey: String
@@ -313,6 +350,10 @@ constructor(
eventFiredMap[eventName] = true
}
suspend fun getLastUpdatedTime(): Long {
return naviCacheRepository.getLastUpdatedTime(NaviSharedDbKeys.INVESTMENT_TAB.keyName)
}
sealed interface InvestmentsTabScreenState {
data object Loading : InvestmentsTabScreenState

View File

@@ -489,6 +489,11 @@ object Constants {
const val DEV_ANR_LISTENER = "dev_anr_listener"
const val NEW_ANR_LISTENER = "newAnrHandler"
const val ANR_MONITOR_INTERRUPTED = "anr_monitor_interrupted"
const val LAST_UPDATED = "Last updated "
const val INVESTMENT_TAB_BOTTOM_NUDGE_TITLE = "You might be viewing old data"
const val INVESTMENT_TAB_BOTTOM_NUDGE_COLOR = "#E9E7F0"
const val INVESTMENT_TAB_BOTTOM_NUDGE_ICON =
"https://amc-public-assets.s3.ap-south-1.amazonaws.com/investment-tab/investment_tab_bottom_bar_image.png"
// TODO: Remove these constants once delayed onboarding goes 100%
const val CHECK_BALANCE_ROW = "checkBalanceRow"

View File

@@ -73,6 +73,9 @@ import com.naviapp.utils.Constants.INR
import java.net.URLEncoder
import java.nio.charset.StandardCharsets
import java.text.DecimalFormat
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import org.joda.time.LocalDate
import org.json.JSONObject
@@ -570,3 +573,9 @@ fun Map<String, String>.getEncodedParamsForUrl(): String {
}
.joinToString(AMPERSAND)
}
fun Long.formatTimeStamp(): String {
val date = Date(this)
val formatter = SimpleDateFormat("dd MMM, h:mm a", Locale.getDefault())
return formatter.format(date)
}

View File

@@ -66,6 +66,8 @@ interface NaviCacheRepository {
return currentData.version == altData.version && currentDataValue == altDataValue
}
): Flow<NaviCacheEntityInfo?>
suspend fun getLastUpdatedTime(key: String): Long
}
class NaviCacheRepositoryImpl @Inject constructor(private val naviCacheDao: NaviCacheDao) :
@@ -285,4 +287,8 @@ class NaviCacheRepositoryImpl @Inject constructor(private val naviCacheDao: Navi
return true
}
override suspend fun getLastUpdatedTime(key: String): Long {
return naviCacheDao.get(key = key)?.updatedAt ?: -1
}
}

View File

@@ -0,0 +1,18 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.common.model.common
import com.navi.base.model.GenericAnalytics
data class InvestmentTabNudgeData(
val title: String? = null,
val subtitle: String? = null,
val bgColor: String? = null,
val metaData: GenericAnalytics? = null,
val iconCode: String? = null
)