From 3829abeb8fc3dc3aa45092971a5b2f0dd85b5725 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 8 Dec 2022 01:31:26 +0530 Subject: [PATCH] refactor(android): move post save state logic to a Paging transform Fixes #349 --- .../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 ++++++++--- 5 files changed, 23 insertions(+), 48 deletions(-) delete mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt 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 9f845031..222196af 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,7 +179,6 @@ fun LobstersApp( NetworkPosts( lazyPagingItems = hottestPosts, listState = hottestListState, - isPostSaved = viewModel::isPostSaved, postActions = postActions, ) } @@ -190,7 +189,6 @@ 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 bdbebce9..a6f20e2e 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,6 +13,7 @@ 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 @@ -33,9 +34,9 @@ fun DatabasePosts( items.forEach { (month, posts) -> stickyHeader { MonthHeader(month = month) } items(posts) { item -> - ListItem( - item = item, - isSaved = { true }, + LobstersCard( + post = 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 deleted file mode 100644 index 182d4f71..00000000 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/ListItem.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 8d383a4a..e2b36819 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,19 +27,18 @@ 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, ) { @@ -59,10 +58,10 @@ fun NetworkPosts( ) { items(lazyPagingItems) { item -> if (item != null) { - val dbModel = item.toDbModel() - ListItem( - item = dbModel, - isSaved = isPostSaved, + val (post, saved) = item + LobstersCard( + post = post.toDbModel(), + isSaved = saved, 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 cb6f5261..6db92ebb 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,6 +10,8 @@ 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 @@ -43,10 +45,16 @@ constructor( Pager(PagingConfig(pageSize = 20)) { pagingSourceFactory.create(api::getHottestPosts) } val hottestPosts - get() = hottestPostsPager.flow + get() = + hottestPostsPager.flow + .map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } } + .cachedIn(viewModelScope) val newestPosts - get() = newestPostsPager.flow + get() = + newestPostsPager.flow + .map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } } + .cachedIn(viewModelScope) private val savedPostsFlow get() = savedPostsRepository.savedPosts @@ -59,13 +67,13 @@ constructor( return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month } } - suspend fun isPostSaved(post: SavedPost): Boolean { - return savedPostsFlow.first().any { savedPost -> savedPost.shortId == post.shortId } + private suspend fun isPostSaved(shortId: String): Boolean { + return savedPostsFlow.first().any { savedPost -> savedPost.shortId == shortId } } fun toggleSave(post: SavedPost) { viewModelScope.launch(ioDispatcher) { - val saved = isPostSaved(post) + val saved = isPostSaved(post.shortId) if (saved) { savedPostsRepository.removePost(post) } else {