From ab4c07defb5952404ff7ff63a8da1efa2adbc777 Mon Sep 17 00:00:00 2001 From: pluu Date: Sat, 23 Mar 2024 16:17:43 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EB=85=B8=EC=B6=9C=20=EC=B2=98=EB=A6=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../episode/ui/compose/EpisodeItemUi.kt | 76 ++++++------------- .../webtoon/weekly/ui/day/WeeklyItemUi.kt | 66 ++++++---------- 2 files changed, 50 insertions(+), 92 deletions(-) diff --git a/features/ui-episode/src/main/java/com/pluu/webtoon/episode/ui/compose/EpisodeItemUi.kt b/features/ui-episode/src/main/java/com/pluu/webtoon/episode/ui/compose/EpisodeItemUi.kt index ee5d4af8..2a875afe 100644 --- a/features/ui-episode/src/main/java/com/pluu/webtoon/episode/ui/compose/EpisodeItemUi.kt +++ b/features/ui-episode/src/main/java/com/pluu/webtoon/episode/ui/compose/EpisodeItemUi.kt @@ -11,10 +11,13 @@ import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -40,7 +43,6 @@ import com.pluu.webtoon.episode.R import com.pluu.webtoon.episode.compose.ImageInCircle import com.pluu.webtoon.model.EpisodeInfo import com.pluu.webtoon.ui.compose.theme.AppTheme -import com.pluu.webtoon.ui.compose.theme.md_theme_light_primary import com.pluu.webtoon.utils.applyAgent @Composable @@ -50,12 +52,18 @@ internal fun EpisodeItemUi( isRead: Boolean, onClicked: (EpisodeInfo) -> Unit ) { + var isLoading by remember { mutableStateOf(true) } + var isError by remember { mutableStateOf(false) } val painter = rememberAsyncImagePainter( model = ImageRequest.Builder(LocalContext.current) .data(item.image) .applyAgent() .crossfade(true) - .build() + .build(), + onState = { state -> + isLoading = state is AsyncImagePainter.State.Loading + isError = state is AsyncImagePainter.State.Error + } ) Box( @@ -65,13 +73,7 @@ internal fun EpisodeItemUi( .height(100.dp) .clickable { onClicked(item) } ) { - if (LocalInspectionMode.current) { - Box( - modifier = Modifier - .fillMaxSize() - .background(md_theme_light_primary) - ) - } else { + if (isError.not() && !LocalInspectionMode.current) { Image( modifier = Modifier.fillMaxSize(), painter = painter, @@ -79,24 +81,18 @@ internal fun EpisodeItemUi( contentDescription = null, ) } - - when (painter.state) { - is AsyncImagePainter.State.Loading -> { - CircularProgressIndicator( - modifier = Modifier.align(Alignment.Center), - color = colorResource(com.pluu.webtoon.ui_common.R.color.progress_accent_color) - ) - } - - is AsyncImagePainter.State.Error -> { - Image( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(com.pluu.webtoon.ui_common.R.drawable.ic_sentiment_very_dissatisfied_48), - contentDescription = null - ) - } - - else -> {} + if (isLoading || LocalInspectionMode.current) { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = colorResource(com.pluu.webtoon.ui_common.R.color.progress_accent_color) + ) + } + if (isError) { + Image( + modifier = Modifier.align(Alignment.Center), + painter = painterResource(com.pluu.webtoon.ui_common.R.drawable.ic_sentiment_very_dissatisfied_48), + contentDescription = null + ) } EpisodeItemUiOverlayUi(item = item, isRead = isRead) @@ -190,33 +186,11 @@ private fun PreviewEpisodeItemUi( AppTheme { EpisodeItemUi( modifier = Modifier - .width(280.dp) + .width(200.dp) .heightIn(min = 150.dp), item = item, isRead = values.second, onClicked = {} ) } -} - -@Preview -@Composable -private fun PreviewEpisodeItemUiOverlayUi() { - val item = EpisodeInfo( - id = "0", - toonId = "0", - title = "Title", - image = "", - isLoginNeed = true - ) - AppTheme { - EpisodeItemUiOverlayUi( - modifier = Modifier - .width(200.dp) - .background(md_theme_light_primary) - .wrapContentHeight(unbounded = true), - item = item, - isRead = true - ) - } } \ No newline at end of file diff --git a/features/ui-weekly/src/main/java/com/pluu/webtoon/weekly/ui/day/WeeklyItemUi.kt b/features/ui-weekly/src/main/java/com/pluu/webtoon/weekly/ui/day/WeeklyItemUi.kt index 57bcc2ef..2b137b68 100644 --- a/features/ui-weekly/src/main/java/com/pluu/webtoon/weekly/ui/day/WeeklyItemUi.kt +++ b/features/ui-weekly/src/main/java/com/pluu/webtoon/weekly/ui/day/WeeklyItemUi.kt @@ -15,6 +15,10 @@ import androidx.compose.material3.Card import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -35,7 +39,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension -import androidx.core.graphics.toColorInt import coil.compose.AsyncImagePainter import coil.compose.rememberAsyncImagePainter import coil.request.ImageRequest @@ -44,7 +47,6 @@ import com.pluu.webtoon.model.Status import com.pluu.webtoon.model.ToonInfo import com.pluu.webtoon.model.ToonInfoWithFavorite import com.pluu.webtoon.ui.compose.theme.AppTheme -import com.pluu.webtoon.ui.compose.theme.md_theme_light_primary import com.pluu.webtoon.utils.applyAgent import com.pluu.webtoon.weekly.R @@ -55,12 +57,18 @@ internal fun WeeklyItemUi( isFavorite: Boolean, onClicked: (ToonInfo) -> Unit ) { + var isLoading by remember { mutableStateOf(true) } + var isError by remember { mutableStateOf(false) } val painter = rememberAsyncImagePainter( model = ImageRequest.Builder(LocalContext.current) .data(item.image) .applyAgent() .crossfade(true) - .build() + .build(), + onState = { state -> + isLoading = state is AsyncImagePainter.State.Loading + isError = state is AsyncImagePainter.State.Error + } ) Card( @@ -70,26 +78,8 @@ internal fun WeeklyItemUi( .height(100.dp) .clickable { onClicked(item) } ) { - val backgroundModifier = when (painter.state) { - is AsyncImagePainter.State.Success -> { - if (item.backgroundColor.isNotEmpty()) { - Modifier.background(color = Color(item.backgroundColor.toColorInt())) - } else { - Modifier - } - } - - else -> Modifier - } - - Box(modifier = backgroundModifier) { - if (LocalInspectionMode.current) { - Box( - modifier = Modifier - .fillMaxSize() - .background(md_theme_light_primary) - ) - } else { + Box { + if (isError.not() && !LocalInspectionMode.current) { Image( modifier = Modifier.fillMaxSize(), painter = painter, @@ -97,24 +87,18 @@ internal fun WeeklyItemUi( contentDescription = null, ) } - - when (painter.state) { - is AsyncImagePainter.State.Loading -> { - CircularProgressIndicator( - modifier = Modifier.align(Alignment.Center), - color = colorResource(com.pluu.webtoon.ui_common.R.color.progress_accent_color) - ) - } - - is AsyncImagePainter.State.Error -> { - Image( - modifier = Modifier.align(Alignment.Center), - painter = painterResource(com.pluu.webtoon.ui_common.R.drawable.ic_sentiment_very_dissatisfied_48), - contentDescription = null - ) - } - - else -> {} + if (isLoading || LocalInspectionMode.current) { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center), + color = colorResource(com.pluu.webtoon.ui_common.R.color.progress_accent_color) + ) + } + if (isError) { + Image( + modifier = Modifier.align(Alignment.Center), + painter = painterResource(com.pluu.webtoon.ui_common.R.drawable.ic_sentiment_very_dissatisfied_48), + contentDescription = null + ) } WeeklyItemOverlayUi(