mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 08:17:04 +05:30
Revert "refactor(android): move post save state logic to a Paging transform"
This reverts commit 3829abeb8f
.
This commit is contained in:
parent
e6eaadbaa1
commit
4f60db29bd
6 changed files with 49 additions and 23 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
}
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue