@@ -9,65 +9,79 @@ package io.element.android.features.space.impl.leave
99
1010import androidx.compose.runtime.Composable
1111import androidx.compose.runtime.MutableState
12- import androidx.compose.runtime.collectAsState
1312import androidx.compose.runtime.getValue
1413import androidx.compose.runtime.mutableStateOf
1514import androidx.compose.runtime.produceState
1615import androidx.compose.runtime.remember
1716import androidx.compose.runtime.rememberCoroutineScope
18- import dev.zacsweers.metro.Inject
17+ import androidx.compose.runtime.setValue
18+ import dev.zacsweers.metro.Assisted
19+ import dev.zacsweers.metro.AssistedFactory
20+ import dev.zacsweers.metro.AssistedInject
1921import io.element.android.libraries.architecture.AsyncAction
2022import io.element.android.libraries.architecture.AsyncData
2123import io.element.android.libraries.architecture.Presenter
24+ import io.element.android.libraries.architecture.map
2225import io.element.android.libraries.architecture.runUpdatingState
2326import io.element.android.libraries.matrix.api.core.RoomId
24- import io.element.android.libraries.matrix.api.spaces.SpaceRoom
25- import io.element.android.libraries.matrix.api.spaces.SpaceRoomList
26- import kotlinx.collections.immutable.ImmutableList
27+ import io.element.android.libraries.matrix.api.spaces.LeaveSpaceHandle
28+ import io.element.android.libraries.matrix.api.spaces.LeaveSpaceRoom
2729import kotlinx.collections.immutable.ImmutableSet
2830import kotlinx.collections.immutable.persistentSetOf
29- import kotlinx.collections.immutable.toPersistentList
31+ import kotlinx.collections.immutable.toImmutableList
3032import kotlinx.collections.immutable.toPersistentSet
3133import kotlinx.coroutines.CoroutineScope
3234import kotlinx.coroutines.launch
33- import kotlin.jvm.optionals.getOrNull
3435
35- @Inject
36+ @AssistedInject
3637class LeaveSpacePresenter (
37- private val spaceRoomList : SpaceRoomList ,
38+ @Assisted private val leaveSpaceHandle : LeaveSpaceHandle ,
3839) : Presenter<LeaveSpaceState> {
40+ @AssistedFactory
41+ fun interface Factory {
42+ fun create (leaveSpaceHandle : LeaveSpaceHandle ): LeaveSpacePresenter
43+ }
44+
3945 @Composable
4046 override fun present (): LeaveSpaceState {
4147 val coroutineScope = rememberCoroutineScope()
42- val currentSpace by spaceRoomList.currentSpaceFlow.collectAsState()
48+ var currentSpace: LeaveSpaceRoom ? by remember { mutableStateOf( null ) }
4349 val leaveSpaceAction = remember {
4450 mutableStateOf<AsyncAction <Unit >>(AsyncAction .Uninitialized )
4551 }
4652 val selectedRoomIds = remember {
4753 mutableStateOf<ImmutableSet <RoomId >>(persistentSetOf())
4854 }
49- val joinedSpaceRooms by produceState(emptyList()) {
50- // TODO Get the joined room from the SDK, should also have the isLastAdmin boolean
51- val rooms = emptyList<SpaceRoom >()
52- // By default select all rooms
53- selectedRoomIds.value = rooms.map { it.roomId }.toPersistentSet()
54- value = rooms
55+ val leaveSpaceRooms by produceState(AsyncData .Loading ()) {
56+ val rooms = leaveSpaceHandle.rooms()
57+ val (currentRoom, otherRooms) = rooms.getOrNull()
58+ .orEmpty()
59+ .partition { it.spaceRoom.roomId == leaveSpaceHandle.id }
60+ currentSpace = currentRoom.firstOrNull()
61+ // By default select all rooms that can be left
62+ selectedRoomIds.value = otherRooms
63+ .filter { it.isLastAdmin.not () }
64+ .map { it.spaceRoom.roomId }
65+ .toPersistentSet()
66+ value = rooms.fold(
67+ onSuccess = { AsyncData .Success (otherRooms) },
68+ onFailure = { AsyncData .Failure (it) }
69+ )
5570 }
56- val selectableSpaceRooms by produceState< AsyncData < ImmutableList < SelectableSpaceRoom >>> (
57- initialValue = AsyncData .Uninitialized ,
58- key1 = joinedSpaceRooms ,
71+ val selectableSpaceRooms by produceState(
72+ initialValue = AsyncData .Loading () ,
73+ key1 = leaveSpaceRooms ,
5974 key2 = selectedRoomIds.value,
6075 ) {
61- value = AsyncData . Success (
62- joinedSpaceRooms. map {
76+ value = leaveSpaceRooms.map { list ->
77+ list.orEmpty(). map { room ->
6378 SelectableSpaceRoom (
64- spaceRoom = it,
65- // TODO Get this value from the SDK
66- isLastAdmin = false ,
67- isSelected = selectedRoomIds.value.contains(it.roomId),
79+ spaceRoom = room.spaceRoom,
80+ isLastAdmin = room.isLastAdmin,
81+ isSelected = selectedRoomIds.value.contains(room.spaceRoom.roomId),
6882 )
69- }.toPersistentList ()
70- )
83+ }.toImmutableList ()
84+ }
7185 }
7286
7387 fun handleEvents (event : LeaveSpaceEvents ) {
@@ -102,7 +116,8 @@ class LeaveSpacePresenter(
102116 }
103117
104118 return LeaveSpaceState (
105- spaceName = currentSpace.getOrNull()?.name,
119+ spaceName = currentSpace?.spaceRoom?.name,
120+ isLastAdmin = currentSpace?.isLastAdmin == true ,
106121 selectableSpaceRooms = selectableSpaceRooms,
107122 leaveSpaceAction = leaveSpaceAction.value,
108123 eventSink = ::handleEvents,
@@ -111,11 +126,10 @@ class LeaveSpacePresenter(
111126
112127 private fun CoroutineScope.leaveSpace (
113128 leaveSpaceAction : MutableState <AsyncAction <Unit >>,
114- @Suppress( " unused " ) selectedRoomIds : Set <RoomId >,
129+ selectedRoomIds : Set <RoomId >,
115130 ) = launch {
116131 runUpdatingState(leaveSpaceAction) {
117- // TODO SDK API call to leave all the rooms and space
118- Result .failure(Exception (" Not implemented" ))
132+ leaveSpaceHandle.leave(selectedRoomIds.toList())
119133 }
120134 }
121135}
0 commit comments