diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/StickyMonthHeader.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/StickyMonthHeader.kt new file mode 100644 index 00000000..f597471c --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/StickyMonthHeader.kt @@ -0,0 +1,31 @@ +package dev.msfjarvis.claw.android.ui.decorations + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import dev.msfjarvis.claw.android.ui.surfaceColorAtNavigationBarElevation +import java.time.Month +import java.time.format.TextStyle as JTextStyle +import java.util.Locale + +@Composable +fun MonthHeader(month: Month) { + Box( + Modifier.fillMaxWidth() + .wrapContentHeight() + .background(MaterialTheme.colorScheme.surfaceColorAtNavigationBarElevation()) + ) { + Text( + text = month.getDisplayName(JTextStyle.FULL, Locale.getDefault()), + style = MaterialTheme.typography.headlineSmall, + modifier = Modifier.padding(horizontal = 12.dp, vertical = 12.dp), + ) + } +} 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 61f00616..d58d07a3 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,15 +1,18 @@ package dev.msfjarvis.claw.android.ui.lists +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.lazy.LazyColumn 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 +@OptIn(ExperimentalFoundationApi::class) @Composable fun DatabasePosts( items: List, @@ -18,18 +21,23 @@ fun DatabasePosts( postActions: PostActions, modifier: Modifier = Modifier, ) { + val sorted = items.sortedBy { post -> post.createdAt.asZonedDateTime() } + val grouped = sorted.groupBy { post -> post.createdAt.asZonedDateTime().month } LazyColumn( state = listState, modifier = modifier, ) { - items(items.sortedBy { post -> post.createdAt.asZonedDateTime() }) { item -> - ListItem( - item = item, - isSaved = isSaved, - postActions = postActions, - ) + grouped.forEach { (month, posts) -> + stickyHeader { MonthHeader(month = month) } + items(posts) { item -> + ListItem( + item = item, + isSaved = isSaved, + postActions = postActions, + ) - Divider() + Divider() + } } } }