Add error image when a image fails to load

This commit is contained in:
Syer10
2022-05-06 23:57:08 -04:00
parent 8d57483833
commit 3ec944591e
2 changed files with 47 additions and 18 deletions

View File

@@ -8,24 +8,36 @@ package ca.gosyer.jui.uicore.image
import androidx.compose.animation.core.FiniteAnimationSpec
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.BrokenImage
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.DefaultAlpha
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale
import ca.gosyer.jui.uicore.components.ErrorScreen
import androidx.compose.ui.unit.dp
import ca.gosyer.jui.uicore.components.LoadingScreen
import io.kamel.core.Resource
import org.lighthousegames.logging.logging
import io.kamel.image.KamelImage as BaseKamelImage
private val log = logging()
@Composable
fun KamelImage(
resource: Resource<Painter>,
contentDescription: String?,
modifier: Modifier = Modifier,
errorModifier: Modifier = modifier,
alignment: Alignment = Alignment.Center,
contentScale: ContentScale = ContentScale.Fit,
alpha: Float = DefaultAlpha,
@@ -34,7 +46,21 @@ fun KamelImage(
LoadingScreen(progress = it, modifier = modifier then Modifier.fillMaxSize())
},
onFailure: @Composable (Throwable) -> Unit = {
ErrorScreen(it.message, modifier = modifier then Modifier.fillMaxSize())
LaunchedEffect(it) {
log.warn(it) { "Error loading image" }
}
Box(
modifier = errorModifier then Modifier.fillMaxSize()
.background(Color(0x1F888888)),
contentAlignment = Alignment.Center
) {
Icon(
Icons.Rounded.BrokenImage,
contentDescription = null,
tint = Color(0x1F888888),
modifier = Modifier.size(24.dp)
)
}
},
crossfade: Boolean = true,
animationSpec: FiniteAnimationSpec<Float> = tween()