From 38f4a5b7fc4968ef215c381fa3aeedd8b96e52a1 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 19 Sep 2023 17:32:57 -0400 Subject: [PATCH] Groups notifications by day first. --- .../amethyst/ui/screen/CardFeedViewModel.kt | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index 4d521730a..58ad48293 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -34,6 +34,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter import kotlin.time.measureTimedValue @Stable @@ -173,6 +176,8 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { } } + val sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd") // SimpleDateFormat() + val allBaseNotes = zapsPerEvent.keys + boostsPerEvent.keys + reactionsPerEvent.keys val multiCards = allBaseNotes.map { baseNote -> val boostsInCard = boostsPerEvent[baseNote] ?: emptyList() @@ -180,26 +185,47 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val zapsInCard = zapsPerEvent[baseNote] ?: emptyList() val singleList = (boostsInCard + zapsInCard.map { it.response } + reactionsInCard) - .sortedWith(compareBy({ it.createdAt() }, { it.idHex })) - .reversed() + .groupBy { + sdf.format( + Instant.ofEpochSecond(it.createdAt() ?: 0) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime() + ) + } - singleList.chunked(30).map { chunk -> - MultiSetCard( - baseNote, - boostsInCard.filter { it in chunk }.toImmutableList(), - reactionsInCard.filter { it in chunk }.toImmutableList(), - zapsInCard.filter { it.response in chunk }.toImmutableList() + val days = singleList.keys.sortedBy { it } + + days.mapNotNull { + val sortedList = singleList.get(it)?.sortedWith(compareBy({ it.createdAt() }, { it.idHex }))?.reversed() + + sortedList?.chunked(30)?.map { chunk -> + MultiSetCard( + baseNote, + boostsInCard.filter { it in chunk }.toImmutableList(), + reactionsInCard.filter { it in chunk }.toImmutableList(), + zapsInCard.filter { it.response in chunk }.toImmutableList() + ) + } + }.flatten() + }.flatten() + + val userZaps = zapsPerUser.map { user -> + val byDay = user.value.groupBy { + sdf.format( + Instant.ofEpochSecond(it.createdAt() ?: 0) + .atZone(ZoneId.systemDefault()) + .toLocalDateTime() + ) + } + + byDay.values.map { + ZapUserSetCard( + user.key, + it.sortedWith(compareBy({ it.createdAt() }, { it.idHex() })).reversed().toImmutableList() ) } }.flatten() - val userZaps = zapsPerUser.map { - ZapUserSetCard( - it.key, - it.value.toImmutableList() - ) - } - val textNoteCards = notes.filter { it.event !is ReactionEvent && it.event !is RepostEvent && it.event !is GenericRepostEvent && it.event !is LnZapEvent }.map { if (it.event is PrivateDmEvent || it.event is ChatMessageEvent) { MessageSetCard(it)