diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/shared/RoomHelper.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/shared/RoomHelper.kt index 5efe323..b87f789 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/shared/RoomHelper.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/shared/RoomHelper.kt @@ -9,25 +9,32 @@ import su.reya.coop.Room import su.reya.coop.short fun Room.displayNameFlow(viewModel: NostrViewModel): Flow { - if (!subject.isNullOrBlank()) return flowOf(subject!!) + // Return early if there's a custom subject/room name + subject?.takeIf { it.isNotBlank() }?.let { return flowOf(it) } - val memberFlows = members.map { viewModel.getMetadata(it) } + val displayMembers = if (isGroup()) members.take(2) else members.take(1) + if (displayMembers.isEmpty()) return flowOf("Unknown") + + return combine(displayMembers.map { viewModel.getMetadata(it) }) { metadataArray -> + val names = metadataArray.mapIndexed { i, metadata -> + val profile = metadata?.asRecord() + profile?.name?.takeIf { it.isNotBlank() } + ?: profile?.displayName?.takeIf { it.isNotBlank() } + ?: displayMembers[i].short() + } - return combine(memberFlows) { metadataArray -> if (isGroup()) { - val profiles = metadataArray.map { it?.asRecord() } - val names = profiles.take(2).mapNotNull { it?.name ?: it?.displayName } - var combined = names.joinToString(", ") - if (profiles.size > 2) combined += ", +${profiles.size - 2}" - combined.ifBlank { "Unknown group" } + val combined = names.joinToString(", ") + val extraCount = members.size - names.size + if (extraCount > 0) "$combined, +$extraCount" else combined } else { - val profile = metadataArray.firstOrNull()?.asRecord() - profile?.name ?: profile?.displayName ?: members.firstOrNull()?.short() ?: "Unknown" + val name = names.first() + if (displayMembers.first() == viewModel.currentUser()) "$name (you)" else name } } } fun Room.pictureFlow(viewModel: NostrViewModel): Flow { - val firstMember = members.firstOrNull() ?: return kotlinx.coroutines.flow.flowOf(null) + val firstMember = members.firstOrNull() ?: return flowOf(null) return viewModel.getMetadata(firstMember).map { it?.asRecord()?.picture } -} +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt index a89c0c9..1d654f0 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/Nostr.kt @@ -699,7 +699,7 @@ class Nostr { } suspend fun sendMessage( - to: List, + to: Set, content: String, subject: String? = null, replies: List = emptyList(), @@ -728,7 +728,7 @@ class Nostr { tags.add(Tag.publicKey(pubkey)) } - for (receiver in listOf(currentUser) + to) { + for (receiver in setOf(currentUser) + to) { // Construct the rumor event // NEVER SIGN this event with the current user signer val rumor = EventBuilder diff --git a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt index f3dfebb..a5fbb77 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/NostrViewModel.kt @@ -548,7 +548,7 @@ class NostrViewModel( try { val room = getChatRoom(roomId) nostr.sendMessage( - to = room.members.toList(), + to = room.members, content = message, subject = room.subject, replies = replies,