NTP-4550 | Investement tab downtime handeling (#12942)
Co-authored-by: saksham <saksham>
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -128,7 +128,8 @@ fun HomeContentFrame(
|
||||
inAppUpdateVM = inAppUpdateVM
|
||||
)
|
||||
)
|
||||
}
|
||||
},
|
||||
bottomNavBarVM = bottomNavBarVM,
|
||||
)
|
||||
},
|
||||
footer = {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 -> {}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
Reference in New Issue
Block a user