Skip to content

Commit bc655c6

Browse files
committed
1 parent c3bd149 commit bc655c6

File tree

2 files changed

+108
-0
lines changed
  • libraries
    • designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar
    • matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components

2 files changed

+108
-0
lines changed

libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ enum class AvatarSize(val dp: Dp) {
6565
UserVerification(52.dp),
6666

6767
OrganizationHeader(64.dp),
68+
SpaceMember(24.dp),
6869
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.matrix.ui.components
9+
10+
import androidx.compose.foundation.layout.Arrangement
11+
import androidx.compose.foundation.layout.Row
12+
import androidx.compose.runtime.Composable
13+
import androidx.compose.ui.Alignment
14+
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.unit.dp
16+
import io.element.android.compound.theme.ElementTheme
17+
import io.element.android.libraries.designsystem.atomic.molecules.MembersCountMolecule
18+
import io.element.android.libraries.designsystem.components.avatar.AvatarData
19+
import io.element.android.libraries.designsystem.components.avatar.AvatarRow
20+
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
21+
import io.element.android.libraries.designsystem.components.avatar.AvatarType
22+
import io.element.android.libraries.designsystem.preview.ElementPreview
23+
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
24+
import io.element.android.libraries.designsystem.theme.components.Text
25+
import io.element.android.libraries.designsystem.utils.CommonDrawables
26+
import io.element.android.libraries.matrix.api.user.MatrixUser
27+
import io.element.android.libraries.matrix.ui.model.getAvatarData
28+
import kotlinx.collections.immutable.ImmutableList
29+
import kotlinx.collections.immutable.persistentListOf
30+
import kotlinx.collections.immutable.toImmutableList
31+
32+
/**
33+
* Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3729-605&m=dev
34+
*/
35+
@Composable
36+
fun SpaceMembersView(
37+
heroes: ImmutableList<MatrixUser>,
38+
numberOfMembers: Long,
39+
modifier: Modifier = Modifier,
40+
) {
41+
if (heroes.isEmpty()) {
42+
MembersCountMolecule(
43+
memberCount = numberOfMembers,
44+
modifier = modifier,
45+
)
46+
} else {
47+
SpaceMembersWithAvatar(
48+
heroes = heroes
49+
.take(3)
50+
.map {
51+
it.getAvatarData(AvatarSize.SpaceMember)
52+
}
53+
.toImmutableList(),
54+
numberOfMembers = numberOfMembers,
55+
modifier = modifier,
56+
)
57+
}
58+
}
59+
60+
@Composable
61+
private fun SpaceMembersWithAvatar(
62+
heroes: ImmutableList<AvatarData>,
63+
numberOfMembers: Long,
64+
modifier: Modifier = Modifier,
65+
) {
66+
Row(
67+
modifier = modifier,
68+
verticalAlignment = Alignment.CenterVertically,
69+
horizontalArrangement = Arrangement.spacedBy(4.dp),
70+
) {
71+
AvatarRow(
72+
avatarDataList = heroes,
73+
avatarType = AvatarType.User,
74+
lastOnTop = true,
75+
)
76+
Text(
77+
text = "$numberOfMembers",
78+
style = ElementTheme.typography.fontBodyMdRegular,
79+
color = ElementTheme.colors.textSecondary,
80+
)
81+
}
82+
}
83+
84+
@Composable
85+
@PreviewsDayNight
86+
internal fun SpaceMembersViewNoHeroesPreview() = ElementPreview {
87+
SpaceMembersView(
88+
heroes = persistentListOf(),
89+
numberOfMembers = 123,
90+
)
91+
}
92+
93+
@Composable
94+
@PreviewsDayNight
95+
internal fun SpaceMembersViewPreview() = ElementPreview(
96+
drawableFallbackForImages = CommonDrawables.sample_avatar,
97+
) {
98+
SpaceMembersView(
99+
heroes = persistentListOf(
100+
aMatrixUser(id = "1", displayName = "Alice", avatarUrl = "aUrl"),
101+
aMatrixUser(id = "2", displayName = "Bob"),
102+
aMatrixUser(id = "3", displayName = "Charlie", avatarUrl = "aUrl"),
103+
aMatrixUser(id = "4", displayName = "Dave"),
104+
),
105+
numberOfMembers = 123,
106+
)
107+
}

0 commit comments

Comments
 (0)