GroupChatInfoView: render group members inside the same SectionView card as owner

Previously the members card showed only the current user (owner) and the
add-members button — the actual group members were rendered as separate
LazyColumn items() OUTSIDE the SectionView, so they sat on the gray
canvas without card chrome. Visually inconsistent: owner in a card,
everyone else floating.

Move filteredMembers.value.forEach { ... } INSIDE the SectionView lambda
so every member row is part of the same card as the owner. Drop the
explicit Divider() call (auto-divider handles it now). Move remember
key to member.groupMemberId so per-member state survives reorders.

Trade-off: lazy rendering of member rows is replaced with eager
composition inside a Column. For typical groups (<100 members) this is
imperceptible; very large groups may compose slower on open. Watching
for reports.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
another-simple-pixel
2026-05-16 08:26:42 -07:00
co-authored by Claude Opus 4.7
parent 75006897e3
commit fa29bb7a71
@@ -721,13 +721,8 @@ fun ModalData.GroupChatInfoLayout(
SectionItemView(minHeight = 54.dp, padding = PaddingValues(horizontal = DEFAULT_PADDING)) { SectionItemView(minHeight = 54.dp, padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
MemberRow(groupInfo.membership, user = true) MemberRow(groupInfo.membership, user = true)
} }
} filteredMembers.value.forEach { member ->
} val showMenu = remember(member.groupMemberId) { mutableStateOf(false) }
}
if (!groupInfo.nextConnectPrepared && !groupInfo.useRelays) {
items(filteredMembers.value, key = { it.groupMemberId }) { member ->
Divider()
val showMenu = remember { mutableStateOf(false) }
val canBeSelected = groupInfo.membership.memberRole >= member.memberRole && member.memberRole < GroupMemberRole.Moderator val canBeSelected = groupInfo.membership.memberRole >= member.memberRole && member.memberRole < GroupMemberRole.Moderator
SectionItemViewLongClickable( SectionItemViewLongClickable(
click = { click = {
@@ -756,6 +751,8 @@ fun ModalData.GroupChatInfoLayout(
} }
} }
} }
}
}
item { item {
if (!groupInfo.nextConnectPrepared && !groupInfo.useRelays) { if (!groupInfo.nextConnectPrepared && !groupInfo.useRelays) {
SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false)