mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 08:17:04 +05:30
android: move sorting and grouping of saved posts to ViewModel
This commit is contained in:
parent
d659d04bd4
commit
692e294528
3 changed files with 17 additions and 8 deletions
|
@ -73,7 +73,7 @@ fun LobstersApp(
|
|||
|
||||
val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems()
|
||||
val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems()
|
||||
val savedPosts by viewModel.savedPosts.collectAsState(emptyList())
|
||||
val savedPosts by viewModel.savedPosts.collectAsState(emptyMap())
|
||||
|
||||
LobstersTheme(
|
||||
providedValues =
|
||||
|
|
|
@ -6,28 +6,26 @@ import androidx.compose.foundation.lazy.LazyListState
|
|||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import dev.msfjarvis.claw.android.ui.asZonedDateTime
|
||||
import dev.msfjarvis.claw.android.ui.decorations.MonthHeader
|
||||
import dev.msfjarvis.claw.common.posts.PostActions
|
||||
import dev.msfjarvis.claw.common.ui.Divider
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import java.time.Month
|
||||
|
||||
@OptIn(ExperimentalFoundationApi::class)
|
||||
@Composable
|
||||
fun DatabasePosts(
|
||||
items: List<SavedPost>,
|
||||
items: Map<Month, List<SavedPost>>,
|
||||
listState: LazyListState,
|
||||
isSaved: suspend (SavedPost) -> Boolean,
|
||||
postActions: PostActions,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val sorted = items.sortedByDescending { post -> post.createdAt.asZonedDateTime() }
|
||||
val grouped = sorted.groupBy { post -> post.createdAt.asZonedDateTime().month }
|
||||
LazyColumn(
|
||||
state = listState,
|
||||
modifier = modifier,
|
||||
) {
|
||||
grouped.forEach { (month, posts) ->
|
||||
items.forEach { (month, posts) ->
|
||||
stickyHeader { MonthHeader(month = month) }
|
||||
items(posts) { item ->
|
||||
ListItem(
|
||||
|
|
|
@ -6,12 +6,15 @@ import androidx.paging.Pager
|
|||
import androidx.paging.PagingConfig
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dev.msfjarvis.claw.android.paging.LobstersPagingSource
|
||||
import dev.msfjarvis.claw.android.ui.asZonedDateTime
|
||||
import dev.msfjarvis.claw.api.LobstersApi
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import java.time.Month
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.mapLatest
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
@ -41,11 +44,19 @@ constructor(
|
|||
val newestPosts
|
||||
get() = newestPostsPager.flow
|
||||
|
||||
val savedPosts
|
||||
private val savedPostsFlow
|
||||
get() = repository.savedPosts
|
||||
|
||||
val savedPosts
|
||||
get() = savedPostsFlow.map(::mapSavedPosts)
|
||||
|
||||
private fun mapSavedPosts(items: List<SavedPost>): Map<Month, List<SavedPost>> {
|
||||
val sorted = items.sortedByDescending { post -> post.createdAt.asZonedDateTime() }
|
||||
return sorted.groupBy { post -> post.createdAt.asZonedDateTime().month }
|
||||
}
|
||||
|
||||
suspend fun isPostSaved(post: SavedPost): Boolean {
|
||||
return savedPosts
|
||||
return savedPostsFlow
|
||||
.mapLatest { posts -> posts.map { it.shortId } }
|
||||
.mapLatest { shortIds -> post.shortId in shortIds }
|
||||
.first()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue