From feac0b54b50beb6bd260e4316658d98439ad2f48 Mon Sep 17 00:00:00 2001 From: Kshitij Pramod Ghongadi Date: Thu, 15 May 2025 12:41:29 +0530 Subject: [PATCH] NTP-58776 | Unified Error Experience | Default value fix (#16157) --- .../error-screen/QuoteOfferErrorScreen.tsx | 18 ++++++- .../navi/insurance/common/GiBaseFragment.kt | 50 +++++++++++-------- .../reusable/components/ErrorComposable.kt | 32 ++++++++---- 3 files changed, 67 insertions(+), 33 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 75611b324b..381578d521 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 @@ -10,7 +10,12 @@ import { ErrorMetaData, GenericActionPayload, } from "../../../../../common/actions/GenericAction"; -import { RETRY } from "../../../../../common/constants"; +import { + RETRY, + STATUS_CODE_NO_INTERNET, + AXIOS_CODE_NETWORK, + AXIOS_CODE_CANCELED, +} from "../../../../../common/constants"; import { CtaData, StaticHeaderProperties, @@ -36,7 +41,16 @@ const QuoteOfferErrorScreen = ({ handleActions && handleActions(errorMetaData); }; + const isNetworkError = + (errorMetaData?.errorStatusCode && + [20, 21, 23, 24].includes(errorMetaData.errorStatusCode)) || + errorMetaData?.errorAxiosCode === AXIOS_CODE_NETWORK || + errorMetaData?.errorAxiosCode === AXIOS_CODE_CANCELED; + useEffect(() => { + if (!isNetworkError) { + return; + } if ( lastConnectionStatus.current === false && netInfo.isConnected === true @@ -44,7 +58,7 @@ const QuoteOfferErrorScreen = ({ onPress(); } lastConnectionStatus.current = netInfo.isConnected; - }, [netInfo.isConnected]); + }, [netInfo.isConnected, isNetworkError]); const errorResponse = getErrorResponseFromStatusCode( errorMetaData?.errorStatusCode, diff --git a/android/navi-insurance/src/main/java/com/navi/insurance/common/GiBaseFragment.kt b/android/navi-insurance/src/main/java/com/navi/insurance/common/GiBaseFragment.kt index 30307747cd..8faeed4d60 100644 --- a/android/navi-insurance/src/main/java/com/navi/insurance/common/GiBaseFragment.kt +++ b/android/navi-insurance/src/main/java/com/navi/insurance/common/GiBaseFragment.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.navi.base.utils.ConnectivityObserver import com.navi.base.utils.orFalse import com.navi.common.R as CommonR +import com.navi.common.network.ApiConstants import com.navi.common.network.models.ErrorMessage import com.navi.common.network.models.GenericErrorResponse import com.navi.common.network.models.toNaviErrorPageWidget @@ -46,8 +47,7 @@ abstract class GiBaseFragment : BaseFragment(), ActionHandler.ActionOwner { protected val requestCallbackVM by viewModels() @Inject lateinit var connectivityObserver: ConnectivityObserver protected val connectivityStateFlow by lazy { connectivityObserver.observe() } - private var previousState: ConnectivityObserver.Status? = - ConnectivityObserver.Status.Unavailable + private var previousState: ConnectivityObserver.Status? = ConnectivityObserver.Status.Available abstract fun getViewModel(): GiBaseVM? @@ -126,26 +126,36 @@ 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, - ) + val isNetworkError = + errorMessage?.statusCode in + listOf( + ApiConstants.NO_INTERNET, + ApiConstants.API_CODE_CONNECT_EXCEPTION, + ApiConstants.API_CODE_UNKNOWN_HOST, + ) - if ( - wasDisconnected && - state == ConnectivityObserver.Status.Available && - connectivityObserver.isInternetConnected() - ) { - onRetryClick(view.tag) + if (isNetworkError) { + 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 } - - previousState = state } } } 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 3ac5520ae8..8361e937fa 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 @@ -20,6 +20,7 @@ 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.ApiConstants import com.navi.common.network.models.ErrorMessage import com.navi.common.network.models.toNaviErrorPageWidget import com.navi.naviwidgets.views.NaviErrorPageView @@ -34,22 +35,30 @@ fun InitErrorView( onCloseButtonClick: () -> Unit, connectivityObserver: Flow? = null, ) { - connectivityObserver?.let { + val isNetworkError = + errorMessage?.statusCode in + listOf( + ApiConstants.NO_INTERNET, + ApiConstants.API_CODE_CONNECT_EXCEPTION, + ApiConstants.API_CODE_UNKNOWN_HOST, + ) + + if (isNetworkError && connectivityObserver != null) { 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) { - + if ( + previousState != null && + previousState in + setOf( + ConnectivityObserver.Status.Lost, + ConnectivityObserver.Status.Unavailable, + ConnectivityObserver.Status.Losing, + ) && + connectivityState == ConnectivityObserver.Status.Available + ) { onRetryClick(view?.tag) } @@ -75,6 +84,7 @@ fun InitErrorView( }, ) } + view?.let { HandleError(it) } }