feature (space) : iterate on space list (and space screen)

This commit is contained in:
ganfra 2025-09-08 21:57:25 +02:00 committed by Benoit Marty
parent 2fe56f834f
commit 6b9afd9e6f
11 changed files with 79 additions and 44 deletions

View file

@ -269,7 +269,7 @@ private fun HomeScaffold(
.hazeSource(state = hazeState),
state = state.homeSpacesState,
onSpaceClick = { spaceId ->
// TODO
onRoomClick(spaceId)
}
)
}

View file

@ -52,15 +52,15 @@ fun HomeSpacesView(
)
}
}
state.spaceRooms.forEach {
item(it.roomId) {
val isInvitation = it.state == CurrentUserMembership.INVITED
state.spaceRooms.forEach { spaceRoom ->
item(spaceRoom.roomId) {
val isInvitation = spaceRoom.state == CurrentUserMembership.INVITED
SpaceRoomItemView(
spaceRoom = it,
showUnreadIndicator = isInvitation && it.roomId !in state.seenSpaceInvites,
spaceRoom = spaceRoom,
showUnreadIndicator = isInvitation && spaceRoom.roomId !in state.seenSpaceInvites,
hideAvatars = isInvitation && state.hideInvitesAvatar,
onClick = {
onSpaceClick(it.roomId)
onSpaceClick(spaceRoom.roomId)
},
onLongClick = {

View file

@ -30,6 +30,13 @@ interface SpaceEntryPoint : FeatureEntryPoint {
sealed interface Params : Plugin {
data class Id(val roomId: RoomId) : Params
data class Full(val spaceRoom: SpaceRoom) : Params
fun roomId(): RoomId {
return when (this) {
is Id -> roomId
is Full -> spaceRoom.roomId
}
}
}
interface Callback : Plugin {

View file

@ -22,10 +22,11 @@ import io.element.android.libraries.di.SessionScope
class SpaceNode @AssistedInject constructor(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
private val presenter: SpacePresenter,
private val presenterFactory: SpacePresenter.Factory,
) : Node(buildContext, plugins = plugins) {
val params = plugins.filterIsInstance<SpaceEntryPoint.Params>().single()
private val presenter = presenterFactory.create(params)
@Composable
override fun View(modifier: Modifier) {

View file

@ -11,22 +11,33 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.Inject
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.space.api.SpaceEntryPoint
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.coroutine.mapState
import io.element.android.libraries.matrix.api.MatrixClient
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toPersistentSet
import kotlinx.coroutines.flow.map
import javax.inject.Inject
class SpacePresenter @Inject constructor(
@Inject
class SpacePresenter(
@Assisted private val params: SpaceEntryPoint.Params,
private val client: MatrixClient,
private val seenInvitesStore: SeenInvitesStore,
) : Presenter<SpaceState> {
@AssistedFactory
interface Factory {
fun create(params: SpaceEntryPoint.Params): SpacePresenter
}
private val spaceRoomList = client.spaceService.spaceRoomList(params.roomId())
@Composable
override fun present(): SpaceState {
val hideInvitesAvatar by remember {
@ -35,18 +46,19 @@ class SpacePresenter @Inject constructor(
.mediaPreviewConfigFlow
.mapState { config -> config.hideInviteAvatar }
}.collectAsState()
val spaceRooms by client.spaceService.spaceRoomsFlow.collectAsState(emptyList())
val seenSpaceInvites by remember {
seenInvitesStore.seenRoomIds().map { it.toPersistentSet() }
}.collectAsState(persistentSetOf())
val children by spaceRoomList.spaceRoomsFlow.collectAsState(emptyList())
fun handleEvents(event: SpaceEvents) {
//when (event) { }
}
return SpaceState(
parentSpace = null,
children = spaceRooms.toPersistentList(),
children = children.toPersistentList(),
seenSpaceInvites = seenSpaceInvites,
hideInvitesAvatar = hideInvitesAvatar,
eventSink = ::handleEvents,

View file

@ -132,7 +132,6 @@ private fun SpaceViewTopBar(
},
actions = {
},
windowInsets = WindowInsets(0.dp)
)
}