Iterate on manage space rooms, but not happy with the reset method.
This commit is contained in:
parent
ae4d635357
commit
e896c7604d
15 changed files with 170 additions and 117 deletions
|
|
@ -25,38 +25,31 @@ interface SpaceRoomList {
|
|||
data class Idle(val hasMoreToLoad: Boolean) : PaginationStatus
|
||||
}
|
||||
|
||||
val roomId: RoomId
|
||||
val spaceId: RoomId
|
||||
|
||||
val currentSpaceFlow: StateFlow<Optional<SpaceRoom>>
|
||||
|
||||
val spaceRoomsFlow: Flow<List<SpaceRoom>>
|
||||
val paginationStatusFlow: StateFlow<PaginationStatus>
|
||||
|
||||
suspend fun paginate(): Result<Unit>
|
||||
suspend fun reset(): Result<Unit>
|
||||
|
||||
fun destroy()
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all space rooms incrementally by automatically paginating whenever more data is available.
|
||||
* This function observes the pagination status and triggers [paginate] calls until the entire list is loaded.
|
||||
*
|
||||
* @param coroutineScope The scope in which the pagination flow will be collected.
|
||||
*/
|
||||
fun SpaceRoomList.loadAllIncrementally(coroutineScope: CoroutineScope) {
|
||||
paginationStatusFlow
|
||||
.onEach { paginationStatus ->
|
||||
when (paginationStatus) {
|
||||
is SpaceRoomList.PaginationStatus.Idle -> {
|
||||
if (paginationStatus.hasMoreToLoad) {
|
||||
paginate()
|
||||
}
|
||||
}
|
||||
SpaceRoomList.PaginationStatus.Loading -> Unit
|
||||
if (paginationStatus is SpaceRoomList.PaginationStatus.Idle && paginationStatus.hasMoreToLoad) {
|
||||
paginate()
|
||||
}
|
||||
}
|
||||
.launchIn(coroutineScope)
|
||||
}
|
||||
|
||||
suspend fun SpaceRoomList.resetAndWaitForFullReload(timeout: Duration) {
|
||||
reset()
|
||||
withTimeoutOrNull(timeout) {
|
||||
paginationStatusFlow.first { status ->
|
||||
status is SpaceRoomList.PaginationStatus.Idle && !status.hasMoreToLoad
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ import kotlinx.coroutines.CompletableDeferred
|
|||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.cancel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
|
|
@ -29,7 +30,7 @@ import java.util.Optional
|
|||
import org.matrix.rustcomponents.sdk.SpaceRoomList as InnerSpaceRoomList
|
||||
|
||||
class RustSpaceRoomList(
|
||||
override val roomId: RoomId,
|
||||
override val spaceId: RoomId,
|
||||
private val innerProvider: suspend () -> InnerSpaceRoomList,
|
||||
private val coroutineScope: CoroutineScope,
|
||||
spaceRoomMapper: SpaceRoomMapper,
|
||||
|
|
@ -89,7 +90,7 @@ class RustSpaceRoomList(
|
|||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
override fun destroy() {
|
||||
Timber.d("Destroying SpaceRoomList $roomId")
|
||||
Timber.d("Destroying SpaceRoomList $spaceId")
|
||||
coroutineScope.cancel()
|
||||
try {
|
||||
innerCompletable.getCompleted().destroy()
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ class RustSpaceService(
|
|||
override fun spaceRoomList(id: RoomId): SpaceRoomList {
|
||||
val childCoroutineScope = sessionCoroutineScope.childScope(sessionDispatcher, "SpaceRoomListScope-$this")
|
||||
return RustSpaceRoomList(
|
||||
roomId = id,
|
||||
spaceId = id,
|
||||
innerProvider = { innerSpaceService.spaceRoomList(id.value) },
|
||||
coroutineScope = childCoroutineScope,
|
||||
spaceRoomMapper = spaceRoomMapper,
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ class RustSpaceRoomListTest {
|
|||
spaceRoomMapper: SpaceRoomMapper = SpaceRoomMapper(),
|
||||
): RustSpaceRoomList {
|
||||
return RustSpaceRoomList(
|
||||
roomId = roomId,
|
||||
spaceId = roomId,
|
||||
innerProvider = innerProvider,
|
||||
coroutineScope = backgroundScope,
|
||||
spaceRoomMapper = spaceRoomMapper,
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.asStateFlow
|
|||
import java.util.Optional
|
||||
|
||||
class FakeSpaceRoomList(
|
||||
override val roomId: RoomId = A_ROOM_ID,
|
||||
override val spaceId: RoomId = A_ROOM_ID,
|
||||
initialSpaceFlowValue: SpaceRoom? = null,
|
||||
initialSpaceRoomsValue: List<SpaceRoom> = emptyList(),
|
||||
initialSpaceRoomList: SpaceRoomList.PaginationStatus = SpaceRoomList.PaginationStatus.Loading,
|
||||
|
|
@ -35,7 +35,8 @@ class FakeSpaceRoomList(
|
|||
currentSpaceMutableStateFlow.value = Optional.ofNullable(value)
|
||||
}
|
||||
|
||||
private val _spaceRoomsFlow: MutableStateFlow<List<SpaceRoom>> = MutableStateFlow(initialSpaceRoomsValue)
|
||||
private val _spaceRoomsFlow = MutableStateFlow<List<SpaceRoom>>(initialSpaceRoomsValue)
|
||||
|
||||
override val spaceRoomsFlow: Flow<List<SpaceRoom>> = _spaceRoomsFlow.asStateFlow()
|
||||
|
||||
fun emitSpaceRooms(value: List<SpaceRoom>) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue