From 6f7c7ccd63581c15192971e1bbefb20d232a6263 Mon Sep 17 00:00:00 2001 From: Ren Amamiya Date: Mon, 11 May 2026 07:28:12 +0700 Subject: [PATCH] update chat room --- .../kotlin/su/reya/coop/screens/HomeScreen.kt | 57 ++++++++++++++++++- .../commonMain/kotlin/su/reya/coop/Room.kt | 6 +- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt index a90aed2..c9ce40d 100644 --- a/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt +++ b/composeApp/src/androidMain/kotlin/su/reya/coop/screens/HomeScreen.kt @@ -239,16 +239,69 @@ fun HomeScreen(onOpenChat: (Long) -> Unit) { @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun ChatRoom(room: Room, onClick: () -> Unit) { - val title = room.subject ?: "Room" + val viewModel = LocalNostrViewModel.current + + val memberMetadataList = room.members.map { pubkey -> + viewModel.getMetadata(pubkey).collectAsState() + } + + val displayName = if (!room.subject.isNullOrBlank()) { + room.subject + } else if (room.isGroup()) { + val profiles = memberMetadataList.map { it.value?.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" } + } else { + val firstMember = room.members.firstOrNull() + val profile = memberMetadataList.firstOrNull()?.value?.asRecord() + profile?.name ?: profile?.displayName ?: firstMember?.short() ?: "Unknown" + } + + val firstMemberMetadata by if (room.members.isNotEmpty()) { + viewModel.getMetadata(room.members.first()).collectAsState() + } else { + remember { mutableStateOf(null) } + } + val picture = firstMemberMetadata?.asRecord()?.picture ListItem( modifier = Modifier.clickable { onClick }, + leadingContent = { + if (!picture.isNullOrBlank()) { + AsyncImage( + model = picture, + contentDescription = "Room Avatar", + modifier = Modifier + .size(48.dp) + .clip(CircleShape), + contentScale = ContentScale.Crop, + ) + } else { + Icon( + painter = painterResource(Res.drawable.ic_avatar), + contentDescription = "User" + ) + } + }, headlineContent = { Text( - text = title, + text = displayName ?: "Unknown", style = MaterialTheme.typography.titleMediumEmphasized ) }, + supportingContent = { + if (!room.lastMessage.isNullOrBlank()) { + Text( + text = room.lastMessage!!, + style = MaterialTheme.typography.bodyMedium + ) + } + }, colors = ListItemDefaults.colors( containerColor = MaterialTheme.colorScheme.surface ) diff --git a/shared/src/commonMain/kotlin/su/reya/coop/Room.kt b/shared/src/commonMain/kotlin/su/reya/coop/Room.kt index 503e5ca..7ccb4a8 100644 --- a/shared/src/commonMain/kotlin/su/reya/coop/Room.kt +++ b/shared/src/commonMain/kotlin/su/reya/coop/Room.kt @@ -23,7 +23,8 @@ data class Room( val createdAt: Timestamp, val subject: String?, val members: Set, - val kind: RoomKind = RoomKind.default() + val kind: RoomKind = RoomKind.default(), + val lastMessage: String? = null ) : Comparable { override fun hashCode(): Int = id.hashCode() @@ -55,7 +56,8 @@ data class Room( id = id, createdAt = createdAt, subject = subject, - members = pubkeys as Set + members = pubkeys as Set, + lastMessage = rumor.content() ) } }