Error Handling as Top Level function

pull/1457/head
TM 1 year ago
parent 7db9ac9bde
commit a26db70405

@ -16,6 +16,7 @@
package com.google.samples.apps.nowinandroid.ui
import android.content.Context
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -52,6 +53,7 @@ import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.semantics
@ -71,7 +73,12 @@ import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopAp
import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons
import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColors
import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors
import com.google.samples.apps.nowinandroid.core.ui.SnackbarErrorHandler
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError.Custom
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError.Default
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError.Exception
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError.Offline
import com.google.samples.apps.nowinandroid.core.ui.SnackbarError.Unknown
import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog
import com.google.samples.apps.nowinandroid.navigation.NiaNavHost
import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination
@ -83,6 +90,8 @@ fun NiaApp(appState: NiaAppState, modifier: Modifier = Modifier) {
appState.currentTopLevelDestination == TopLevelDestination.FOR_YOU
var showSettingsDialog by rememberSaveable { mutableStateOf(false) }
val ctx = LocalContext.current
NiaBackground(modifier = modifier) {
NiaGradientBackground(
gradientColors = if (shouldShowGradientBackground) {
@ -103,6 +112,7 @@ fun NiaApp(appState: NiaAppState, modifier: Modifier = Modifier) {
message = notConnectedMessage,
duration = Indefinite,
)
snackbarHostState.handleError(ctx, Offline)
}
}
@ -130,8 +140,6 @@ internal fun NiaApp(
val unreadDestinations by appState.topLevelDestinationsWithUnreadResources
.collectAsStateWithLifecycle()
val snackbarErrorHandler = SnackbarErrorHandler(snackbarHostState)
if (showSettingsDialog) {
SettingsDialog(
onDismiss = { onSettingsDismissed() },
@ -221,7 +229,6 @@ internal fun NiaApp(
duration = Short,
) == ActionPerformed
},
snackbarErrorHandler = snackbarErrorHandler,
)
}
}
@ -325,3 +332,24 @@ private fun NavDestination?.isTopLevelDestinationInHierarchy(destination: TopLev
this?.hierarchy?.any {
it.route?.contains(destination.name, true) ?: false
} ?: false
suspend fun SnackbarHostState.handleError(ctx: Context, error: SnackbarError<*>) {
// Log the error or show a generic error message
when (error) {
is Custom -> {
showSnackbar(error.data.toString())
}
is Exception -> {
showSnackbar(ctx.getString(R.string.error_exception))
}
is Offline -> {
showSnackbar(ctx.getString(R.string.not_connected))
}
is Default -> {
showSnackbar(ctx.getString(R.string.error_default))
}
is Unknown -> {
showSnackbar(ctx.getString(R.string.error_unknown))
}
}
}
Loading…
Cancel
Save