Iterate on manage space rooms, but not happy with the reset method.

This commit is contained in:
ganfra 2026-01-26 21:39:00 +01:00
parent ae4d635357
commit e896c7604d
15 changed files with 170 additions and 117 deletions

View file

@ -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
}
}
}

View file

@ -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()

View file

@ -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,

View file

@ -94,7 +94,7 @@ class RustSpaceRoomListTest {
spaceRoomMapper: SpaceRoomMapper = SpaceRoomMapper(),
): RustSpaceRoomList {
return RustSpaceRoomList(
roomId = roomId,
spaceId = roomId,
innerProvider = innerProvider,
coroutineScope = backgroundScope,
spaceRoomMapper = spaceRoomMapper,

View file

@ -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>) {