Skip to content

Commit a22ab5e

Browse files
committed
Add space header.
1 parent a0ec865 commit a22ab5e

File tree

9 files changed

+152
-31
lines changed

9 files changed

+152
-31
lines changed

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesPresenter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class HomeSpacesPresenter @Inject constructor(
4343
}
4444

4545
return HomeSpacesState(
46+
space = CurrentSpace.Root,
4647
spaceRooms = spaceRooms,
4748
seenSpaceInvites = seenSpaceInvites,
4849
hideInvitesAvatar = hideInvitesAvatar,

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesState.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,14 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
1212
import kotlinx.collections.immutable.ImmutableSet
1313

1414
data class HomeSpacesState(
15+
val space: CurrentSpace,
1516
val spaceRooms: List<SpaceRoom>,
1617
val seenSpaceInvites: ImmutableSet<SpaceId>,
1718
val hideInvitesAvatar: Boolean,
1819
val eventSink: (HomeSpacesEvents) -> Unit,
1920
)
21+
22+
sealed interface CurrentSpace {
23+
object Root : CurrentSpace
24+
data class Space(val spaceRoom: SpaceRoom) : CurrentSpace
25+
}

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesStateProvider.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,25 @@ open class HomeSpacesStateProvider : PreviewParameterProvider<HomeSpacesState> {
1919
spaceRooms = SpaceRoomProvider().values.toList(),
2020
seenSpaceInvites = setOf(
2121
SpaceId("!spaceId3:example.com"),
22-
).toImmutableSet(),
23-
)
22+
),
23+
),
24+
aHomeSpacesState(
25+
space = CurrentSpace.Space(
26+
spaceRoom = aSpaceRooms(spaceId = SpaceId("!mySpace:example.com"))
27+
),
28+
spaceRooms = aListOfSpaceRooms(),
29+
),
2430
)
2531
}
2632

2733
internal fun aHomeSpacesState(
34+
space: CurrentSpace = CurrentSpace.Root,
2835
spaceRooms: List<SpaceRoom> = aListOfSpaceRooms(),
2936
seenSpaceInvites: Set<SpaceId> = emptySet(),
3037
hideInvitesAvatar: Boolean = false,
3138
eventSink: (HomeSpacesEvents) -> Unit = {},
3239
) = HomeSpacesState(
40+
space = space,
3341
spaceRooms = spaceRooms,
3442
seenSpaceInvites = seenSpaceInvites.toImmutableSet(),
3543
hideInvitesAvatar = hideInvitesAvatar,
@@ -38,8 +46,8 @@ internal fun aHomeSpacesState(
3846

3947
fun aListOfSpaceRooms(): List<SpaceRoom> {
4048
return listOf(
41-
aSpaceRooms(),
42-
aSpaceRooms(),
43-
aSpaceRooms(),
49+
aSpaceRooms(spaceId = SpaceId("!spaceId0:example.com")),
50+
aSpaceRooms(spaceId = SpaceId("!spaceId1:example.com")),
51+
aSpaceRooms(spaceId = SpaceId("!spaceId2:example.com")),
4452
)
4553
}

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/HomeSpacesView.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@ import androidx.compose.foundation.lazy.LazyColumn
1111
import androidx.compose.runtime.Composable
1212
import androidx.compose.ui.Modifier
1313
import androidx.compose.ui.tooling.preview.PreviewParameter
14+
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
1415
import io.element.android.libraries.designsystem.preview.ElementPreview
1516
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
1617
import io.element.android.libraries.matrix.api.core.SpaceId
1718
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
19+
import io.element.android.libraries.matrix.ui.components.SpaceHeaderRootView
20+
import io.element.android.libraries.matrix.ui.components.SpaceHeaderView
21+
import io.element.android.libraries.matrix.ui.model.getAvatarData
22+
import kotlinx.collections.immutable.toImmutableList
1823

1924
@Composable
2025
fun HomeSpacesView(
@@ -23,6 +28,29 @@ fun HomeSpacesView(
2328
modifier: Modifier = Modifier,
2429
) {
2530
LazyColumn(modifier) {
31+
val space = state.space
32+
when (space) {
33+
CurrentSpace.Root -> {
34+
item {
35+
SpaceHeaderRootView(
36+
numberOfSpaces = state.spaceRooms.size,
37+
// TODO
38+
numberOfRooms = 0,
39+
)
40+
}
41+
}
42+
is CurrentSpace.Space -> item {
43+
SpaceHeaderView(
44+
avatarData = space.spaceRoom.getAvatarData(AvatarSize.SpaceHeader),
45+
name = space.spaceRoom.name,
46+
topic = space.spaceRoom.topic,
47+
joinRule = space.spaceRoom.joinRule,
48+
heroes = space.spaceRoom.heroes.toImmutableList(),
49+
numberOfMembers = space.spaceRoom.numJoinedMembers,
50+
numberOfRooms = space.spaceRoom.childrenCount,
51+
)
52+
}
53+
}
2654
state.spaceRooms.forEach {
2755
item(it.spaceId) {
2856
val isInvitation = it.state == CurrentUserMembership.INVITED

features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ private fun DefaultLoadedContent(
546546
},
547547
memberCount = {
548548
if (contentState.showMemberCount) {
549-
MembersCountMolecule(memberCount = contentState.numberOfMembers ?: 0)
549+
MembersCountMolecule(memberCount = contentState.numberOfMembers?.toInt() ?: 0)
550550
}
551551
}
552552
)

libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/molecules/MembersCountMolecule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
2626

2727
@Composable
2828
fun MembersCountMolecule(
29-
memberCount: Long,
29+
memberCount: Int,
3030
modifier: Modifier = Modifier,
3131
) {
3232
Row(
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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.Column
12+
import androidx.compose.foundation.layout.fillMaxWidth
13+
import androidx.compose.foundation.layout.padding
14+
import androidx.compose.material3.Text
15+
import androidx.compose.runtime.Composable
16+
import androidx.compose.ui.Alignment
17+
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.text.style.TextAlign
20+
import androidx.compose.ui.unit.dp
21+
import io.element.android.compound.theme.ElementTheme
22+
import io.element.android.compound.tokens.generated.CompoundIcons
23+
import io.element.android.libraries.designsystem.components.BigIcon
24+
import io.element.android.libraries.designsystem.preview.ElementPreview
25+
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
26+
import io.element.android.libraries.ui.strings.CommonStrings
27+
28+
/**
29+
* Ref: https://www.figma.com/design/G1xy0HDZKJf5TCRFmKb5d5/Compound-Android-Components?node-id=3643-2048
30+
*/
31+
@Composable
32+
fun SpaceHeaderRootView(
33+
numberOfSpaces: Int,
34+
numberOfRooms: Int,
35+
modifier: Modifier = Modifier,
36+
) {
37+
Column(
38+
modifier = modifier
39+
.fillMaxWidth()
40+
.padding(top = 32.dp, bottom = 24.dp, start = 16.dp, end = 16.dp),
41+
horizontalAlignment = Alignment.CenterHorizontally,
42+
verticalArrangement = Arrangement.spacedBy(16.dp)
43+
) {
44+
BigIcon(
45+
style = BigIcon.Style.Default(CompoundIcons.WorkspaceSolid())
46+
)
47+
Text(
48+
text = stringResource(CommonStrings.screen_space_list_title),
49+
style = ElementTheme.typography.fontHeadingLgBold,
50+
color = ElementTheme.colors.textPrimary,
51+
textAlign = TextAlign.Center,
52+
)
53+
SpaceInfoRow(
54+
leftText = numberOfSpaces(numberOfSpaces),
55+
rightText = numberOfRooms(numberOfRooms),
56+
)
57+
Text(
58+
text = stringResource(CommonStrings.screen_space_list_description),
59+
style = ElementTheme.typography.fontBodyMdRegular,
60+
color = ElementTheme.colors.textPrimary,
61+
textAlign = TextAlign.Center,
62+
)
63+
}
64+
}
65+
66+
@PreviewsDayNight
67+
@Composable
68+
internal fun SpaceHeaderRootViewPreview() = ElementPreview {
69+
SpaceHeaderRootView(
70+
numberOfSpaces = 3,
71+
numberOfRooms = 10,
72+
)
73+
}

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceHeaderView.kt

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ import kotlinx.collections.immutable.persistentListOf
3838
@Composable
3939
fun SpaceHeaderView(
4040
avatarData: AvatarData,
41-
name: String,
42-
topic: String,
43-
joinRule: JoinRule,
41+
name: String?,
42+
topic: String?,
43+
joinRule: JoinRule?,
4444
heroes: ImmutableList<MatrixUser>,
45-
numberOfMembers: Long,
45+
numberOfMembers: Int,
4646
numberOfRooms: Int,
4747
modifier: Modifier = Modifier,
4848
topicMaxLines: Int = Int.MAX_VALUE,
@@ -58,29 +58,34 @@ fun SpaceHeaderView(
5858
avatarData = avatarData,
5959
avatarType = AvatarType.Space(false),
6060
)
61-
Text(
62-
text = name,
63-
style = ElementTheme.typography.fontHeadingLgBold,
64-
color = ElementTheme.colors.textPrimary,
65-
textAlign = TextAlign.Center,
66-
)
67-
SpaceInfoRow(
68-
joinRule = joinRule,
69-
numberOfRooms = numberOfRooms,
70-
)
61+
name?.let {
62+
Text(
63+
text = name,
64+
style = ElementTheme.typography.fontHeadingLgBold,
65+
color = ElementTheme.colors.textPrimary,
66+
textAlign = TextAlign.Center,
67+
)
68+
}
69+
if (joinRule != null)
70+
SpaceInfoRow(
71+
joinRule = joinRule,
72+
numberOfRooms = numberOfRooms,
73+
)
7174
SpaceMembersView(
7275
heroes = heroes,
7376
numberOfMembers = numberOfMembers,
7477
modifier = Modifier.padding(horizontal = 32.dp),
7578
)
76-
Text(
77-
text = topic,
78-
style = ElementTheme.typography.fontBodyMdRegular,
79-
color = ElementTheme.colors.textPrimary,
80-
textAlign = TextAlign.Center,
81-
maxLines = topicMaxLines,
82-
overflow = TextOverflow.Ellipsis,
83-
)
79+
topic?.let {
80+
Text(
81+
text = topic,
82+
style = ElementTheme.typography.fontBodyMdRegular,
83+
color = ElementTheme.colors.textPrimary,
84+
textAlign = TextAlign.Center,
85+
maxLines = topicMaxLines,
86+
overflow = TextOverflow.Ellipsis,
87+
)
88+
}
8489
}
8590
}
8691

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceMembersView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import kotlinx.collections.immutable.toImmutableList
3535
@Composable
3636
fun SpaceMembersView(
3737
heroes: ImmutableList<MatrixUser>,
38-
numberOfMembers: Long,
38+
numberOfMembers: Int,
3939
modifier: Modifier = Modifier,
4040
) {
4141
if (heroes.isEmpty()) {
@@ -60,7 +60,7 @@ fun SpaceMembersView(
6060
@Composable
6161
private fun SpaceMembersWithAvatar(
6262
heroes: ImmutableList<AvatarData>,
63-
numberOfMembers: Long,
63+
numberOfMembers: Int,
6464
modifier: Modifier = Modifier,
6565
) {
6666
Row(

0 commit comments

Comments
 (0)