Revert "refactor(android): move post save state logic to a Paging transform"

This reverts commit 3829abeb8f.
This commit is contained in:
Harsh Shandilya 2022-12-09 21:01:48 +05:30
parent e6eaadbaa1
commit 4f60db29bd
No known key found for this signature in database
6 changed files with 49 additions and 23 deletions

View file

@ -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 - Do not schedule post update job every time the app starts
- Improve favicon loading to reduce unnecessary redraws - Improve favicon loading to reduce unnecessary redraws
- Fix post lists being reloaded unnecessarily
## [1.11.0] - 2022-12-07 ## [1.11.0] - 2022-12-07

View file

@ -179,6 +179,7 @@ fun LobstersApp(
NetworkPosts( NetworkPosts(
lazyPagingItems = hottestPosts, lazyPagingItems = hottestPosts,
listState = hottestListState, listState = hottestListState,
isPostSaved = viewModel::isPostSaved,
postActions = postActions, postActions = postActions,
) )
} }
@ -189,6 +190,7 @@ fun LobstersApp(
NetworkPosts( NetworkPosts(
lazyPagingItems = newestPosts, lazyPagingItems = newestPosts,
listState = newestListState, listState = newestListState,
isPostSaved = viewModel::isPostSaved,
postActions = postActions, postActions = postActions,
) )
} }

View file

@ -13,7 +13,6 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Divider import androidx.compose.material3.Divider
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import dev.msfjarvis.claw.common.posts.LobstersCard
import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.ui.decorations.MonthHeader import dev.msfjarvis.claw.common.ui.decorations.MonthHeader
import dev.msfjarvis.claw.database.local.SavedPost import dev.msfjarvis.claw.database.local.SavedPost
@ -34,9 +33,9 @@ fun DatabasePosts(
items.forEach { (month, posts) -> items.forEach { (month, posts) ->
stickyHeader { MonthHeader(month = month) } stickyHeader { MonthHeader(month = month) }
items(posts) { item -> items(posts) { item ->
LobstersCard( ListItem(
post = item, item = item,
isSaved = true, isSaved = { true },
postActions = postActions, postActions = postActions,
) )

View file

@ -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,
)
}

View file

@ -27,18 +27,19 @@ import androidx.compose.ui.unit.dp
import androidx.paging.LoadState import androidx.paging.LoadState
import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.items 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.PostActions
import dev.msfjarvis.claw.common.posts.toDbModel import dev.msfjarvis.claw.common.posts.toDbModel
import dev.msfjarvis.claw.common.ui.NetworkError import dev.msfjarvis.claw.common.ui.NetworkError
import dev.msfjarvis.claw.common.ui.ProgressBar import dev.msfjarvis.claw.common.ui.ProgressBar
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LobstersPost import dev.msfjarvis.claw.model.LobstersPost
@OptIn(ExperimentalMaterialApi::class) @OptIn(ExperimentalMaterialApi::class)
@Composable @Composable
fun NetworkPosts( fun NetworkPosts(
lazyPagingItems: LazyPagingItems<Pair<LobstersPost, Boolean>>, lazyPagingItems: LazyPagingItems<LobstersPost>,
listState: LazyListState, listState: LazyListState,
isPostSaved: suspend (SavedPost) -> Boolean,
postActions: PostActions, postActions: PostActions,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -58,10 +59,10 @@ fun NetworkPosts(
) { ) {
items(lazyPagingItems) { item -> items(lazyPagingItems) { item ->
if (item != null) { if (item != null) {
val (post, saved) = item val dbModel = item.toDbModel()
LobstersCard( ListItem(
post = post.toDbModel(), item = dbModel,
isSaved = saved, isSaved = isPostSaved,
postActions = postActions, postActions = postActions,
) )

View file

@ -10,8 +10,6 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
import androidx.paging.cachedIn
import androidx.paging.map
import com.deliveryhero.whetstone.viewmodel.ContributesViewModel import com.deliveryhero.whetstone.viewmodel.ContributesViewModel
import com.slack.eithernet.ApiResult.Failure import com.slack.eithernet.ApiResult.Failure
import com.slack.eithernet.ApiResult.Success import com.slack.eithernet.ApiResult.Success
@ -45,16 +43,10 @@ constructor(
Pager(PagingConfig(pageSize = 20)) { pagingSourceFactory.create(api::getHottestPosts) } Pager(PagingConfig(pageSize = 20)) { pagingSourceFactory.create(api::getHottestPosts) }
val hottestPosts val hottestPosts
get() = get() = hottestPostsPager.flow
hottestPostsPager.flow
.map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } }
.cachedIn(viewModelScope)
val newestPosts val newestPosts
get() = get() = newestPostsPager.flow
newestPostsPager.flow
.map { pagingData -> pagingData.map { item -> item to isPostSaved(item.shortId) } }
.cachedIn(viewModelScope)
private val savedPostsFlow private val savedPostsFlow
get() = savedPostsRepository.savedPosts get() = savedPostsRepository.savedPosts
@ -67,13 +59,13 @@ constructor(
return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month } return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }
} }
private suspend fun isPostSaved(shortId: String): Boolean { suspend fun isPostSaved(post: SavedPost): Boolean {
return savedPostsFlow.first().any { savedPost -> savedPost.shortId == shortId } return savedPostsFlow.first().any { savedPost -> savedPost.shortId == post.shortId }
} }
fun toggleSave(post: SavedPost) { fun toggleSave(post: SavedPost) {
viewModelScope.launch(ioDispatcher) { viewModelScope.launch(ioDispatcher) {
val saved = isPostSaved(post.shortId) val saved = isPostSaved(post)
if (saved) { if (saved) {
savedPostsRepository.removePost(post) savedPostsRepository.removePost(post)
} else { } else {