From 711d72b09eba49d68bff515a15434f910361ebc0 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Tue, 2 Jun 2026 21:16:57 +0200 Subject: [PATCH] Color the profile --- .../model/intermdiate/LocalChatMessage.kt | 5 +++ .../model/intermdiate/LocalChatRoom.kt | 42 ++++++++++++++++++- .../ui/composable/ChatRoomDetailScreen.kt | 15 +++---- .../ChatRoomDetailMessageListViewModel.kt | 4 +- .../ui/view/model/ChatRoomListViewModel.kt | 24 +++-------- 5 files changed, 60 insertions(+), 30 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatMessage.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatMessage.kt index 4e39e20b..1182849f 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatMessage.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatMessage.kt @@ -12,4 +12,9 @@ import androidx.room3.Relation data class LocalChatMessage( @Embedded val chatMessage: ChatMessage, + @Relation( + parentColumns = ["senderPublicKey"], + entityColumns = ["publicKey"] + ) + val profile: Profile?, ) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatRoom.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatRoom.kt index 53b480af..fc64c14a 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatRoom.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalChatRoom.kt @@ -5,6 +5,12 @@ import ac.cord.auxiliary.compose.database.model.Mention import ac.cord.auxiliary.compose.database.model.Participant import ac.cord.auxiliary.compose.database.model.Post import ac.cord.auxiliary.compose.database.model.Profile +import ac.cord.auxiliary.compose.ui.composable.widgets.profile.ProfileColor +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle import androidx.room3.Embedded import androidx.room3.Relation @@ -17,4 +23,38 @@ data class LocalChatRoom( entityColumns = ["chatRoomId"], ) val participants: List = emptyList(), -) +) { + @Composable + fun RenderChatRoomTitleText() { + if (chatRoom.subject != null) { + Text( + text = chatRoom.subject, + color = ProfileColor.fromPublicKey(chatRoom.id) + ) + } else { + if (participants.size == 1) { + Text( + text = "Note to Self (${participants.first().profile?.humanReadableNameOrPubkey()})" + ) + } else { + // Remove the active user publicKey from participants... + val participantNames = participants.filter { it.participant.participantPublicKey != chatRoom.userPublicKey }.map { buildAnnotatedString { + withStyle(style = SpanStyle(color = ProfileColor.fromPublicKey(it.participant.participantPublicKey))) { + append(it.profile?.humanReadableNameOrPubkey() ?: "unknown participant") + } + } } + + Text( + text = buildAnnotatedString { + participantNames.forEachIndexed { index, participantName -> + if (index != 0) { + append(", ") + } + append(participantName) + } + }, + ) + } + } + } +} diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/ChatRoomDetailScreen.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/ChatRoomDetailScreen.kt index 8efe31e8..dab3e6d7 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/ChatRoomDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/composable/ChatRoomDetailScreen.kt @@ -6,6 +6,7 @@ import ac.cord.auxiliary.compose.database.model.intermdiate.LocalChatRoom import ac.cord.auxiliary.compose.repository.ChatRepository import ac.cord.auxiliary.compose.repository.NostrRepository import ac.cord.auxiliary.compose.ui.composable.widgets.LoadingDataIndicator +import ac.cord.auxiliary.compose.ui.composable.widgets.profile.ProfileColor import ac.cord.auxiliary.compose.ui.theme.AuxTheme import ac.cord.auxiliary.compose.ui.view.model.ChatRoomDetailMessageListViewModel import ac.cord.auxiliary.compose.ui.view.model.ChatRoomDetailViewModel @@ -62,7 +63,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel @@ -114,16 +118,7 @@ fun ChatRoomDetailScreen( topBar = { TopAppBar( title = { - val messageTitle = chatRoomDetailUIState.localChatRoom.chatRoom.subject ?: if (chatRoomDetailUIState.localChatRoom.participants.size == 1) { - "Note to Self (${chatRoomDetailUIState.localChatRoom.participants.first().profile?.humanReadableNameOrPubkey()})" - } else { - // Remove the active user publicKey from participants... - chatRoomDetailUIState.localChatRoom.participants.filter { it.participant.participantPublicKey != chatRoomDetailUIState.localChatRoom.chatRoom.userPublicKey }.map { it.profile?.humanReadableNameOrPubkey() ?: "unknown participant" }.joinToString() - } - - Text( - text = messageTitle - ) + chatRoomDetailUIState.localChatRoom.RenderChatRoomTitleText() } ) } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailMessageListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailMessageListViewModel.kt index f10a8cd4..9d4854a8 100755 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailMessageListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomDetailMessageListViewModel.kt @@ -4,6 +4,7 @@ import ac.cord.auxiliary.compose.database.model.intermdiate.LocalChatRoom import ac.cord.auxiliary.compose.extensions.toFormattedTimeAndDateString import ac.cord.auxiliary.compose.repository.ChatRepository import ac.cord.auxiliary.compose.repository.NostrRepository +import ac.cord.auxiliary.compose.ui.composable.widgets.profile.ProfileColor import ac.cord.auxiliary.compose.ui.view.state.ChatRoomDetailMessageListUIState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxWithConstraints @@ -187,9 +188,10 @@ class ChatRoomDetailMessageListViewModel( ) { if (localChatMessage.chatMessage.isUserMessage.not()) { Text( - text = localChatMessage.chatMessage.senderPublicKey, // TODO: Get send name... + text = localChatMessage.profile?.humanReadableNameOrPubkey() ?: localChatMessage.chatMessage.senderPublicKey, maxLines = 1, overflow = TextOverflow.MiddleEllipsis, + color = ProfileColor.fromPublicKey(localChatMessage.chatMessage.senderPublicKey), style = MaterialTheme.typography.labelSmall ) } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt index 43b9b913..2745325d 100755 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/ChatRoomListViewModel.kt @@ -1,12 +1,14 @@ package ac.cord.auxiliary.compose.ui.view.model import ac.cord.auxiliary.compose.database.model.NegentropySynchronizeRequest +import ac.cord.auxiliary.compose.database.model.Profile import ac.cord.auxiliary.compose.database.model.types.SynchronizationFilter import ac.cord.auxiliary.compose.nostr.Relays import ac.cord.auxiliary.compose.repository.ChatRepository import ac.cord.auxiliary.compose.repository.NostrRepository import ac.cord.auxiliary.compose.ui.composable.navigation.routes.ChatRoomDetailRoute import ac.cord.auxiliary.compose.ui.composable.navigation.routes.Route +import ac.cord.auxiliary.compose.ui.composable.widgets.profile.ProfileColor import ac.cord.auxiliary.compose.ui.view.state.ChatRoomListUIState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -26,7 +28,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue 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.style.TextAlign +import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider @@ -130,12 +135,6 @@ class ChatRoomListViewModel( modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(10.dp) ) { - item { - Text( - text = "Messages" - ) - } - items( items = chatRoomListUIState.chatRoomList, key = { it.chatRoom.id } @@ -154,18 +153,7 @@ class ChatRoomListViewModel( modifier = Modifier.padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - if (localChatRoom.participants.size == 1) { - Text( - text = "Note to Self (${localChatRoom.participants.first().profile?.humanReadableNameOrPubkey()})" - ) - } else { - // Remove the active user publicKey from participants... - val participantNames = localChatRoom.participants.filter { it.participant.participantPublicKey != localChatRoom.chatRoom.userPublicKey }.map { it.profile?.humanReadableNameOrPubkey() ?: "unknown participant" } - - Text( - text = localChatRoom.chatRoom.subject ?: participantNames.joinToString() - ) - } + localChatRoom.RenderChatRoomTitleText() } } }