From 4e54d7f66febc7586e47debe8e272a3b9b3bd479 Mon Sep 17 00:00:00 2001 From: Lokesh Gidra Date: Wed, 1 Nov 2023 20:48:03 +0800 Subject: [PATCH] Refine FavouriteStatusRouter observable stateFlow --- .../kotlin/com/hippo/ehviewer/ui/main/GalleryInfo.kt | 7 ++----- .../com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt | 6 ++---- .../com/hippo/ehviewer/util/FavouriteStatusRouter.kt | 10 +++++++++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/GalleryInfo.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/GalleryInfo.kt index 1e2559de0..68fae06f1 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/GalleryInfo.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/GalleryInfo.kt @@ -67,11 +67,8 @@ fun GalleryInfoListItem( modifier = Modifier.aspectRatio(DEFAULT_ASPECT).fillMaxSize(), ) } - val showFav by produceState(false, info.gid) { - value = info.favoriteSlot != NOT_FAVORITED && !isInFavScene - FavouriteStatusRouter.stateFlow(info.gid).collect { - value = it != NOT_FAVORITED && !isInFavScene - } + val showFav by FavouriteStatusRouter.collectAsState(info) { + it != NOT_FAVORITED && !isInFavScene } ConstraintLayout(modifier = Modifier.padding(8.dp, 4.dp).fillMaxSize()) { val (titleRef, uploaderRef, ratingRef, categoryRef, postedRef, favRef, iconsRef) = createRefs() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index c2f23af6d..10e3c5730 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -79,7 +79,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -715,9 +714,8 @@ class GalleryDetailScene : BaseScene() { .horizontalScroll(rememberScrollState()), horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterHorizontally), ) { - val favored by produceState(initialValue = false) { - value = galleryDetail.favoriteSlot != NOT_FAVORITED - FavouriteStatusRouter.stateFlow(galleryDetail.gid).collect { value = it != NOT_FAVORITED } + val favored by FavouriteStatusRouter.collectAsState(galleryDetail) { + it != NOT_FAVORITED } val favButtonText = if (favored) { galleryDetail.favoriteName ?: stringResource(id = R.string.local_favorites) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/FavouriteStatusRouter.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/FavouriteStatusRouter.kt index 433ef97cc..0334de49a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/util/FavouriteStatusRouter.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/FavouriteStatusRouter.kt @@ -15,11 +15,16 @@ */ package com.hippo.ehviewer.util +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.remember import com.hippo.ehviewer.EhDB +import com.hippo.ehviewer.client.data.GalleryInfo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.transform import kotlinx.coroutines.launch @@ -40,5 +45,8 @@ object FavouriteStatusRouter { val globalFlow = _globalFlow.asSharedFlow() - fun stateFlow(targetGid: Long) = globalFlow.transform { (gid, slot) -> if (targetGid == gid) emit(slot) } + @Composable + inline fun collectAsState(initial: GalleryInfo, crossinline transform: (Int) -> R) = remember(initial) { + globalFlow.transform { (gid, slot) -> if (initial.gid == gid) emit(slot) }.map(transform) + }.collectAsState(transform(initial.favoriteSlot)) }