android: move sorting and grouping of saved posts to ViewModel

This commit is contained in:
Harsh Shandilya 2022-05-09 17:07:20 +05:30
parent d659d04bd4
commit 692e294528
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 17 additions and 8 deletions

View file

@ -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 =

View file

@ -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(

View file

@ -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()