From 3651c2a853ff769de4d48d5d21116f05a97c0564 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Mon, 16 Dec 2024 11:17:29 +0700 Subject: [PATCH] fix(browse): Update favorite state in real time --- .../ui/source/browse/BrowseSourceItem.kt | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt index 8e51800910..1f5c844ada 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt @@ -18,15 +18,31 @@ import eu.kanade.tachiyomi.domain.manga.models.Manga import eu.kanade.tachiyomi.ui.library.LibraryItem import eu.kanade.tachiyomi.ui.library.setBGAndFG import eu.kanade.tachiyomi.widget.AutofitRecyclerView +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import uy.kohesive.injekt.injectLazy +import yokai.domain.manga.interactor.GetManga +// FIXME: Migrate to compose class BrowseSourceItem( - val manga: Manga, + initialManga: Manga, private val catalogueAsList: Preference, private val catalogueListType: Preference, private val outlineOnCovers: Preference, ) : AbstractFlexibleItem() { + private val getManga: GetManga by injectLazy() + + val mangaId: Long = initialManga.id!! + var manga: Manga = initialManga + private set + // TODO: Could potentially cause memleak, test it with leakcanary before deploying to stable! + private val scope = MainScope() + private var job: Job? = null + override fun getLayoutRes(): Int { return if (catalogueAsList.get()) { R.layout.manga_list_item @@ -76,18 +92,34 @@ class BrowseSourceItem( position: Int, payloads: MutableList?, ) { - holder.onSetValues(manga) + if (job == null) holder.onSetValues(manga) + job?.cancel() + job = scope.launch { + getManga.subscribeByUrlAndSource(manga.url, manga.source).collectLatest { + manga = it ?: return@collectLatest + holder.onSetValues(manga) + } + } + } + + override fun unbindViewHolder( + adapter: FlexibleAdapter>?, + holder: BrowseSourceHolder?, + position: Int + ) { + job?.cancel() + job = null } override fun equals(other: Any?): Boolean { if (this === other) return true if (other is BrowseSourceItem) { - return manga.id!! == other.manga.id!! + return mangaId == other.mangaId } return false } override fun hashCode(): Int { - return manga.id!!.hashCode() + return mangaId.hashCode() } }