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