From 4f60db29bd84e557af7fd5dba3984fcfd21fff64 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 9 Dec 2022 21:01:48 +0530 Subject: [PATCH] Revert "refactor(android): move post save state logic to a Paging transform" This reverts commit 3829abeb8fc3dc3aa45092971a5b2f0dd85b5725. --- CHANGELOG.md | 1 + .../msfjarvis/claw/android/ui/LobstersApp.kt | 2 ++ .../claw/android/ui/lists/DatabasePosts.kt | 7 ++--- .../claw/android/ui/lists/ListItem.kt | 31 +++++++++++++++++++ .../claw/android/ui/lists/NetworkPosts.kt | 13 ++++---- .../claw/android/viewmodel/ClawViewModel.kt | 18 +++-------- 6 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index dc081a1c..fc4c6e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Do not schedule post update job every time the app starts - Improve favicon loading to reduce unnecessary redraws +- Fix post lists being reloaded unnecessarily ## [1.11.0] - 2022-12-07 diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 222196af..9f845031 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -179,6 +179,7 @@ fun LobstersApp( NetworkPosts( lazyPagingItems = hottestPosts, listState = hottestListState, + isPostSaved = viewModel::isPostSaved, postActions = postActions, ) } @@ -189,6 +190,7 @@ fun LobstersApp( NetworkPosts( lazyPagingItems = newestPosts, listState = newestListState, + isPostSaved = viewModel::isPostSaved, postActions = postActions, ) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt index a6f20e2e..bdbebce9 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt @@ -13,7 +13,6 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material3.Divider import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import dev.msfjarvis.claw.common.posts.LobstersCard import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.ui.decorations.MonthHeader import dev.msfjarvis.claw.database.local.SavedPost @@ -34,9 +33,9 @@ fun DatabasePosts( items.forEach { (month, posts) -> stickyHeader { MonthHeader(month = month) } items(posts) { item -> - LobstersCard( - post = item, - isSaved = true, + ListItem( + item = item, + isSaved = { true }, postActions = postActions, ) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt new file mode 100644 index 00000000..182d4f71 --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt @@ -0,0 +1,31 @@ +/* + * Copyright © 2021-2022 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.android.ui.lists + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState +import androidx.compose.ui.Modifier +import dev.msfjarvis.claw.common.posts.LobstersCard +import dev.msfjarvis.claw.common.posts.PostActions +import dev.msfjarvis.claw.database.local.SavedPost + +@Composable +fun ListItem( + item: SavedPost, + isSaved: suspend (SavedPost) -> Boolean, + postActions: PostActions, + modifier: Modifier = Modifier, +) { + val saved by produceState(false, item) { value = isSaved(item) } + LobstersCard( + post = item, + isSaved = saved, + postActions = postActions, + modifier = modifier, + ) +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt index e2b36819..8d383a4a 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/NetworkPosts.kt @@ -27,18 +27,19 @@ import androidx.compose.ui.unit.dp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.items -import dev.msfjarvis.claw.common.posts.LobstersCard import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.toDbModel import dev.msfjarvis.claw.common.ui.NetworkError import dev.msfjarvis.claw.common.ui.ProgressBar +import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.model.LobstersPost @OptIn(ExperimentalMaterialApi::class) @Composable fun NetworkPosts( - lazyPagingItems: LazyPagingItems>, + lazyPagingItems: LazyPagingItems, listState: LazyListState, + isPostSaved: suspend (SavedPost) -> Boolean, postActions: PostActions, modifier: Modifier = Modifier, ) { @@ -58,10 +59,10 @@ fun NetworkPosts( ) { items(lazyPagingItems) { item -> if (item != null) { - val (post, saved) = item - LobstersCard( - post = post.toDbModel(), - isSaved = saved, + val dbModel = item.toDbModel() + ListItem( + item = dbModel, + isSaved = isPostSaved, postActions = postActions, ) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index 6db92ebb..cb6f5261 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -10,8 +10,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.paging.Pager import androidx.paging.PagingConfig -import androidx.paging.cachedIn -import androidx.paging.map import com.deliveryhero.whetstone.viewmodel.ContributesViewModel import com.slack.eithernet.ApiResult.Failure import com.slack.eithernet.ApiResult.Success @@ -45,16 +43,10 @@ constructor( Pager(PagingConfig(pageSize = 20)) { pagingSourceFactory.create(api::getHottestPosts) } val hottestPosts - get() = - hottestPostsPager.flow - .map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } } - .cachedIn(viewModelScope) + get() = hottestPostsPager.flow val newestPosts - get() = - newestPostsPager.flow - .map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } } - .cachedIn(viewModelScope) + get() = newestPostsPager.flow private val savedPostsFlow get() = savedPostsRepository.savedPosts @@ -67,13 +59,13 @@ constructor( return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month } } - private suspend fun isPostSaved(shortId: String): Boolean { - return savedPostsFlow.first().any { savedPost -> savedPost.shortId == shortId } + suspend fun isPostSaved(post: SavedPost): Boolean { + return savedPostsFlow.first().any { savedPost -> savedPost.shortId == post.shortId } } fun toggleSave(post: SavedPost) { viewModelScope.launch(ioDispatcher) { - val saved = isPostSaved(post.shortId) + val saved = isPostSaved(post) if (saved) { savedPostsRepository.removePost(post) } else {