@@ -30,43 +30,30 @@ import io.element.android.features.leaveroom.api.LeaveRoomEvent
3030import io.element.android.features.leaveroom.api.LeaveRoomPresenter
3131import io.element.android.features.networkmonitor.api.NetworkMonitor
3232import io.element.android.features.networkmonitor.api.NetworkStatus
33- import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
34- import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders
33+ import io.element.android.features.roomlist.impl.datasource.InviteStateDataSource
34+ import io.element.android.features.roomlist.impl.datasource.RoomListDataSource
3535import io.element.android.libraries.architecture.Presenter
36- import io.element.android.libraries.core.coroutine.parallelMap
37- import io.element.android.libraries.core.extensions.orEmpty
38- import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
39- import io.element.android.libraries.designsystem.components.avatar.AvatarData
40- import io.element.android.libraries.designsystem.components.avatar.AvatarSize
4136import io.element.android.libraries.designsystem.utils.SnackbarDispatcher
4237import io.element.android.libraries.designsystem.utils.collectSnackbarMessageAsState
43- import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
4438import io.element.android.libraries.matrix.api.MatrixClient
45- import io.element.android.libraries.matrix.api.core.RoomId
46- import io.element.android.libraries.matrix.api.room.RoomSummary
4739import io.element.android.libraries.matrix.api.user.MatrixUser
4840import io.element.android.libraries.matrix.api.user.getCurrentUser
4941import io.element.android.libraries.matrix.api.verification.SessionVerificationService
5042import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus
51- import kotlinx.collections.immutable.ImmutableList
52- import kotlinx.collections.immutable.persistentListOf
53- import kotlinx.collections.immutable.toImmutableList
5443import kotlinx.coroutines.CoroutineScope
5544import kotlinx.coroutines.launch
56- import timber.log.Timber
5745import javax.inject.Inject
5846
5947private const val extendedRangeSize = 40
6048
6149class RoomListPresenter @Inject constructor(
6250 private val client : MatrixClient ,
63- private val lastMessageTimestampFormatter : LastMessageTimestampFormatter ,
64- private val roomLastMessageFormatter : RoomLastMessageFormatter ,
6551 private val sessionVerificationService : SessionVerificationService ,
6652 private val networkMonitor : NetworkMonitor ,
6753 private val snackbarDispatcher : SnackbarDispatcher ,
6854 private val inviteStateDataSource : InviteStateDataSource ,
6955 private val leaveRoomPresenter : LeaveRoomPresenter ,
56+ private val roomListDataSource : RoomListDataSource ,
7057) : Presenter<RoomListState> {
7158
7259 @Composable
@@ -75,21 +62,13 @@ class RoomListPresenter @Inject constructor(
7562 val matrixUser: MutableState <MatrixUser ?> = rememberSaveable {
7663 mutableStateOf(null )
7764 }
78- var filter by rememberSaveable { mutableStateOf(" " ) }
79- val roomSummaries by client
80- .roomSummaryDataSource
81- .allRooms()
82- .collectAsState()
83-
65+ val roomList by roomListDataSource.allRooms.collectAsState()
66+ val filteredRoomList by roomListDataSource.filteredRooms.collectAsState()
67+ val filter by roomListDataSource.filter.collectAsState()
8468 val networkConnectionStatus by networkMonitor.connectivity.collectAsState()
8569
86- Timber .v(" RoomSummaries size = ${roomSummaries.size} " )
87-
88- val mappedRoomSummaries: MutableState <ImmutableList <RoomListRoomSummary >> = remember { mutableStateOf(persistentListOf()) }
89- val filteredRoomSummaries: MutableState <ImmutableList <RoomListRoomSummary >> = remember {
90- mutableStateOf(persistentListOf())
91- }
9270 LaunchedEffect (Unit ) {
71+ roomListDataSource.launchIn(this )
9372 initialLoad(matrixUser)
9473 }
9574
@@ -107,12 +86,12 @@ class RoomListPresenter @Inject constructor(
10786
10887 fun handleEvents (event : RoomListEvents ) {
10988 when (event) {
110- is RoomListEvents .UpdateFilter -> filter = event.newFilter
89+ is RoomListEvents .UpdateFilter -> roomListDataSource.updateFilter( event.newFilter)
11190 is RoomListEvents .UpdateVisibleRange -> updateVisibleRange(event.range)
11291 RoomListEvents .DismissRequestVerificationPrompt -> verificationPromptDismissed = true
11392 RoomListEvents .ToggleSearchResults -> {
11493 if (displaySearchResults) {
115- filter = " "
94+ roomListDataSource.updateFilter( " " )
11695 }
11796 displaySearchResults = ! displaySearchResults
11897 }
@@ -127,22 +106,13 @@ class RoomListPresenter @Inject constructor(
127106 }
128107 }
129108
130- LaunchedEffect (roomSummaries, filter) {
131- mappedRoomSummaries.value = if (roomSummaries.isEmpty()) {
132- RoomListRoomSummaryPlaceholders .createFakeList(16 ).toImmutableList()
133- } else {
134- mapRoomSummaries(roomSummaries).toImmutableList()
135- }
136- filteredRoomSummaries.value = updateFilteredRoomSummaries(mappedRoomSummaries.value, filter)
137- }
138-
139109 val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
140110
141111 return RoomListState (
142112 matrixUser = matrixUser.value,
143- roomList = mappedRoomSummaries.value ,
113+ roomList = roomList ,
144114 filter = filter,
145- filteredRoomList = filteredRoomSummaries.value ,
115+ filteredRoomList = filteredRoomList ,
146116 displayVerificationPrompt = displayVerificationPrompt,
147117 snackbarMessage = snackbarMessage,
148118 hasNetworkConnection = networkConnectionStatus == NetworkStatus .Online ,
@@ -154,13 +124,6 @@ class RoomListPresenter @Inject constructor(
154124 )
155125 }
156126
157- private fun updateFilteredRoomSummaries (mappedRoomSummaries : ImmutableList <RoomListRoomSummary >, filter : String ): ImmutableList <RoomListRoomSummary > {
158- return when {
159- filter.isEmpty() -> emptyList()
160- else -> mappedRoomSummaries.filter { it.name.contains(filter, ignoreCase = true ) }
161- }.toImmutableList()
162- }
163-
164127 private fun CoroutineScope.initialLoad (matrixUser : MutableState <MatrixUser ?>) = launch {
165128 matrixUser.value = client.getCurrentUser()
166129 }
@@ -174,34 +137,4 @@ class RoomListPresenter @Inject constructor(
174137 val extendedRange = IntRange (extendedRangeStart, extendedRangeEnd)
175138 client.roomSummaryDataSource.updateAllRoomsVisibleRange(extendedRange)
176139 }
177-
178- private suspend fun mapRoomSummaries (
179- roomSummaries : List <RoomSummary >
180- ): List <RoomListRoomSummary > {
181- return roomSummaries.parallelMap { roomSummary ->
182- when (roomSummary) {
183- is RoomSummary .Empty -> RoomListRoomSummaryPlaceholders .create(roomSummary.identifier)
184- is RoomSummary .Filled -> {
185- val avatarData = AvatarData (
186- id = roomSummary.identifier(),
187- name = roomSummary.details.name,
188- url = roomSummary.details.avatarURLString,
189- size = AvatarSize .RoomListItem ,
190- )
191- val roomIdentifier = roomSummary.identifier()
192- RoomListRoomSummary (
193- id = roomSummary.identifier(),
194- roomId = RoomId (roomIdentifier),
195- name = roomSummary.details.name,
196- hasUnread = roomSummary.details.unreadNotificationCount > 0 ,
197- timestamp = lastMessageTimestampFormatter.format(roomSummary.details.lastMessageTimestamp),
198- lastMessage = roomSummary.details.lastMessage?.let { message ->
199- roomLastMessageFormatter.format(message.event, roomSummary.details.isDirect)
200- }.orEmpty(),
201- avatarData = avatarData,
202- )
203- }
204- }
205- }
206- }
207140}
0 commit comments