fall back to the letter placeholder when cover art fails to load

This commit is contained in:
austinried
2026-10-04 00:29:54 +00:00
parent d8a0bf709d
commit de90d11f35
@@ -9,7 +9,10 @@ import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
@@ -30,8 +33,10 @@ fun CoverArt(
showPlaceholder: Boolean = true, showPlaceholder: Boolean = true,
) { ) {
val context = LocalPlatformContext.current val context = LocalPlatformContext.current
var failed by remember(ref) { mutableStateOf(false) }
var thumbnailLoaded by remember(thumbnailRef) { mutableStateOf(false) }
Box(modifier = modifier.background(MaterialTheme.colorScheme.surfaceVariant)) { Box(modifier = modifier.background(MaterialTheme.colorScheme.surfaceVariant)) {
if (showPlaceholder) { if (showPlaceholder || (failed && !thumbnailLoaded)) {
Text( Text(
text = name.trim().take(1).uppercase(), text = name.trim().take(1).uppercase(),
style = MaterialTheme.typography.headlineMedium, style = MaterialTheme.typography.headlineMedium,
@@ -44,6 +49,7 @@ fun CoverArt(
model = remember(thumbnailRef) { imageRequest(context, thumbnailRef, crossfade = false) }, model = remember(thumbnailRef) { imageRequest(context, thumbnailRef, crossfade = false) },
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
onSuccess = { thumbnailLoaded = true },
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) )
} }
@@ -52,6 +58,7 @@ fun CoverArt(
model = remember(ref, thumbnailRef) { imageRequest(context, ref, crossfade = thumbnailRef != null) }, model = remember(ref, thumbnailRef) { imageRequest(context, ref, crossfade = thumbnailRef != null) },
contentDescription = null, contentDescription = null,
contentScale = ContentScale.Crop, contentScale = ContentScale.Crop,
onError = { failed = true },
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) )
} }