From ae4d63535770363f744c3a18513a2ce05336f51f Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 22 Jan 2026 20:35:49 +0100 Subject: [PATCH] Add SpaceRoomList extension functions for pagination --- .../matrix/api/spaces/SpaceRoomList.kt | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomList.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomList.kt index 5c4bc2323b..4723ff0f93 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomList.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoomList.kt @@ -9,9 +9,15 @@ package io.element.android.libraries.matrix.api.spaces import io.element.android.libraries.matrix.api.core.RoomId +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.withTimeoutOrNull import java.util.Optional +import kotlin.time.Duration interface SpaceRoomList { sealed interface PaginationStatus { @@ -30,3 +36,27 @@ interface SpaceRoomList { fun destroy() } + +fun SpaceRoomList.loadAllIncrementally(coroutineScope: CoroutineScope) { + paginationStatusFlow + .onEach { paginationStatus -> + when (paginationStatus) { + is SpaceRoomList.PaginationStatus.Idle -> { + if (paginationStatus.hasMoreToLoad) { + paginate() + } + } + SpaceRoomList.PaginationStatus.Loading -> Unit + } + } + .launchIn(coroutineScope) +} + +suspend fun SpaceRoomList.resetAndWaitForFullReload(timeout: Duration) { + reset() + withTimeoutOrNull(timeout) { + paginationStatusFlow.first { status -> + status is SpaceRoomList.PaginationStatus.Idle && !status.hasMoreToLoad + } + } +}