From 692e294528cc93e4aa6300506b3fc757849a5e00 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 9 May 2022 17:07:20 +0530 Subject: [PATCH] android: move sorting and grouping of saved posts to ViewModel --- .../dev/msfjarvis/claw/android/ui/LobstersApp.kt | 2 +- .../claw/android/ui/lists/DatabasePosts.kt | 8 +++----- .../claw/android/viewmodel/ClawViewModel.kt | 15 +++++++++++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 3709497c..d5c83a43 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -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 = diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt index d8438dab..2ba39770 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt @@ -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, + items: Map>, 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( diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index d2e1ad48..49efe1d9 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -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): Map> { + 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()