diff --git a/android/navi-coin/src/main/java/com/navi/coin/ui/compose/common/Init.kt b/android/navi-coin/src/main/java/com/navi/coin/ui/compose/common/Init.kt index 1b8c776dc9..f5546d8281 100644 --- a/android/navi-coin/src/main/java/com/navi/coin/ui/compose/common/Init.kt +++ b/android/navi-coin/src/main/java/com/navi/coin/ui/compose/common/Init.kt @@ -20,8 +20,8 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.navi.coin.ui.compose.screen.destinations.CoinErrorScreenDestination import com.navi.common.constants.SCREEN_NAME +import com.navi.rr.common.error.ErrorHandler import com.navi.rr.common.vm.RRBaseVM -import com.navi.rr.common.vm.RRErrorVM import com.navi.rr.utils.composeutils.InitErrorBottomSheet import com.navi.rr.utils.constants.Constants import com.ramcosta.composedestinations.navigation.DestinationsNavigator @@ -43,12 +43,12 @@ fun Init( viewModel.eventUtils.setCurrentScreen(activity, screenName = viewModel.screenName) } - val showBottomSheet by RRErrorVM.showErrorBottomSheet.collectAsStateWithLifecycle() + val showBottomSheet by ErrorHandler.showErrorBottomSheet.collectAsStateWithLifecycle() val showErrorScreen by - RRErrorVM.showErrorScreen.collectAsStateWithLifecycle( + ErrorHandler.showErrorScreen.collectAsStateWithLifecycle( minActiveState = Lifecycle.State.RESUMED ) - val error by RRErrorVM.error.collectAsStateWithLifecycle() + val error by ErrorHandler.error.collectAsStateWithLifecycle() if (showErrorScreen && showBottomSheet.not()) { navigator?.navigate( diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/error/ErrorHandler.kt b/android/navi-rr/src/main/java/com/navi/rr/common/error/ErrorHandler.kt new file mode 100644 index 0000000000..7c63a5cd31 --- /dev/null +++ b/android/navi-rr/src/main/java/com/navi/rr/common/error/ErrorHandler.kt @@ -0,0 +1,102 @@ +/* + * + * * Copyright © 2024 by Navi Technologies Limited + * * All rights reserved. Strictly confidential + * + */ + +package com.navi.rr.common.error + +import com.navi.common.network.ApiConstants +import com.navi.rr.R +import com.navi.rr.common.models.RRErrorData +import com.navi.rr.utils.constants.Constants +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.update + +interface ErrorHandler { + val tryAgainDisable: MutableStateFlow + + fun showError(error: RRErrorData) + + fun hideError() + + fun setCachePresent() + + fun getErrorImageAsPerStatusCode(statusCode: Int): Int + + fun getErrorMessageAsPerStatusCode(statusCode: Int, errorMessage: (String, String) -> Unit) + + fun getErrorMessageAsPerStatusCodeForBottomSheet( + statusCode: Int, + errorMessage: (String, String) -> Unit + ) + + companion object { + val showErrorBottomSheet: MutableStateFlow = MutableStateFlow(false) + val showErrorScreen: MutableStateFlow = MutableStateFlow(false) + val error: MutableStateFlow = MutableStateFlow(RRErrorData()) + } +} + +class ErrorHandlerImpl @Inject constructor() : ErrorHandler { + + override val tryAgainDisable = MutableStateFlow(false) + private val _isCachePresent = MutableStateFlow(false) + + override fun showError(error: RRErrorData) { + ErrorHandler.error.update { error } + ErrorHandler.showErrorBottomSheet.update { _isCachePresent.value } + ErrorHandler.showErrorScreen.update { _isCachePresent.value.not() } + } + + override fun hideError() { + ErrorHandler.showErrorScreen.update { false } + ErrorHandler.showErrorBottomSheet.update { false } + } + + override fun setCachePresent() { + _isCachePresent.update { true } + } + + override fun getErrorImageAsPerStatusCode(statusCode: Int): Int { + return when (statusCode) { + ApiConstants.NO_INTERNET -> R.drawable.no_internet_connection + else -> R.drawable.something_went_wrong_triangle + } + } + + override fun getErrorMessageAsPerStatusCode( + statusCode: Int, + errorMessage: (String, String) -> Unit + ) { + when (statusCode) { + ApiConstants.NO_INTERNET -> + errorMessage.invoke(Constants.NO_INTERNET, Constants.PLEASE_CHECK_YOUR_INTERNET) + else -> + errorMessage.invoke( + Constants.SOMETHING_WENT_WRONG_WITH_EXCLAMATION, + Constants.WE_ARE_FACING_TECHNICAL_ISSUE + ) + } + } + + override fun getErrorMessageAsPerStatusCodeForBottomSheet( + statusCode: Int, + errorMessage: (String, String) -> Unit + ) { + when (statusCode) { + ApiConstants.NO_INTERNET -> + errorMessage.invoke( + Constants.NO_INTERNET_CONNECTION, + Constants.NO_INTERNET_CONNECTION_SUBTITLE + ) + else -> + errorMessage.invoke( + Constants.SOMETHING_WENT_WRONG_WITH_EXCLAMATION, + Constants.WE_ARE_FACING_TECHNICAL_ISSUE + ) + } + } +} diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/ui/RRErrorScreen.kt b/android/navi-rr/src/main/java/com/navi/rr/common/ui/RRErrorScreen.kt index f0ebcd6a4a..694aaa5500 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/common/ui/RRErrorScreen.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/common/ui/RRErrorScreen.kt @@ -49,6 +49,7 @@ import com.navi.design.font.FontWeightEnum import com.navi.design.theme.getFontWeight import com.navi.design.theme.ttComposeFontFamily import com.navi.rr.R +import com.navi.rr.common.error.ErrorHandler import com.navi.rr.common.models.RRErrorData import com.navi.rr.common.vm.RRErrorVM import com.navi.rr.milestones.ui.themes.defaultPurple @@ -70,7 +71,7 @@ fun RRErrorScreen( navigator: DestinationsNavigator? = null ) { - val error = RRErrorVM.error.collectAsStateWithLifecycle() + val error = ErrorHandler.error.collectAsStateWithLifecycle() var title by remember { mutableStateOf(Constants.SOMETHING_WENT_WRONG_WITH_EXCLAMATION) } var subtitle by remember { mutableStateOf(Constants.WE_ARE_FACING_TECHNICAL_ISSUE) } diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRBaseVM.kt b/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRBaseVM.kt index f2542137af..0b5adc7faf 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRBaseVM.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRBaseVM.kt @@ -10,7 +10,10 @@ package com.navi.rr.common.vm import androidx.lifecycle.viewModelScope import com.navi.common.constants.SCREEN_NAME import com.navi.common.forge.model.WidgetModelDefinition +import com.navi.common.viewmodel.BaseVM import com.navi.rr.common.bottomsheet.RRBottomSheetStateHolder +import com.navi.rr.common.error.ErrorHandler +import com.navi.rr.common.error.ErrorHandlerImpl import com.navi.rr.utils.NaviRRAnalytics import com.navi.rr.utils.RRBaseCoroutineExceptionHandler import com.navi.rr.utils.facade.FireabaseEventFacade @@ -30,7 +33,7 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update -abstract class RRBaseVM : RRErrorVM() { +abstract class RRBaseVM : BaseVM(), ErrorHandler by ErrorHandlerImpl() { private var systemBackCtaAction: UiTronActionData? = null diff --git a/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRErrorVM.kt b/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRErrorVM.kt index 693f1c2727..d812af2d8e 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRErrorVM.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/common/vm/RRErrorVM.kt @@ -7,82 +7,7 @@ package com.navi.rr.common.vm -import com.navi.common.network.ApiConstants -import com.navi.common.viewmodel.BaseVM -import com.navi.rr.R -import com.navi.rr.common.models.RRErrorData -import com.navi.rr.utils.constants.Constants import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update -@HiltViewModel -open class RRErrorVM @Inject constructor() : BaseVM() { - companion object { - private val _showErrorBottomSheet = MutableStateFlow(false) - val showErrorBottomSheet = _showErrorBottomSheet.asStateFlow() - - private val _showErrorScreen = MutableStateFlow(false) - val showErrorScreen = _showErrorScreen.asStateFlow() - - private val _error = MutableStateFlow(RRErrorData()) - val error = _error.asStateFlow() - } - - private val _isCachePresent = MutableStateFlow(false) - val tryAgainDisable = MutableStateFlow(false) - - fun showError(error: RRErrorData) { - _error.update { error } - _showErrorBottomSheet.update { _isCachePresent.value } - _showErrorScreen.update { _isCachePresent.value.not() } - } - - fun hideError() { - _showErrorScreen.update { false } - _showErrorBottomSheet.update { false } - } - - fun setCachePresent() { - _isCachePresent.update { true } - } - - fun getErrorImageAsPerStatusCode(statusCode: Int): Int { - return when (statusCode) { - ApiConstants.NO_INTERNET -> R.drawable.no_internet_connection - else -> R.drawable.something_went_wrong_triangle - } - } - - fun getErrorMessageAsPerStatusCode(statusCode: Int, errorMessage: (String, String) -> Unit) { - when (statusCode) { - ApiConstants.NO_INTERNET -> - errorMessage.invoke(Constants.NO_INTERNET, Constants.PLEASE_CHECK_YOUR_INTERNET) - else -> - errorMessage.invoke( - Constants.SOMETHING_WENT_WRONG_WITH_EXCLAMATION, - Constants.WE_ARE_FACING_TECHNICAL_ISSUE - ) - } - } - - fun getErrorMessageAsPerStatusCodeForBottomSheet( - statusCode: Int, - errorMessage: (String, String) -> Unit - ) { - when (statusCode) { - ApiConstants.NO_INTERNET -> - errorMessage.invoke( - Constants.NO_INTERNET_CONNECTION, - Constants.NO_INTERNET_CONNECTION_SUBTITLE - ) - else -> - errorMessage.invoke( - Constants.SOMETHING_WENT_WRONG_WITH_EXCLAMATION, - Constants.WE_ARE_FACING_TECHNICAL_ISSUE - ) - } - } -} +@HiltViewModel class RRErrorVM @Inject constructor() : RRBaseVM() diff --git a/android/navi-rr/src/main/java/com/navi/rr/utils/composeutils/ComposableUtils.kt b/android/navi-rr/src/main/java/com/navi/rr/utils/composeutils/ComposableUtils.kt index 89f0dacc63..0307fb7b45 100644 --- a/android/navi-rr/src/main/java/com/navi/rr/utils/composeutils/ComposableUtils.kt +++ b/android/navi-rr/src/main/java/com/navi/rr/utils/composeutils/ComposableUtils.kt @@ -46,9 +46,9 @@ import com.navi.design.font.FontWeightEnum import com.navi.design.theme.getFontWeight import com.navi.design.theme.ttComposeFontFamily import com.navi.naviwidgets.R as NaviWidgetsR +import com.navi.rr.common.error.ErrorHandler import com.navi.rr.common.theme.color.NaviRRColor import com.navi.rr.common.vm.RRBaseVM -import com.navi.rr.common.vm.RRErrorVM import com.navi.rr.destinations.RRErrorScreenDestination import com.navi.rr.milestones.ui.themes.defaultPurple import com.navi.rr.utils.NaviRRAnalytics @@ -74,9 +74,9 @@ fun Init( viewModel.eventUtils.setCurrentScreen(activity, screenName = viewModel.screenName) } - val showBottomSheet by RRErrorVM.showErrorBottomSheet.collectAsStateWithLifecycle() - val showErrorScreen by RRErrorVM.showErrorScreen.collectAsStateWithLifecycle() - val error by RRErrorVM.error.collectAsStateWithLifecycle() + val showBottomSheet by ErrorHandler.showErrorBottomSheet.collectAsStateWithLifecycle() + val showErrorScreen by ErrorHandler.showErrorScreen.collectAsStateWithLifecycle() + val error by ErrorHandler.error.collectAsStateWithLifecycle() if (showErrorScreen) { navigator?.navigate(RRErrorScreenDestination(bundle = bundleOf(SCREEN_NAME to screenName)))