From f9187534da3d3e86d676bf5aec6758d6fd5a861b Mon Sep 17 00:00:00 2001 From: Kshitij Pramod Ghongadi Date: Wed, 7 May 2025 16:31:15 +0530 Subject: [PATCH] NTP-58776 | GI Unified Error Experience | Auto Retry on Network Restore (#15890) --- .../error-screen/QuoteOfferErrorScreen.tsx | 20 +++ .../navi/base/cache/util/NaviSharedDbKeys.kt | 1 + .../navi/insurance/common/GiBaseActivity.kt | 5 + .../navi/insurance/common/GiBaseFragment.kt | 32 ++++ .../reusable/components/ErrorComposable.kt | 32 ++++ .../health/card/HealthCardsFragment.kt | 38 ++--- .../health/card/HealthCardsViewModel.kt | 40 +++-- .../HomeVisitLandingPageFragment.kt | 20 ++- .../insurance/home_visit/HomeVisitRepo.kt | 1 - .../insurance/home_visit/HomeVisitResponse.kt | 3 +- .../navi/insurance/home_visit/HomeVisitVM.kt | 143 ++++++++++++------ .../navi/insurance/network/ApiErrorTagType.kt | 1 + .../network/retrofit/RetrofitService.kt | 2 +- .../policy/details/PolicyDetailsFragment.kt | 16 +- .../policy/details/PolicyDetailsVM.kt | 54 +------ .../journey/ui/PreQuoteJourneyFragment.kt | 1 + .../ui/fragments/AddAddressFragment.kt | 2 + .../ui/fragments/BankDetailsFragment.kt | 2 + .../ui/fragments/EmailDetailsFragment.kt | 2 + .../ui/fragments/GratificationFragment.kt | 2 + .../ui/fragments/NomineeDetailsFragment.kt | 2 + .../ui/fragments/NomineeListFragment.kt | 2 + .../ui/fragments/NomineeShareEditFragment.kt | 2 + .../ui/fragments/RemoveNomineeFragment.kt | 2 + .../review_policy/PolicyReviewActivity.kt | 1 + .../HealthDeclarationReviewScreen.kt | 4 + .../composables/PolicyReviewScreen.kt | 4 + package-lock.json | 10 ++ package.json | 3 +- 29 files changed, 295 insertions(+), 152 deletions(-) diff --git a/App/Container/Navi-Insurance/screen/quote-offer-screen/error-screen/QuoteOfferErrorScreen.tsx b/App/Container/Navi-Insurance/screen/quote-offer-screen/error-screen/QuoteOfferErrorScreen.tsx index 5edcf4596e..75611b324b 100644 --- a/App/Container/Navi-Insurance/screen/quote-offer-screen/error-screen/QuoteOfferErrorScreen.tsx +++ b/App/Container/Navi-Insurance/screen/quote-offer-screen/error-screen/QuoteOfferErrorScreen.tsx @@ -1,3 +1,8 @@ +import React, { useEffect, useRef, useState } from "react"; +import NetInfo, { + NetInfoState, + useNetInfo, +} from "@react-native-community/netinfo"; import { Text, TouchableOpacity, View } from "react-native"; import { AppImage } from "../../../../../../components/AppImage"; import { StaticHeader } from "../../../../../../components/reusable/static-header/StaticHeader"; @@ -24,13 +29,28 @@ const QuoteOfferErrorScreen = ({ handleClick?: (cta: CtaData) => void; headerProperties: StaticHeaderProperties; }) => { + const netInfo = useNetInfo(); + const lastConnectionStatus = useRef(null); + const onPress = () => { handleActions && handleActions(errorMetaData); }; + + useEffect(() => { + if ( + lastConnectionStatus.current === false && + netInfo.isConnected === true + ) { + onPress(); + } + lastConnectionStatus.current = netInfo.isConnected; + }, [netInfo.isConnected]); + const errorResponse = getErrorResponseFromStatusCode( errorMetaData?.errorStatusCode, errorMetaData?.errorAxiosCode, ); + return ( () + @Inject lateinit var connectivityObserver: ConnectivityObserver + protected val connectivityStateFlow by lazy { connectivityObserver.observe() } + private var previousState: ConnectivityObserver.Status? = + ConnectivityObserver.Status.Unavailable abstract fun getViewModel(): GiBaseVM? @@ -117,6 +126,29 @@ abstract class GiBaseFragment : BaseFragment(), ActionHandler.ActionOwner { showCloseButton: Boolean = true, onCloseButtonClick: () -> Unit, ) { + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + connectivityStateFlow.collect { state -> + val wasDisconnected = + previousState in + listOf( + ConnectivityObserver.Status.Lost, + ConnectivityObserver.Status.Unavailable, + ConnectivityObserver.Status.Losing, + ) + + if ( + wasDisconnected && + state == ConnectivityObserver.Status.Available && + connectivityObserver.isInternetConnected() + ) { + onRetryClick(view.tag) + } + + previousState = state + } + } + } errorMessage?.toNaviErrorPageWidget()?.let { view.setProperties( naviErrorPageWidget = it, diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/reusable/components/ErrorComposable.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/reusable/components/ErrorComposable.kt index e4adde9010..3ac5520ae8 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/reusable/components/ErrorComposable.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/reusable/components/ErrorComposable.kt @@ -10,12 +10,20 @@ package com.navi.insurance.common.reusable.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.viewinterop.AndroidView +import com.navi.base.utils.ConnectivityObserver import com.navi.common.network.models.ErrorMessage import com.navi.common.network.models.toNaviErrorPageWidget import com.navi.naviwidgets.views.NaviErrorPageView +import kotlinx.coroutines.flow.Flow @Composable fun InitErrorView( @@ -24,7 +32,31 @@ fun InitErrorView( onRetryClick: (tag: String?) -> Unit, showCloseButton: Boolean = true, onCloseButtonClick: () -> Unit, + connectivityObserver: Flow? = null, ) { + connectivityObserver?.let { + val connectivityState by + connectivityObserver.collectAsState(initial = ConnectivityObserver.Status.Unavailable) + var previousState by remember { mutableStateOf(null) } + + LaunchedEffect(connectivityState) { + val wasDisconnected = + previousState in + setOf( + ConnectivityObserver.Status.Lost, + ConnectivityObserver.Status.Unavailable, + ConnectivityObserver.Status.Losing, + ) + + if (wasDisconnected && connectivityState == ConnectivityObserver.Status.Available) { + + onRetryClick(view?.tag) + } + + previousState = connectivityState + } + } + errorMessage?.toNaviErrorPageWidget()?.let { view?.setProperties( naviErrorPageWidget = it, diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsFragment.kt index 32a237f2db..c621da524b 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsFragment.kt @@ -31,7 +31,6 @@ import androidx.compose.material.ButtonDefaults import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -49,11 +48,13 @@ import com.navi.base.model.NaviClickAction import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse import com.navi.base.utils.orZero -import com.navi.common.ui.fragment.BaseFragment +import com.navi.common.network.models.ErrorMessage import com.navi.insurance.R import com.navi.insurance.analytics.InsuranceAnalyticsConstants -import com.navi.insurance.analytics.InsuranceAnalyticsHandler import com.navi.insurance.analytics.NaviInsuranceAnalytics +import com.navi.insurance.common.GiBaseFragment +import com.navi.insurance.common.GiBaseVM +import com.navi.insurance.common.reusable.components.InitErrorView import com.navi.insurance.health.activity.BaseActivity import com.navi.insurance.health.composables.HealthCardFooter import com.navi.insurance.health.composables.HealthCardPager @@ -74,13 +75,17 @@ import javax.inject.Inject import kotlinx.coroutines.launch @AndroidEntryPoint -class HealthCardsFragment : BaseFragment(), WidgetCallback { +class HealthCardsFragment : GiBaseFragment(), WidgetCallback { private val viewModel by viewModels() var view: NaviErrorPageView? = null @Inject lateinit var downLoadShareUtil: DownloadShareUtil - @Inject lateinit var analyticsHandler: InsuranceAnalyticsHandler + override fun getViewModel(): GiBaseVM = viewModel + + override fun getRetryAction(errorMessage: ErrorMessage?): (() -> Unit)? = null + + override fun onBackPressed(): Boolean = false override fun onCreateView( inflater: LayoutInflater, @@ -126,8 +131,15 @@ class HealthCardsFragment : BaseFragment(), WidgetCallback { val state = viewModel.healthCardsFlow.collectAsState() Box(modifier = Modifier.fillMaxSize()) { when { - state.value.hasErrorOccured.isTrue() -> { - HandleError() + state.value.hasErrorOccurred.isTrue() -> { + view?.tag = state.value.errorMessage + InitErrorView( + view = view, + errorMessage = state.value.errorResponse, + onRetryClick = { viewModel.fetchHealthCardsResponse() }, + onCloseButtonClick = { requireActivity().finish() }, + connectivityObserver = connectivityStateFlow, + ) } state.value.data.isNotNull() -> { state.value.data?.let { pageResponse -> HealthCardContentScreen(pageResponse) } @@ -238,18 +250,6 @@ class HealthCardsFragment : BaseFragment(), WidgetCallback { AndroidView(modifier = Modifier.fillMaxSize().background(Color.White), factory = { layout }) } - @Composable - fun HandleError() { - LaunchedEffect(Unit) { - initError( - viewModel, - showFullScreenError = true, - dialogDismissClicked = { viewModel.fetchHealthCardsResponse() }, - dialogOnBackPressed = { requireActivity().finish() }, - ) - } - } - override fun onClick(naviClickAction: NaviClickAction, widgetId: String?) { if (naviClickAction is CtaData) { naviClickAction.analyticsEventProperties?.let { analyticsEvent -> diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsViewModel.kt b/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsViewModel.kt index 4fefc45a4a..dec171a8ce 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsViewModel.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/health/card/HealthCardsViewModel.kt @@ -11,9 +11,10 @@ import androidx.lifecycle.viewModelScope import com.navi.base.utils.isNotNull import com.navi.base.utils.isNull import com.navi.common.di.CoroutineDispatcherProvider -import com.navi.common.network.models.ErrorMetaData -import com.navi.common.viewmodel.BaseVM +import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.models.GiErrorMetaData +import com.navi.insurance.common.util.ActionHandler +import com.navi.insurance.models.GIResponseState import com.navi.insurance.network.ApiErrorTagType import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -28,15 +29,19 @@ class HealthCardsViewModel @Inject constructor( private val healthCardsRepository: HealthCardsRepository, + actionHandler: ActionHandler, private val dispatcher: CoroutineDispatcherProvider, -) : BaseVM() { +) : GiBaseVM(actionHandler) { private var policyId: String? = null - private val _healthCardsFlow = MutableStateFlow(HealthCardsScreenState()) - val healthCardsFlow: StateFlow + private val _healthCardsFlow = MutableStateFlow(GIResponseState()) + val healthCardsFlow: StateFlow> get() = _healthCardsFlow.asStateFlow() fun fetchHealthCardsResponse() { - viewModelScope.launch(dispatcher.io) { + viewModelScope.launch( + dispatcher.io + + giBaseExceptionHandler(ApiErrorTagType.HEALTH_CARD_SCREEN_LOAD_ERROR.value) + ) { _healthCardsFlow.update { it.copy(isLoading = true) } val response = healthCardsRepository.fetchHealthCards(policyId = policyId) if ( @@ -49,17 +54,20 @@ constructor( } } else { _healthCardsFlow.update { - it.copy(isLoading = false, data = null, hasErrorOccured = true) + it.copy( + isLoading = false, + data = null, + hasErrorOccurred = true, + errorMessage = ApiErrorTagType.HEALTH_CARD_SCREEN_LOAD_ERROR.value, + errorResponse = response.error, + ) } - setErrorData( - response.errors, - response.error, - showFullScreenError = true, - errorMetaData = - ErrorMetaData( - methodName = ApiErrorTagType.INSURANCE_TAB_SCREEN_PAGE_ERROR.value, - flowName = GiErrorMetaData.INSURANCE_TAB_FLOW, - ), + logError( + response, + GiErrorMetaData( + ApiErrorTagType.HOME_VISIT_STATUS_CTA_ERROR.value, + flowName = GiErrorMetaData.FLOW_POST_PURCHASE, + ), ) } } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitLandingPageFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitLandingPageFragment.kt index 4166dd64d3..e0025a6d28 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitLandingPageFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitLandingPageFragment.kt @@ -53,13 +53,13 @@ import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse import com.navi.base.utils.orZero import com.navi.common.ResponseState -import com.navi.common.ui.fragment.BaseFragment +import com.navi.common.network.models.ErrorMessage import com.navi.insurance.R -import com.navi.insurance.analytics.InsuranceAnalyticsHandler import com.navi.insurance.analytics.NaviInsuranceAnalytics +import com.navi.insurance.common.GiBaseFragment +import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.reusable.components.InitErrorView import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator -import com.navi.insurance.policy.details.HomeVisitResponse import com.navi.insurance.util.Constants import com.navi.insurance.util.isTrue import com.navi.naviwidgets.callbacks.WidgetCallback @@ -70,16 +70,19 @@ import com.navi.naviwidgets.extensions.isFirstItemVisible import com.navi.naviwidgets.models.GenericWidgetDataInfo import com.navi.naviwidgets.views.NaviErrorPageView import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @AndroidEntryPoint -class HomeVisitLandingPageFragment : BaseFragment(), WidgetCallback { +class HomeVisitLandingPageFragment : GiBaseFragment(), WidgetCallback { private val viewModel by viewModels() private var view: NaviErrorPageView? = null - @Inject lateinit var analyticsHandler: InsuranceAnalyticsHandler + override fun getViewModel(): GiBaseVM = viewModel + + override fun getRetryAction(errorMessage: ErrorMessage?): (() -> Unit)? = null + + override fun onBackPressed(): Boolean = false override fun onCreateView( inflater: LayoutInflater, @@ -93,7 +96,7 @@ class HomeVisitLandingPageFragment : BaseFragment(), WidgetCallback { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.fetchHomeVisitLandingPageResponse() + viewModel.fetchHomeVisitPage() observeCallbackData() } @@ -107,9 +110,10 @@ class HomeVisitLandingPageFragment : BaseFragment(), WidgetCallback { } state.value.hasErrorOccurred.isTrue() -> { InitErrorView( + connectivityObserver = connectivityStateFlow, view = view, errorMessage = state.value.errorResponse, - onRetryClick = { tag -> viewModel.fetchHomeVisitLandingPageResponse() }, + onRetryClick = { tag -> viewModel.fetchHomeVisitPage() }, onCloseButtonClick = { onClick(CtaData(type = CtaType.GO_BACK.value)) }, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitRepo.kt b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitRepo.kt index 5c3029e53e..b346f120c7 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitRepo.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitRepo.kt @@ -12,7 +12,6 @@ import com.navi.common.network.models.RepoResult import com.navi.common.network.retrofit.ResponseCallback import com.navi.insurance.common.models.CallbackRequestBody import com.navi.insurance.network.retrofit.RetrofitService -import com.navi.insurance.policy.details.HomeVisitResponse import javax.inject.Inject class HomeVisitRepo @Inject constructor(private val retrofitService: RetrofitService) : diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitResponse.kt b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitResponse.kt index c641f76359..e1c0179328 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitResponse.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitResponse.kt @@ -5,9 +5,10 @@ * */ -package com.navi.insurance.policy.details +package com.navi.insurance.home_visit import com.google.gson.annotations.SerializedName +import com.navi.insurance.policy.details.PageMetaData import com.navi.naviwidgets.models.GenericWidgetDataInfo data class HomeVisitResponse( diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitVM.kt b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitVM.kt index 50320b90d1..799ec5b6b4 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitVM.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/home_visit/HomeVisitVM.kt @@ -8,21 +8,29 @@ package com.navi.insurance.home_visit import androidx.lifecycle.viewModelScope +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.model.NaviClickAction import com.navi.base.utils.isNotNull import com.navi.base.utils.isNull import com.navi.common.ResponseState import com.navi.common.di.CoroutineDispatcherProvider -import com.navi.common.network.models.ErrorMetaData -import com.navi.common.viewmodel.BaseVM +import com.navi.common.network.models.ErrorMessage +import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.models.GiErrorMetaData +import com.navi.insurance.common.util.ActionHandler +import com.navi.insurance.common.util.NavigationHandler.Companion.HOME_VISIT_SCREEN import com.navi.insurance.models.GIResponseState import com.navi.insurance.network.ApiErrorTagType -import com.navi.insurance.policy.details.HomeVisitResponse import com.navi.insurance.util.Constants +import com.navi.insurance.util.GiRetroFit import com.navi.naviwidgets.models.FooterButtonState import dagger.hilt.android.lifecycle.HiltViewModel +import java.util.concurrent.TimeUnit import javax.inject.Inject import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -38,8 +46,11 @@ class HomeVisitVM @Inject constructor( private val repository: HomeVisitRepo, + actionHandler: ActionHandler, private val dispatcher: CoroutineDispatcherProvider, -) : BaseVM() { + private val naviCacheRepository: NaviCacheRepositoryImpl, + @GiRetroFit private val gson: Gson, +) : GiBaseVM(actionHandler) { var homeVisitStatusErrorCta: NaviClickAction? = null private val _homeVisitResponseFlow = MutableStateFlow(GIResponseState()) @@ -54,48 +65,87 @@ constructor( val footerButtonStateFlow: StateFlow get() = _footerButtonStateFlow.asStateFlow() - fun fetchHomeVisitLandingPageResponse() { - viewModelScope.launch(dispatcher.io) { - _homeVisitResponseFlow.update { - it.copy(isLoading = true, data = null, hasErrorOccurred = false) - } - val response = repository.fetchHomeVisitScreen() - if ( - response.error.isNull() && - response.errors.isNullOrEmpty() && - response.data.isNotNull() - ) { - response.data?.apply { - _homeVisitResponseFlow.update { - it.copy(isLoading = false, data = this, hasErrorOccurred = false) - } - } + private suspend fun setResponseFromCache( + isLoading: Boolean = false, + errorResponse: ErrorMessage? = null, + ) { + val cachedResponse = + getResponseFromCache(NaviSharedDbKeys.GI_HOME_VISIT_LANDING_PAGE.keyName) + _homeVisitResponseFlow.update { + if (cachedResponse != null) { + it.copy(isLoading = false, data = cachedResponse) } else { - _homeVisitResponseFlow.update { - it.copy( - isLoading = false, - data = null, - hasErrorOccurred = true, - errorMessage = ApiErrorTagType.HOME_VISIT_SCREEN_LOAD_ERROR.value, - errorResponse = response.error, - ) - } - setErrorData( - response.errors, - response.error, - showFullScreenError = true, - errorMetaData = - ErrorMetaData( - methodName = ApiErrorTagType.HOME_VISIT_SCREEN_LOAD_ERROR.value, - flowName = GiErrorMetaData.FLOW_HOME_VISIT, - ), + it.copy( + isLoading = isLoading, + data = null, + hasErrorOccurred = !isLoading, + errorMessage = ApiErrorTagType.HOME_VISIT_SCREEN_LOAD_ERROR.value, + errorResponse = errorResponse, ) } } } + private suspend fun saveTabResponseInCache(tabResponse: HomeVisitResponse?, cacheKey: String) { + tabResponse?.let { + naviCacheRepository.save( + NaviCacheEntity( + key = cacheKey, + value = gson.toJson(it), + version = 1, + ttl = TimeUnit.DAYS.toMillis(7), + ) + ) + } + } + + private suspend fun getResponseFromCache(cacheKey: String): HomeVisitResponse? { + return naviCacheRepository.get(cacheKey)?.let { response -> + gson.fromJson(response.value, object : TypeToken() {}.type) + } + } + + fun fetchHomeVisitPage() { + viewModelScope.launch( + dispatcher.io + + giBaseExceptionHandler(ApiErrorTagType.HOME_VISIT_SCREEN_LOAD_ERROR.value) + ) { + setResponseFromCache(isLoading = true) + fetchHomeVisitLandingPageResponse() + } + } + + private suspend fun fetchHomeVisitLandingPageResponse() { + _homeVisitResponseFlow.update { + it.copy(isLoading = true, data = null, hasErrorOccurred = false) + } + val response = repository.fetchHomeVisitScreen() + if ( + response.error.isNull() && response.errors.isNullOrEmpty() && response.data.isNotNull() + ) { + response.data?.let { + _homeVisitResponseFlow.update { state -> + state.copy(isLoading = false, data = it, hasErrorOccurred = false) + } + saveTabResponseInCache(it, NaviSharedDbKeys.GI_HOME_VISIT_LANDING_PAGE.keyName) + } + } else { + setResponseFromCache(errorResponse = response.error) + logError( + response, + GiErrorMetaData( + ApiErrorTagType.HOME_VISIT_SCREEN_LOAD_ERROR.value, + flowName = HOME_VISIT_SCREEN, + ), + ) + } + } + fun getHomeVisitStatusCta() { - viewModelScope.launch(dispatcher.io) { + viewModelScope.launch( + dispatcher.io + + giBaseExceptionHandler(ApiErrorTagType.HOME_VISIT_STATUS_CTA_ERROR.value) + ) { _footerButtonStateFlow.value = FooterButtonState.LOADING.name val response = repository.getHomeVisitStatusCta(screenName = Constants.HOME_VISIT_SCREEN) @@ -110,15 +160,12 @@ constructor( _callbackStatusFlow.emit( ResponseState.Failure(ApiErrorTagType.HOME_VISIT_STATUS_CTA_ERROR.value) ) - setErrorData( - response.errors, - response.error, - showFullScreenError = false, - errorMetaData = - ErrorMetaData( - methodName = ApiErrorTagType.HOME_VISIT_STATUS_CTA_ERROR.value, - flowName = GiErrorMetaData.FLOW_HOME_VISIT, - ), + logError( + response, + GiErrorMetaData( + ApiErrorTagType.HOME_VISIT_STATUS_CTA_ERROR.value, + flowName = HOME_VISIT_SCREEN, + ), ) } } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/network/ApiErrorTagType.kt b/android/navi-insurance/src/main/java/com/navi/insurance/network/ApiErrorTagType.kt index 84079e7d6f..f79597457a 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/network/ApiErrorTagType.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/network/ApiErrorTagType.kt @@ -183,4 +183,5 @@ enum class ApiErrorTagType(val value: String) { OTP_RESEND_RESPONSE_ERROR("OTP_RESEND_RESPONSE_ERROR"), OTP_CAPTCHA_SUBMIT_RESPONSE_ERROR("OTP_CAPTCHA_SUBMIT_RESPONSE_ERROR"), CAPTCHA_TOKEN_GENERATION_ERROR("CAPTCHA_TOKEN_GENERATION_ERROR"), + HEALTH_CARD_SCREEN_LOAD_ERROR("HEALTH_CARD_SCREEN_LOAD_ERROR"), } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt index a64bbd5ef4..c0e1d0f4ec 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/network/retrofit/RetrofitService.kt @@ -47,6 +47,7 @@ import com.navi.insurance.engagement.pre_diabetes_check.models.PdQuestionnaireDa import com.navi.insurance.engagement.pre_diabetes_check.models.PdResultsData import com.navi.insurance.engagement.pre_diabetes_check.models.PdSaveScoreResponse import com.navi.insurance.health.card.HealthCardScreenResponse +import com.navi.insurance.home_visit.HomeVisitResponse import com.navi.insurance.kyc.model.request.OtpCaptchaRequest import com.navi.insurance.kyc.model.response.OtpCaptchaSubmitResponse import com.navi.insurance.models.AddressDetailsRequest @@ -148,7 +149,6 @@ import com.navi.insurance.models.response.TPADetails import com.navi.insurance.models.response.UserInputRequestData import com.navi.insurance.new_hospital_experience.model.response.HospitalNewSearchResponse import com.navi.insurance.new_hospital_experience.model.response.HospitalPageDataResponse -import com.navi.insurance.policy.details.HomeVisitResponse import com.navi.insurance.policy.details.PolicyDetailsResponse import com.navi.insurance.pre.purchase.journey.FormWidgetRequest import com.navi.insurance.pre.purchase.journey.PreQuoteJourneyPageResponse diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsFragment.kt index 542bd3b7a1..5be10bd16c 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsFragment.kt @@ -47,10 +47,11 @@ import com.navi.base.utils.isNotNull import com.navi.base.utils.isNotNullAndNotEmpty import com.navi.base.utils.orFalse import com.navi.base.utils.orZero -import com.navi.common.ui.fragment.BaseFragment +import com.navi.common.network.models.ErrorMessage import com.navi.insurance.R -import com.navi.insurance.analytics.InsuranceAnalyticsHandler import com.navi.insurance.analytics.NaviInsuranceAnalytics +import com.navi.insurance.common.GiBaseFragment +import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.reusable.components.InitErrorView import com.navi.insurance.navigator.NaviInsuranceDeeplinkNavigator import com.navi.insurance.util.Constants @@ -64,16 +65,19 @@ import com.navi.naviwidgets.composewidget.reusable.footerColorShadow import com.navi.naviwidgets.extensions.isFirstItemVisible import com.navi.naviwidgets.views.NaviErrorPageView import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject @AndroidEntryPoint -class PolicyDetailsFragment : BaseFragment(), WidgetCallback { +class PolicyDetailsFragment : GiBaseFragment(), WidgetCallback { private val viewModel by viewModels() private var emiShieldPolicy: Boolean = false private var loanAccountNumber: String? = null var view: NaviErrorPageView? = null - @Inject lateinit var analyticsHandler: InsuranceAnalyticsHandler + override fun getViewModel(): GiBaseVM = viewModel + + override fun getRetryAction(errorMessage: ErrorMessage?): (() -> Unit)? = null + + override fun onBackPressed(): Boolean = true override fun onCreateView( inflater: LayoutInflater, @@ -123,7 +127,6 @@ class PolicyDetailsFragment : BaseFragment(), WidgetCallback { } } }, - showCloseButton = true, onCloseButtonClick = { onClick( CtaData( @@ -132,6 +135,7 @@ class PolicyDetailsFragment : BaseFragment(), WidgetCallback { ) ) }, + connectivityObserver = connectivityStateFlow, ) } state.value.data.isNotNull() -> { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsVM.kt b/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsVM.kt index 4469caceaf..8cb0e514a3 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsVM.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/policy/details/PolicyDetailsVM.kt @@ -12,9 +12,7 @@ import com.navi.base.utils.isNotNull import com.navi.base.utils.isNull import com.navi.common.alchemist.model.AlchemistScreenRequest import com.navi.common.di.CoroutineDispatcherProvider -import com.navi.common.model.ModuleName import com.navi.common.network.models.isSuccessWithData -import com.navi.common.utils.CommonNaviAnalytics import com.navi.insurance.common.GiBaseVM import com.navi.insurance.common.models.GiErrorMetaData import com.navi.insurance.common.util.ActionHandler @@ -22,10 +20,8 @@ import com.navi.insurance.models.GIResponseState import com.navi.insurance.models.response.AlchemistScreenName import com.navi.insurance.network.ApiErrorTagType import com.navi.insurance.review_policy.model.request.PolicyDetailsRequest -import com.navi.insurance.util.logGiAppErrorEvent import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -46,54 +42,9 @@ constructor( val policyDetailsResponseFlow: StateFlow> get() = _policyDetailsResponseFlow.asStateFlow() - private fun exceptionHandler(errorTag: String) = CoroutineExceptionHandler { _, exception -> - CommonNaviAnalytics.naviAnalytics - .GiError() - .onGlobalError( - exception.message, - insuranceAnalyticsHandler?.getCurrentScreen(), - ModuleName.GI.name, - CommonNaviAnalytics.GLOBAL_GENERIC_ERRORS, - null, - null, - GiErrorMetaData.FLOW_POLICY_REVIEW, - errorTag, - ) - logGiAppErrorEvent( - screen = insuranceAnalyticsHandler?.getCurrentScreen().toString(), - errorTitle = errorTag, - errorDes = exception.message.toString(), - isSourceExternal = false, - ) - viewModelScope.launch { - when (errorTag) { - ApiErrorTagType.POLICY_DETAILS_LOAD_ERROR.value -> { - _policyDetailsResponseFlow.update { - it.copy( - isLoading = false, - data = null, - hasErrorOccurred = true, - errorMessage = ApiErrorTagType.POLICY_DETAILS_LOAD_ERROR.value, - ) - } - } - ApiErrorTagType.POLICY_DETAILS_V2_LOAD_ERROR.value -> { - _policyDetailsResponseFlow.update { - it.copy( - isLoading = false, - data = null, - hasErrorOccurred = true, - errorMessage = ApiErrorTagType.POLICY_DETAILS_V2_LOAD_ERROR.value, - ) - } - } - } - } - } - fun fetchPolicyDetailsResponse() { viewModelScope.launch( - dispatcher.io + exceptionHandler(ApiErrorTagType.POLICY_DETAILS_LOAD_ERROR.value) + dispatcher.io + giBaseExceptionHandler(ApiErrorTagType.POLICY_DETAILS_LOAD_ERROR.value) ) { _policyDetailsResponseFlow.update { it.copy(isLoading = true, data = null, hasErrorOccurred = false) @@ -132,7 +83,8 @@ constructor( fun fetchPolicyDetailsResponseV2(loanAccountNumber: String? = null) { viewModelScope.launch( - dispatcher.io + exceptionHandler(ApiErrorTagType.POLICY_DETAILS_V2_LOAD_ERROR.value) + dispatcher.io + + giBaseExceptionHandler(ApiErrorTagType.POLICY_DETAILS_V2_LOAD_ERROR.value) ) { _policyDetailsResponseFlow.update { it.copy(isLoading = true, data = null, hasErrorOccurred = false) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/pre/purchase/journey/ui/PreQuoteJourneyFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/pre/purchase/journey/ui/PreQuoteJourneyFragment.kt index 76c9d0577b..e506cf2e9c 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/pre/purchase/journey/ui/PreQuoteJourneyFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/pre/purchase/journey/ui/PreQuoteJourneyFragment.kt @@ -364,6 +364,7 @@ class PreQuoteJourneyFragment() : GiBaseFragment(), WidgetCallback, NewBottomShe ) ) }, + connectivityObserver = connectivityStateFlow, ) } state.data.isNotNull() -> { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/AddAddressFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/AddAddressFragment.kt index 8b7c0f6abf..90428f1af5 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/AddAddressFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/AddAddressFragment.kt @@ -196,6 +196,7 @@ class AddAddressFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchAddAddressScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -215,6 +216,7 @@ class AddAddressFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/BankDetailsFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/BankDetailsFragment.kt index 6d2ba91585..f07001a501 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/BankDetailsFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/BankDetailsFragment.kt @@ -215,6 +215,7 @@ class BankDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchBankDetailsScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -234,6 +235,7 @@ class BankDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/EmailDetailsFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/EmailDetailsFragment.kt index e59ce6688e..67fde8e349 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/EmailDetailsFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/EmailDetailsFragment.kt @@ -177,6 +177,7 @@ class EmailDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchEmailScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -197,6 +198,7 @@ class EmailDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/GratificationFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/GratificationFragment.kt index 93e9f43d3a..c7026cd483 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/GratificationFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/GratificationFragment.kt @@ -158,6 +158,7 @@ class GratificationFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchGratificationScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -178,6 +179,7 @@ class GratificationFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeDetailsFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeDetailsFragment.kt index e3af5e39f4..57c81b1234 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeDetailsFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeDetailsFragment.kt @@ -170,6 +170,7 @@ class NomineeDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchNomineeDetailsScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -189,6 +190,7 @@ class NomineeDetailsFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeListFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeListFragment.kt index e306a736b6..107f4fcc16 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeListFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeListFragment.kt @@ -160,6 +160,7 @@ class NomineeListFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchNomineeListScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } state.value.isLoading -> { @@ -178,6 +179,7 @@ class NomineeListFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeShareEditFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeShareEditFragment.kt index bd5fed3a1d..0edfa55853 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeShareEditFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/NomineeShareEditFragment.kt @@ -142,6 +142,7 @@ class NomineeShareEditFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -182,6 +183,7 @@ class NomineeShareEditFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchNomineeShareEditScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } state.value.isLoading -> { diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/RemoveNomineeFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/RemoveNomineeFragment.kt index 68ef4d0629..581a82c24b 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/RemoveNomineeFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/purchase/compliance/ui/fragments/RemoveNomineeFragment.kt @@ -161,6 +161,7 @@ class RemoveNomineeFragment : GiBaseFragment(), WidgetCallback { errorMessage = state.value.errorResponse, onRetryClick = { viewModel.fetchRemoveNomineeScreenData() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } @@ -180,6 +181,7 @@ class RemoveNomineeFragment : GiBaseFragment(), WidgetCallback { errorMessage = patchCallState.value.errorResponse, onRetryClick = { viewModel.moveToNextScreen() }, onCloseButtonClick = { activity?.finish() }, + connectivityObserver = connectivityStateFlow, ) } diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/PolicyReviewActivity.kt b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/PolicyReviewActivity.kt index 3bd95e8005..50dc3c03b2 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/PolicyReviewActivity.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/PolicyReviewActivity.kt @@ -58,6 +58,7 @@ class PolicyReviewActivity : GiBaseActivity(), WidgetCallback { dependenciesContainerBuilder = { dependency(this@PolicyReviewActivity) dependency(viewModel) + dependency(connectivityStateFlow) dependency(navController) if (view.isNotNull()) { dependency(view) diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/HealthDeclarationReviewScreen.kt b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/HealthDeclarationReviewScreen.kt index 324a50e11e..47c0e8e202 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/HealthDeclarationReviewScreen.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/HealthDeclarationReviewScreen.kt @@ -40,6 +40,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.navi.base.model.CtaData import com.navi.base.model.CtaType +import com.navi.base.utils.ConnectivityObserver import com.navi.base.utils.isNotNull import com.navi.base.utils.orZero import com.navi.insurance.common.reusable.components.InitErrorView @@ -57,6 +58,7 @@ import com.navi.naviwidgets.views.NaviErrorPageView import com.navi.uitron.render.UiTronRenderer import com.navi.uitron.viewmodel.UiTronViewModel import com.ramcosta.composedestinations.annotation.Destination +import kotlinx.coroutines.flow.Flow @Destination @Composable @@ -66,6 +68,7 @@ fun HealthDeclarationReviewScreen( viewModel: PolicyReviewVM, view: NaviErrorPageView, ctaData: CtaData = CtaData(), + connectivityObserver: Flow, ) { val pageResponseState = viewModel.healthDeclarationReviewResponseFlow.collectAsStateWithLifecycle() @@ -93,6 +96,7 @@ fun HealthDeclarationReviewScreen( pageResponseState.value.isLoading -> ShowShimmer(activity) pageResponseState.value.hasErrorOccurred -> { InitErrorView( + connectivityObserver = connectivityObserver, view = view, errorMessage = pageResponseState.value.errorResponse, onRetryClick = { viewModel.fetchHealthDeclarationReviewPageResponse() }, diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/PolicyReviewScreen.kt b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/PolicyReviewScreen.kt index c8c803cd82..bc5c601654 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/PolicyReviewScreen.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/review_policy/composables/PolicyReviewScreen.kt @@ -34,6 +34,7 @@ import com.navi.analytics.utils.NaviTrackEvent import com.navi.base.model.CtaConstants import com.navi.base.model.CtaData import com.navi.base.model.CtaType +import com.navi.base.utils.ConnectivityObserver import com.navi.base.utils.isNotNull import com.navi.base.utils.orFalse import com.navi.common.ResponseState @@ -65,6 +66,7 @@ import com.navi.naviwidgets.extensions.hexToInt import com.navi.naviwidgets.extensions.isFirstItemVisible import com.navi.naviwidgets.views.NaviErrorPageView import com.ramcosta.composedestinations.annotation.Destination +import kotlinx.coroutines.flow.Flow @Destination @Composable @@ -73,6 +75,7 @@ fun PolicyReviewScreen( widgetCallback: WidgetCallback, viewModel: PolicyReviewVM, view: NaviErrorPageView, + connectivityObserver: Flow, ) { val scrollState = rememberLazyListState() val expandFAB = scrollState.isFirstItemVisible() @@ -279,6 +282,7 @@ fun PolicyReviewScreen( pageResponseState.value.hasErrorOccurred -> { InitErrorView( + connectivityObserver = connectivityObserver, view = view, errorMessage = pageResponseState.value.errorResponse, onRetryClick = { diff --git a/package-lock.json b/package-lock.json index 652f1f8dcf..81c5ccce79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@babel/core": "^7.23.7", "@babel/preset-env": "^7.23.7", "@react-native-async-storage/async-storage": "^1.21.0", + "@react-native-community/netinfo": "^11.4.1", "@react-native-community/slider": "^4.4.3", "@react-native-masked-view/masked-view": "^0.2.8", "@react-native/metro-config": "^0.72.9", @@ -3579,6 +3580,15 @@ "node": ">=6" } }, + "node_modules/@react-native-community/netinfo": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.4.1.tgz", + "integrity": "sha512-B0BYAkghz3Q2V09BF88RA601XursIEA111tnc2JOaN7axJWmNefmfjZqw/KdSxKZp7CZUuPpjBmz/WCR9uaHYg==", + "license": "MIT", + "peerDependencies": { + "react-native": ">=0.59" + } + }, "node_modules/@react-native-community/slider": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/@react-native-community/slider/-/slider-4.5.5.tgz", diff --git a/package.json b/package.json index 07f66b9743..52c59b0e34 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@babel/core": "^7.23.7", "@babel/preset-env": "^7.23.7", "@react-native-async-storage/async-storage": "^1.21.0", + "@react-native-community/netinfo": "^11.4.1", "@react-native-community/slider": "^4.4.3", "@react-native-masked-view/masked-view": "^0.2.8", "@react-native/metro-config": "^0.72.9", @@ -37,12 +38,12 @@ "patch-package": "^8.0.0", "react": "^18.2.0", "react-native": "0.74.0", - "react-native-reanimated": "3.11.0", "react-native-code-push": "8.2.1", "react-native-config": "^1.5.1", "react-native-gesture-handler": "^2.14.0", "react-native-linear-gradient": "^2.5.6", "react-native-modal": "^13.0.1", + "react-native-reanimated": "3.11.0", "react-native-safe-area-context": "^4.10.1", "react-native-screens": "^3.29.0", "react-native-skeleton-placeholder": "^5.2.4",