Color the profile

This commit is contained in:
Kgothatso Ngako
2026-06-02 21:16:57 +02:00
parent 3b73f1932f
commit 711d72b09e
5 changed files with 60 additions and 30 deletions

View File

@@ -12,4 +12,9 @@ import androidx.room3.Relation
data class LocalChatMessage(
@Embedded val chatMessage: ChatMessage,
@Relation(
parentColumns = ["senderPublicKey"],
entityColumns = ["publicKey"]
)
val profile: Profile?,
)

View File

@@ -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<LocalParticipant> = 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)
}
},
)
}
}
}
}

View File

@@ -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()
}
)
}

View File

@@ -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
)
}

View File

@@ -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()
}
}
}