NTP-853 | Sohan Reddy | Migration of RRErrorVM (#11750)

Co-authored-by: Kishan Kumar <kishan.kumar@navi.com>
This commit is contained in:
Sohan Reddy Atukula
2024-07-11 16:07:19 +05:30
committed by GitHub
parent 3c7d2d7281
commit 4b36b564ce
6 changed files with 117 additions and 86 deletions

View File

@@ -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(

View File

@@ -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<Boolean>
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<Boolean> = MutableStateFlow(false)
val showErrorScreen: MutableStateFlow<Boolean> = MutableStateFlow(false)
val error: MutableStateFlow<RRErrorData> = 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
)
}
}
}

View File

@@ -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) }

View File

@@ -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

View File

@@ -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()

View File

@@ -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)))