feature(spaces) : introduce SpaceRoomList matrix api
This commit is contained in:
parent
7e0931c299
commit
aadd8b45e2
15 changed files with 277 additions and 115 deletions
|
|
@ -13,7 +13,6 @@ import androidx.compose.runtime.getValue
|
|||
import androidx.compose.runtime.remember
|
||||
import dev.zacsweers.metro.Inject
|
||||
import io.element.android.features.invite.api.SeenInvitesStore
|
||||
import io.element.android.features.invite.api.seenSpaceIds
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.core.coroutine.mapState
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
|
|
@ -34,9 +33,9 @@ class HomeSpacesPresenter(
|
|||
.mediaPreviewConfigFlow
|
||||
.mapState { config -> config.hideInviteAvatar }
|
||||
}.collectAsState()
|
||||
val spaceRooms by client.spaceService.spaceRooms.collectAsState(emptyList())
|
||||
val spaceRooms by client.spaceService.spaceRoomsFlow.collectAsState(emptyList())
|
||||
val seenSpaceInvites by remember {
|
||||
seenInvitesStore.seenSpaceIds().map { it.toPersistentSet() }
|
||||
seenInvitesStore.seenRoomIds().map { it.toPersistentSet() }
|
||||
}.collectAsState(persistentSetOf())
|
||||
|
||||
fun handleEvents(event: HomeSpacesEvents) {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
package io.element.android.features.home.impl.spaces
|
||||
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.SpaceId
|
||||
import io.element.android.libraries.matrix.api.spaces.SpaceRoom
|
||||
import kotlinx.collections.immutable.ImmutableSet
|
||||
|
|
@ -14,7 +15,7 @@ import kotlinx.collections.immutable.ImmutableSet
|
|||
data class HomeSpacesState(
|
||||
val space: CurrentSpace,
|
||||
val spaceRooms: List<SpaceRoom>,
|
||||
val seenSpaceInvites: ImmutableSet<SpaceId>,
|
||||
val seenSpaceInvites: ImmutableSet<RoomId>,
|
||||
val hideInvitesAvatar: Boolean,
|
||||
val eventSink: (HomeSpacesEvents) -> Unit,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
package io.element.android.features.home.impl.spaces
|
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.libraries.matrix.api.core.SpaceId
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.spaces.SpaceRoom
|
||||
import kotlinx.collections.immutable.toImmutableSet
|
||||
|
||||
|
|
@ -18,12 +18,12 @@ open class HomeSpacesStateProvider : PreviewParameterProvider<HomeSpacesState> {
|
|||
aHomeSpacesState(
|
||||
spaceRooms = SpaceRoomProvider().values.toList(),
|
||||
seenSpaceInvites = setOf(
|
||||
SpaceId("!spaceId3:example.com"),
|
||||
RoomId("!spaceId3:example.com"),
|
||||
),
|
||||
),
|
||||
aHomeSpacesState(
|
||||
space = CurrentSpace.Space(
|
||||
spaceRoom = aSpaceRooms(spaceId = SpaceId("!mySpace:example.com"))
|
||||
spaceRoom = aSpaceRoom(roomId = RoomId("!mySpace:example.com"))
|
||||
),
|
||||
spaceRooms = aListOfSpaceRooms(),
|
||||
),
|
||||
|
|
@ -33,7 +33,7 @@ open class HomeSpacesStateProvider : PreviewParameterProvider<HomeSpacesState> {
|
|||
internal fun aHomeSpacesState(
|
||||
space: CurrentSpace = CurrentSpace.Root,
|
||||
spaceRooms: List<SpaceRoom> = aListOfSpaceRooms(),
|
||||
seenSpaceInvites: Set<SpaceId> = emptySet(),
|
||||
seenSpaceInvites: Set<RoomId> = emptySet(),
|
||||
hideInvitesAvatar: Boolean = false,
|
||||
eventSink: (HomeSpacesEvents) -> Unit = {},
|
||||
) = HomeSpacesState(
|
||||
|
|
@ -46,8 +46,8 @@ internal fun aHomeSpacesState(
|
|||
|
||||
fun aListOfSpaceRooms(): List<SpaceRoom> {
|
||||
return listOf(
|
||||
aSpaceRooms(spaceId = SpaceId("!spaceId0:example.com")),
|
||||
aSpaceRooms(spaceId = SpaceId("!spaceId1:example.com")),
|
||||
aSpaceRooms(spaceId = SpaceId("!spaceId2:example.com")),
|
||||
aSpaceRoom(roomId = RoomId("!spaceId0:example.com")),
|
||||
aSpaceRoom(roomId = RoomId("!spaceId1:example.com")),
|
||||
aSpaceRoom(roomId = RoomId("!spaceId2:example.com")),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ 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.RoomId
|
||||
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
|
||||
|
|
@ -24,7 +25,7 @@ import kotlinx.collections.immutable.toImmutableList
|
|||
@Composable
|
||||
fun HomeSpacesView(
|
||||
state: HomeSpacesState,
|
||||
onSpaceClick: (SpaceId) -> Unit,
|
||||
onSpaceClick: (RoomId) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
LazyColumn(modifier) {
|
||||
|
|
@ -52,14 +53,14 @@ fun HomeSpacesView(
|
|||
}
|
||||
}
|
||||
state.spaceRooms.forEach {
|
||||
item(it.spaceId) {
|
||||
item(it.roomId) {
|
||||
val isInvitation = it.state == CurrentUserMembership.INVITED
|
||||
HomeSpaceItemView(
|
||||
spaceRoom = it,
|
||||
showUnreadIndicator = isInvitation && it.spaceId !in state.seenSpaceInvites,
|
||||
showUnreadIndicator = isInvitation && it.roomId !in state.seenSpaceInvites,
|
||||
hideAvatars = isInvitation && state.hideInvitesAvatar,
|
||||
onClick = {
|
||||
onSpaceClick(it.spaceId)
|
||||
onSpaceClick(it.roomId)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ package io.element.android.features.home.impl.spaces
|
|||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||
import io.element.android.libraries.matrix.api.core.SpaceId
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
||||
import io.element.android.libraries.matrix.api.room.RoomType
|
||||
import io.element.android.libraries.matrix.api.room.join.JoinRule
|
||||
|
|
@ -18,42 +18,42 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
|
|||
|
||||
class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
|
||||
override val values: Sequence<SpaceRoom> = sequenceOf(
|
||||
aSpaceRooms(),
|
||||
aSpaceRooms(
|
||||
aSpaceRoom(),
|
||||
aSpaceRoom(
|
||||
numJoinedMembers = 5,
|
||||
childrenCount = 10,
|
||||
worldReadable = true,
|
||||
spaceId = SpaceId("!spaceId0:example.com"),
|
||||
roomId = RoomId("!spaceId0:example.com"),
|
||||
),
|
||||
aSpaceRooms(
|
||||
aSpaceRoom(
|
||||
numJoinedMembers = 5,
|
||||
childrenCount = 10,
|
||||
worldReadable = true,
|
||||
avatarUrl = "anUrl",
|
||||
spaceId = SpaceId("!spaceId1:example.com"),
|
||||
roomId = RoomId("!spaceId1:example.com"),
|
||||
),
|
||||
aSpaceRooms(
|
||||
aSpaceRoom(
|
||||
name = null,
|
||||
numJoinedMembers = 5,
|
||||
childrenCount = 10,
|
||||
worldReadable = true,
|
||||
avatarUrl = "anUrl",
|
||||
spaceId = SpaceId("!spaceId2:example.com"),
|
||||
roomId = RoomId("!spaceId2:example.com"),
|
||||
state = CurrentUserMembership.INVITED,
|
||||
),
|
||||
aSpaceRooms(
|
||||
aSpaceRoom(
|
||||
name = null,
|
||||
numJoinedMembers = 5,
|
||||
childrenCount = 10,
|
||||
worldReadable = true,
|
||||
avatarUrl = "anUrl",
|
||||
spaceId = SpaceId("!spaceId3:example.com"),
|
||||
roomId = RoomId("!spaceId3:example.com"),
|
||||
state = CurrentUserMembership.INVITED,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fun aSpaceRooms(
|
||||
fun aSpaceRoom(
|
||||
name: String? = "Space name",
|
||||
avatarUrl: String? = null,
|
||||
canonicalAlias: RoomAlias? = null,
|
||||
|
|
@ -62,7 +62,7 @@ fun aSpaceRooms(
|
|||
heroes: List<MatrixUser> = emptyList(),
|
||||
joinRule: JoinRule? = null,
|
||||
numJoinedMembers: Int = 0,
|
||||
spaceId: SpaceId = SpaceId("!spaceId:example.com"),
|
||||
roomId: RoomId = RoomId("!roomId:example.com"),
|
||||
roomType: RoomType = RoomType.Space,
|
||||
state: CurrentUserMembership? = null,
|
||||
topic: String? = null,
|
||||
|
|
@ -76,7 +76,7 @@ fun aSpaceRooms(
|
|||
heroes = heroes,
|
||||
joinRule = joinRule,
|
||||
numJoinedMembers = numJoinedMembers,
|
||||
spaceId = spaceId,
|
||||
roomId = roomId,
|
||||
roomType = roomType,
|
||||
state = state,
|
||||
topic = topic,
|
||||
|
|
|
|||
|
|
@ -38,9 +38,3 @@ interface SeenInvitesStore {
|
|||
*/
|
||||
suspend fun clear()
|
||||
}
|
||||
|
||||
fun SeenInvitesStore.seenSpaceIds(): Flow<Set<SpaceId>> {
|
||||
return seenRoomIds().map { roomIds ->
|
||||
roomIds.map { it.toSpaceId() }.toSet()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue