Add space header.

This commit is contained in:
Benoit Marty 2025-09-01 21:33:55 +02:00 committed by Benoit Marty
parent cbcf86b1c9
commit fdea38ddb0
9 changed files with 152 additions and 31 deletions

View file

@ -43,6 +43,7 @@ class HomeSpacesPresenter @Inject constructor(
}
return HomeSpacesState(
space = CurrentSpace.Root,
spaceRooms = spaceRooms,
seenSpaceInvites = seenSpaceInvites,
hideInvitesAvatar = hideInvitesAvatar,

View file

@ -12,8 +12,14 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import kotlinx.collections.immutable.ImmutableSet
data class HomeSpacesState(
val space: CurrentSpace,
val spaceRooms: List<SpaceRoom>,
val seenSpaceInvites: ImmutableSet<SpaceId>,
val hideInvitesAvatar: Boolean,
val eventSink: (HomeSpacesEvents) -> Unit,
)
sealed interface CurrentSpace {
object Root : CurrentSpace
data class Space(val spaceRoom: SpaceRoom) : CurrentSpace
}

View file

@ -19,17 +19,25 @@ open class HomeSpacesStateProvider : PreviewParameterProvider<HomeSpacesState> {
spaceRooms = SpaceRoomProvider().values.toList(),
seenSpaceInvites = setOf(
SpaceId("!spaceId3:example.com"),
).toImmutableSet(),
)
),
),
aHomeSpacesState(
space = CurrentSpace.Space(
spaceRoom = aSpaceRooms(spaceId = SpaceId("!mySpace:example.com"))
),
spaceRooms = aListOfSpaceRooms(),
),
)
}
internal fun aHomeSpacesState(
space: CurrentSpace = CurrentSpace.Root,
spaceRooms: List<SpaceRoom> = aListOfSpaceRooms(),
seenSpaceInvites: Set<SpaceId> = emptySet(),
hideInvitesAvatar: Boolean = false,
eventSink: (HomeSpacesEvents) -> Unit = {},
) = HomeSpacesState(
space = space,
spaceRooms = spaceRooms,
seenSpaceInvites = seenSpaceInvites.toImmutableSet(),
hideInvitesAvatar = hideInvitesAvatar,
@ -38,8 +46,8 @@ internal fun aHomeSpacesState(
fun aListOfSpaceRooms(): List<SpaceRoom> {
return listOf(
aSpaceRooms(),
aSpaceRooms(),
aSpaceRooms(),
aSpaceRooms(spaceId = SpaceId("!spaceId0:example.com")),
aSpaceRooms(spaceId = SpaceId("!spaceId1:example.com")),
aSpaceRooms(spaceId = SpaceId("!spaceId2:example.com")),
)
}

View file

@ -11,10 +11,15 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.core.SpaceId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.ui.components.SpaceHeaderRootView
import io.element.android.libraries.matrix.ui.components.SpaceHeaderView
import io.element.android.libraries.matrix.ui.model.getAvatarData
import kotlinx.collections.immutable.toImmutableList
@Composable
fun HomeSpacesView(
@ -23,6 +28,29 @@ fun HomeSpacesView(
modifier: Modifier = Modifier,
) {
LazyColumn(modifier) {
val space = state.space
when (space) {
CurrentSpace.Root -> {
item {
SpaceHeaderRootView(
numberOfSpaces = state.spaceRooms.size,
// TODO
numberOfRooms = 0,
)
}
}
is CurrentSpace.Space -> item {
SpaceHeaderView(
avatarData = space.spaceRoom.getAvatarData(AvatarSize.SpaceHeader),
name = space.spaceRoom.name,
topic = space.spaceRoom.topic,
joinRule = space.spaceRoom.joinRule,
heroes = space.spaceRoom.heroes.toImmutableList(),
numberOfMembers = space.spaceRoom.numJoinedMembers,
numberOfRooms = space.spaceRoom.childrenCount,
)
}
}
state.spaceRooms.forEach {
item(it.spaceId) {
val isInvitation = it.state == CurrentUserMembership.INVITED