From 9938b80b6e92a5e4c64de8dd55fe4424d9e99907 Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Sun, 3 Dec 2023 09:24:21 +0100 Subject: [PATCH] enhancement: highlight inbox unread items (#185) --- .../core/appearance/theme/Spacing.kt | 1 + .../commonui/components/InboxMentionHeader.kt | 33 ++++++++++++--- .../inbox/mentions/InboxMentionsViewModel.kt | 12 ++++++ .../feature/inbox/messages/ChatCard.kt | 40 +++++++++++++------ .../inbox/messages/InboxMessagesScreen.kt | 3 +- .../inbox/replies/InboxRepliesViewModel.kt | 12 ++++++ 6 files changed, 81 insertions(+), 20 deletions(-) diff --git a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/Spacing.kt b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/Spacing.kt index dced83832..db36fbbf7 100644 --- a/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/Spacing.kt +++ b/core-appearance/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/appearance/theme/Spacing.kt @@ -23,6 +23,7 @@ object CornerSize { } object IconSize { + val xs = 10.dp val s = 20.dp val m = 26.dp val l = 30.dp diff --git a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/InboxMentionHeader.kt b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/InboxMentionHeader.kt index 1cdb83d29..003303ed8 100644 --- a/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/InboxMentionHeader.kt +++ b/core-commonui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/components/InboxMentionHeader.kt @@ -1,14 +1,21 @@ package com.github.diegoberaldin.raccoonforlemmy.core.commonui.components +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.FiberManualRecord +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle +import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.IconSize import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel import com.github.diegoberaldin.raccoonforlemmy.resources.MR @@ -43,10 +50,24 @@ fun InboxCardHeader( append(mention.post.title) } } - Text( - modifier = Modifier.padding(vertical = Spacing.xs, horizontal = Spacing.xs), - text = header, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onBackground, - ) + Row( + modifier = Modifier.padding(end = Spacing.s), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + modifier = Modifier + .weight(1f) + .padding(vertical = Spacing.xs, horizontal = Spacing.xs), + text = header, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onBackground, + ) + if (!mention.read) { + Icon( + modifier = Modifier.size(IconSize.xs), + imageVector = Icons.Filled.FiberManualRecord, + contentDescription = null, + ) + } + } } diff --git a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/mentions/InboxMentionsViewModel.kt b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/mentions/InboxMentionsViewModel.kt index 21268a3b3..26032492a 100644 --- a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/mentions/InboxMentionsViewModel.kt +++ b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/mentions/InboxMentionsViewModel.kt @@ -178,6 +178,18 @@ class InboxMentionsViewModel( } ) } + } else { + mvi.updateState { + it.copy( + mentions = currentState.mentions.map { m -> + if (m.id == mention.id) { + m.copy(read = read) + } else { + m + } + } + ) + } } updateUnreadItems() } diff --git a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/ChatCard.kt b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/ChatCard.kt index 4f3a2dd5c..80e7620ba 100644 --- a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/ChatCard.kt +++ b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/ChatCard.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.FiberManualRecord import androidx.compose.material.icons.filled.MoreHoriz import androidx.compose.material.icons.filled.Schedule import androidx.compose.material3.Icon @@ -49,6 +50,7 @@ import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel internal fun ChatCard( user: UserModel?, autoLoadImages: Boolean = true, + read: Boolean = true, lastMessage: String, lastMessageDate: String? = null, modifier: Modifier = Modifier, @@ -75,8 +77,6 @@ internal fun ChatCard( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Spacing.m), ) { - - if (creatorAvatar.isNotEmpty()) { CustomImage( modifier = Modifier @@ -111,19 +111,33 @@ internal fun ChatCard( } Column( + modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(Spacing.xxs) ) { - // user name - Text( - text = buildString { - append(creatorName) - if (creatorHost.isNotEmpty()) { - append("@$creatorHost") - } - }, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurface, - ) + Row( + modifier = Modifier.padding(end = Spacing.m), + verticalAlignment = Alignment.CenterVertically, + ) { + // user name + Text( + modifier = Modifier.weight(1f), + text = buildString { + append(creatorName) + if (creatorHost.isNotEmpty()) { + append("@$creatorHost") + } + }, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurface, + ) + if (!read) { + Icon( + modifier = Modifier.size(IconSize.xs), + imageVector = Icons.Filled.FiberManualRecord, + contentDescription = null, + ) + } + } ScaledContent { // last message text PostCardTitle( diff --git a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/InboxMessagesScreen.kt b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/InboxMessagesScreen.kt index 0e339387e..ef7260792 100644 --- a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/InboxMessagesScreen.kt +++ b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/messages/InboxMessagesScreen.kt @@ -114,13 +114,14 @@ class InboxMessagesScreen : Tab { items( items = uiState.chats, key = { - it.id.toString() + it.updateDate + uiState.unreadOnly + it.id.toString() + it.updateDate + it.read + uiState.unreadOnly }, ) { chat -> ChatCard( user = chat.otherUser(uiState.currentUserId), autoLoadImages = uiState.autoLoadImages, lastMessage = chat.content.orEmpty(), + read = chat.read, lastMessageDate = chat.publishDate, onOpenUser = rememberCallbackArgs { user -> navigationCoordinator.pushScreen( diff --git a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/replies/InboxRepliesViewModel.kt b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/replies/InboxRepliesViewModel.kt index 4286c1ce4..2a0628709 100644 --- a/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/replies/InboxRepliesViewModel.kt +++ b/feature-inbox/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/feature/inbox/replies/InboxRepliesViewModel.kt @@ -188,6 +188,18 @@ class InboxRepliesViewModel( } ) } + } else { + mvi.updateState { + it.copy( + replies = currentState.replies.map { r -> + if (r.id == mention.id) { + r.copy(read = read) + } else { + r + } + } + ) + } } updateUnreadItems() }