diff --git a/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt b/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt index 3bad78275366f0f976932fbabf9f03920b9b26c1..9c2fd1fa5d7160c4c92c350ab0f44213a3f111f9 100644 --- a/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt +++ b/app/src/main/java/org/futo/circles/feature/groups/GroupsDataSource.kt @@ -1,36 +1,42 @@ package org.futo.circles.feature.groups -import org.futo.circles.core.feature.room.RoomListHelper +import androidx.lifecycle.asFlow +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.withContext import org.futo.circles.core.model.GROUP_TYPE -import org.futo.circles.mapping.toInviteGroupListItem +import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.mapping.toJoinedGroupListItem +import org.futo.circles.model.GroupInvitesNotificationListItem import org.futo.circles.model.GroupListItem import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.model.RoomType +import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import javax.inject.Inject -class GroupsDataSource @Inject constructor( - private val roomListHelper: RoomListHelper -) { - fun getGroupsFlow() = roomListHelper.getRoomsFlow(::filterGroups) +class GroupsDataSource @Inject constructor() { + fun getGroupsFlow() = combine( + MatrixSessionProvider.getSessionOrThrow().roomService() + .getRoomSummariesLive(roomSummaryQueryParams { excludeType = listOf(RoomType.SPACE) }) + .asFlow(), + MatrixSessionProvider.getSessionOrThrow().roomService().getChangeMembershipsLive().asFlow() + ) { roomSummaries, _ -> + withContext(Dispatchers.IO) { buildList(roomSummaries) } + }.distinctUntilChanged() - private fun filterGroups( - list: List<RoomSummary>, - knownUsersIds: Set<String>, - roomIdsToUnblur: Set<String> - ): List<GroupListItem> { + + private fun buildList(list: List<RoomSummary>): List<GroupListItem> { val groups = list.filter { it.roomType == GROUP_TYPE } val joinedGroups = groups.mapNotNull { it.takeIf { it.membership == Membership.JOIN } } - val invites = groups.mapNotNull { it.takeIf { it.membership == Membership.INVITE } } + val invitesCount = + groups.mapNotNull { it.takeIf { it.membership == Membership.INVITE } }.size return mutableListOf<GroupListItem>().apply { - addAll(invites.map { - it.toInviteGroupListItem( - roomListHelper.shouldBlurIconFor(it, knownUsersIds, roomIdsToUnblur) - ) - }) + if (invitesCount > 0) + add(GroupInvitesNotificationListItem(invitesCount)) + addAll(joinedGroups.map { it.toJoinedGroupListItem() }) } } - - fun unblurProfileImageFor(id: String) = roomListHelper.unblurProfileImageFor(id) } \ No newline at end of file