From c5a3562608a4c432fd5cf560892be8c370d44298 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 11 Jan 2024 01:54:39 +0530 Subject: [PATCH] refactor(android): rework sorting mechanism and saved posts month header --- .../claw/android/ui/lists/DatabasePosts.kt | 7 ++--- .../claw/android/viewmodel/ClawViewModel.kt | 29 +++++++++++++------ .../claw/common/ui/decorations/MonthHeader.kt | 11 +++---- 3 files changed, 27 insertions(+), 20 deletions(-) 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 f55a6627..e16799e1 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 @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2023 Harsh Shandilya. + * Copyright © 2021-2024 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. @@ -28,13 +28,12 @@ import androidx.compose.ui.unit.dp import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.ui.decorations.MonthHeader import dev.msfjarvis.claw.database.local.SavedPost -import java.time.Month import kotlinx.collections.immutable.ImmutableMap @OptIn(ExperimentalFoundationApi::class) @Composable fun DatabasePosts( - items: ImmutableMap>, + items: ImmutableMap>, listState: LazyListState, postActions: PostActions, modifier: Modifier = Modifier, @@ -53,7 +52,7 @@ fun DatabasePosts( } else { LazyColumn(state = listState) { items.forEach { (month, posts) -> - stickyHeader(contentType = "month-header") { MonthHeader(month = month) } + stickyHeader(contentType = "month-header") { MonthHeader(label = month) } items( items = posts, key = { it.shortId }, 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 e297f90c..a6e09e44 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 @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2023 Harsh Shandilya. + * Copyright © 2021-2024 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. @@ -11,6 +11,8 @@ import android.content.Context import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.compose.ui.text.capitalize +import androidx.compose.ui.text.intl.Locale import androidx.glance.appwidget.updateAll import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope @@ -36,7 +38,6 @@ import java.io.InputStream import java.io.OutputStream import java.net.HttpURLConnection import java.time.LocalDateTime -import java.time.Month import java.time.ZoneId import java.time.format.DateTimeFormatter import javax.inject.Inject @@ -87,10 +88,7 @@ constructor( get() = newestPostsPager.flow val savedPosts - get() = - savedPostsRepository.savedPosts.map { - it.sortedByDescending { post -> post.createdAt.toLocalDateTime() } - } + get() = savedPostsRepository.savedPosts val savedPostsByMonth get() = savedPosts.map(::mapSavedPosts) @@ -111,12 +109,25 @@ constructor( } } - private fun mapSavedPosts(items: List): ImmutableMap> { + private fun mapSavedPosts(items: List): ImmutableMap> { val sorted = items.sortedWith { post1, post2 -> - post2.createdAt.toLocalDateTime().compareTo(post1.createdAt.toLocalDateTime()) + val post1Date = post1.createdAt.toLocalDateTime() + val post2Date = post2.createdAt.toLocalDateTime() + if (post2Date.isBefore(post1Date)) { + -1 + } else if (post2Date.isAfter(post1Date)) { + 1 + } else { + 0 + } } - return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }.toImmutableMap() + return sorted + .groupBy { post -> + val time = post.createdAt.toLocalDateTime() + "${time.month.name.lowercase().capitalize(Locale.current)} ${time.year}" + } + .toImmutableMap() } fun isPostSaved(post: SavedPost): Boolean { diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/ui/decorations/MonthHeader.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/ui/decorations/MonthHeader.kt index 856a04f7..939c5ee1 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/ui/decorations/MonthHeader.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/ui/decorations/MonthHeader.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Harsh Shandilya. + * Copyright © 2022-2024 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. @@ -15,18 +15,15 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.text.capitalize -import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import dev.msfjarvis.claw.common.theme.LobstersTheme import dev.msfjarvis.claw.common.ui.preview.DevicePreviews import dev.msfjarvis.claw.common.ui.preview.ThemePreviews import dev.msfjarvis.claw.common.ui.surfaceColorAtNavigationBarElevation -import java.time.Month @Composable fun MonthHeader( - month: Month, + label: String, modifier: Modifier = Modifier, ) { Box( @@ -36,7 +33,7 @@ fun MonthHeader( .background(MaterialTheme.colorScheme.surfaceColorAtNavigationBarElevation()) ) { Text( - text = month.name.lowercase().capitalize(Locale.current), + text = label, style = MaterialTheme.typography.headlineSmall, modifier = Modifier.padding(horizontal = 12.dp, vertical = 12.dp), ) @@ -47,5 +44,5 @@ fun MonthHeader( @ThemePreviews @Composable fun MonthHeaderPreview() { - LobstersTheme { MonthHeader(month = Month.APRIL) } + LobstersTheme { MonthHeader("April 2023") } }