From ca8f327115319553bd6cad3493b36ae638638b4b Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Tue, 11 Jun 2024 17:11:46 +0300
Subject: [PATCH] Remove people invite/knock from manage invites screen

---
 .../category/PeopleCategoryDataSource.kt      |   7 +-
 .../feature/room/invites/InvitesDataSource.kt |  66 +---------
 .../room/invites/InvitesDialogFragment.kt     |  22 +---
 .../feature/room/invites/InvitesViewModel.kt  |  47 +------
 .../room/invites/list/InvitesAdapter.kt       |  40 ++----
 .../room/invites/list/InvitesViewHolder.kt    | 115 +-----------------
 .../futo/circles/core/model/InviteTypeArg.kt  |   2 +-
 .../circles/core/model/RoomInviteListItem.kt  |  34 ++++++
 .../layout/list_item_connection_invite.xml    |  94 --------------
 .../res/layout/list_item_people_request.xml   | 110 -----------------
 core/src/main/res/values/strings.xml          |   1 -
 11 files changed, 59 insertions(+), 479 deletions(-)
 create mode 100644 core/src/main/java/org/futo/circles/core/model/RoomInviteListItem.kt
 delete mode 100644 core/src/main/res/layout/list_item_connection_invite.xml
 delete mode 100644 core/src/main/res/layout/list_item_people_request.xml

diff --git a/app/src/main/java/org/futo/circles/feature/people/category/PeopleCategoryDataSource.kt b/app/src/main/java/org/futo/circles/feature/people/category/PeopleCategoryDataSource.kt
index be9efbfb6..dbb3f23b9 100644
--- a/app/src/main/java/org/futo/circles/feature/people/category/PeopleCategoryDataSource.kt
+++ b/app/src/main/java/org/futo/circles/feature/people/category/PeopleCategoryDataSource.kt
@@ -5,7 +5,6 @@ import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.map
 import org.futo.circles.core.extensions.getKnownUsersFlow
 import org.futo.circles.core.extensions.getRoomOwner
-import org.futo.circles.core.feature.workspace.SharedCircleDataSource
 import org.futo.circles.core.feature.workspace.SpacesTreeAccountDataSource
 import org.futo.circles.core.model.CIRCLES_SPACE_ACCOUNT_DATA_KEY
 import org.futo.circles.core.provider.MatrixSessionProvider
@@ -20,8 +19,7 @@ import org.matrix.android.sdk.api.session.user.model.User
 import javax.inject.Inject
 
 class PeopleCategoryDataSource @Inject constructor(
-    private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource,
-    private val sharedCircleDataSource: SharedCircleDataSource
+    private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource
 ) {
 
     private val session = MatrixSessionProvider.getSessionOrThrow()
@@ -46,9 +44,6 @@ class PeopleCategoryDataSource @Inject constructor(
         }
     }
 
-
-    fun getProfileRoomId() = sharedCircleDataSource.getSharedCirclesSpaceId() ?: ""
-
     fun getIgnoredUserFlow() = session.userService().getIgnoredUsersLive().asFlow()
 
     //All the joined members (except me) in all of my circle timeline rooms
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt
index 9fbbce068..0769c4b6f 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt
@@ -1,88 +1,34 @@
 package org.futo.circles.core.feature.room.invites
 
 import androidx.lifecycle.asFlow
-import androidx.lifecycle.map
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.withContext
 import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.getKnownUsersFlow
-import org.futo.circles.core.feature.room.knoks.KnockRequestsDataSource
-import org.futo.circles.core.feature.workspace.SharedCircleDataSource
-import org.futo.circles.core.mapping.toCirclesUserSummary
-import org.futo.circles.core.model.ConnectionInviteListItem
-import org.futo.circles.core.model.FollowRequestListItem
 import org.futo.circles.core.model.GALLERY_TYPE
 import org.futo.circles.core.model.GROUP_TYPE
-import org.futo.circles.core.model.InviteHeader
-import org.futo.circles.core.model.InviteListItem
 import org.futo.circles.core.model.InviteTypeArg
 import org.futo.circles.core.model.RoomInviteListItem
 import org.futo.circles.core.model.TIMELINE_TYPE
 import org.futo.circles.core.model.convertToCircleRoomType
-import org.futo.circles.core.model.toCircleUser
 import org.futo.circles.core.model.toRoomInviteListItem
 import org.futo.circles.core.provider.MatrixSessionProvider
 import org.futo.circles.core.utils.getAllCirclesRoomsLiveData
-import org.futo.circles.core.utils.getSpacesLiveData
 import org.matrix.android.sdk.api.session.getRoom
-import org.matrix.android.sdk.api.session.getUserOrDefault
 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 javax.inject.Inject
 
-class InvitesDataSource @Inject constructor(
-    private val knockRequestsDataSource: KnockRequestsDataSource,
-    sharedCircleDataSource: SharedCircleDataSource
-) {
+class InvitesDataSource @Inject constructor() {
 
-    private val session = MatrixSessionProvider.currentSession
-    private val profileRoomId = sharedCircleDataSource.getSharedCirclesSpaceId() ?: ""
     private val roomIdsToUnblurProfile = MutableStateFlow<Set<String>>(emptySet())
 
-    fun getInvitesFlow(type: InviteTypeArg) = when (type) {
-        InviteTypeArg.People -> getPeopleInvites()
-        else -> getRoomInvitesFlow(type)
-    }
-
-    private fun getPeopleInvites() = combine(
-        getProfileSpaceInvitesFlow(),
-        getProfileRoomMembersKnockFlow()
-    ) { invites, knocks ->
-        val list = mutableListOf<InviteListItem>()
-        if (invites.isNotEmpty()) {
-            list.add(InviteHeader.connectInvitesHeader)
-            list.addAll(invites)
-        }
-        if (knocks.isNotEmpty()) {
-            list.add(InviteHeader.followRequestHeader)
-            list.addAll(knocks)
-        }
-        list
-    }
-
-    private fun getProfileRoomMembersKnockFlow(): Flow<List<FollowRequestListItem>> =
-        knockRequestsDataSource.getKnockRequestsListItemsLiveData(profileRoomId).map { list ->
-            list.map { FollowRequestListItem(it.toCircleUser(), it.message) }
-        }.asFlow()
-
-    private fun getProfileSpaceInvitesFlow(): Flow<List<ConnectionInviteListItem>> =
-        getSpacesLiveData(listOf(Membership.INVITE)).map {
-            it.filter { it.roomType == RoomType.SPACE }.map { summary ->
-                ConnectionInviteListItem(
-                    summary.roomId,
-                    session.getUserOrDefault(summary.inviterId ?: "").toCirclesUserSummary()
-                )
-            }
-        }.asFlow()
-
-    private fun getRoomInvitesFlow(
+    fun getRoomInvitesFlow(
         inviteType: InviteTypeArg
     ): Flow<List<RoomInviteListItem>> = combine(
         getAllCirclesRoomsLiveData(listOf(Membership.INVITE)).asFlow(),
@@ -96,7 +42,6 @@ class InvitesDataSource @Inject constructor(
                     InviteTypeArg.Circle -> it.roomType == TIMELINE_TYPE
                     InviteTypeArg.Group -> it.roomType == GROUP_TYPE
                     InviteTypeArg.Photo -> it.roomType == GALLERY_TYPE
-                    else -> false
                 }
             }.map {
                 it.toRoomInviteListItem(
@@ -121,11 +66,4 @@ class InvitesDataSource @Inject constructor(
     fun unblurProfileImageFor(id: String) {
         roomIdsToUnblurProfile.update { set -> set.toMutableSet().apply { add(id) } }
     }
-
-    suspend fun acceptFollowRequest(userId: String) = createResult {
-        session?.roomService()?.getRoom(profileRoomId)?.membershipService()?.invite(userId)
-    }
-
-    suspend fun declineFollowRequest(userId: String) =
-        createResult { session?.getRoom(profileRoomId)?.membershipService()?.remove(userId) }
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt
index 0ef34094a..7f09380a5 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt
@@ -15,9 +15,6 @@ import org.futo.circles.core.extensions.observeResponse
 import org.futo.circles.core.extensions.showNoInternetConnection
 import org.futo.circles.core.feature.room.invites.list.InvitesAdapter
 import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.core.model.ConnectionInviteListItem
-import org.futo.circles.core.model.FollowRequestListItem
-import org.futo.circles.core.model.InviteListItem
 import org.futo.circles.core.model.InviteTypeArg
 import org.futo.circles.core.model.RoomInviteListItem
 import org.futo.circles.core.view.EmptyTabPlaceholderView
@@ -66,26 +63,16 @@ class InvitesDialogFragment :
             InviteTypeArg.Circle -> R.string.circle_invitations
             InviteTypeArg.Group -> R.string.group_invitations
             InviteTypeArg.Photo -> R.string.gallery_invitations
-            InviteTypeArg.People -> R.string.connection_invites_requests
         }
     )
 
     private fun getEmptyMessage() = getString(R.string.no_new_invitations_format, getTitle())
 
-    private fun onInviteClicked(item: InviteListItem, isAccepted: Boolean) {
+    private fun onInviteClicked(item: RoomInviteListItem, isAccepted: Boolean) {
         if (showNoInternetConnection()) return
-        when (item) {
-            is ConnectionInviteListItem -> viewModel.onConnectionInviteAnswered(
-                item.roomId, isAccepted
-            )
-
-            is FollowRequestListItem -> viewModel.onFollowRequestAnswered(item.id, isAccepted)
-            is RoomInviteListItem -> when (item.roomType) {
-                CircleRoomTypeArg.Circle -> handleCircleInvite(item.id, isAccepted)
-                else -> handleRoomInvite(item.id, isAccepted, item.roomType)
-            }
-
-            else -> {}
+        when (item.roomType) {
+            CircleRoomTypeArg.Circle -> handleCircleInvite(item.id, isAccepted)
+            else -> handleRoomInvite(item.id, isAccepted, item.roomType)
         }
     }
 
@@ -106,5 +93,4 @@ class InvitesDialogFragment :
         )
     }
 
-
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt
index aae308101..352c9b095 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt
@@ -11,12 +11,7 @@ import org.futo.circles.core.extensions.Response
 import org.futo.circles.core.extensions.getOrThrow
 import org.futo.circles.core.extensions.launchBg
 import org.futo.circles.core.feature.room.invite.ManageInviteRequestsDataSource
-import org.futo.circles.core.feature.workspace.SharedCircleDataSource
 import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.core.model.ConnectionInviteListItem
-import org.futo.circles.core.model.FollowRequestListItem
-import org.futo.circles.core.model.InviteHeader
-import org.futo.circles.core.model.InviteListItem
 import org.futo.circles.core.model.InviteTypeArg
 import org.futo.circles.core.model.RoomInviteListItem
 import javax.inject.Inject
@@ -25,36 +20,21 @@ import javax.inject.Inject
 class InvitesViewModel @Inject constructor(
     savedStateHandle: SavedStateHandle,
     private val dataSource: InvitesDataSource,
-    private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource,
-    private val sharedCircleDataSource: SharedCircleDataSource
+    private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource
 ) : ViewModel() {
 
     private val inviteType: InviteTypeArg = savedStateHandle.getOrThrow("type")
 
     val inviteResultLiveData = SingleEventLiveData<Response<Unit?>>()
     private val loadingItemsIdsList = MutableLiveData<Set<String>>(emptySet())
-    val invitesLiveData = MediatorLiveData<List<InviteListItem>>().also {
+    val invitesLiveData = MediatorLiveData<List<RoomInviteListItem>>().also {
         it.addSource(loadingItemsIdsList) { loadingItemsValue ->
             val currentList = it.value ?: emptyList()
             it.postValue(currentList.map { item ->
-                when (item) {
-                    is ConnectionInviteListItem -> item.copy(
-                        isLoading = loadingItemsValue.contains(item.id)
-                    )
-
-                    is FollowRequestListItem -> item.copy(
-                        isLoading = loadingItemsValue.contains(item.id)
-                    )
-
-                    is RoomInviteListItem -> item.copy(
-                        isLoading = loadingItemsValue.contains(item.id)
-                    )
-
-                    is InviteHeader -> item
-                }
+                item.copy(isLoading = loadingItemsValue.contains(item.id))
             })
         }
-        it.addSource(dataSource.getInvitesFlow(inviteType).asLiveData()) { value ->
+        it.addSource(dataSource.getRoomInvitesFlow(inviteType).asLiveData()) { value ->
             it.postValue(value)
         }
     }
@@ -77,29 +57,10 @@ class InvitesViewModel @Inject constructor(
         }
     }
 
-    fun onFollowRequestAnswered(userId: String, accepted: Boolean) {
-        launchBg {
-            toggleItemLoading(userId)
-            val result = if (accepted) dataSource.acceptFollowRequest(userId)
-            else dataSource.declineFollowRequest(userId)
-            postInviteResult(result, userId)
-        }
-    }
-
     fun unblurProfileIcon(roomId: String) {
         dataSource.unblurProfileImageFor(roomId)
     }
 
-    fun onConnectionInviteAnswered(roomId: String, accepted: Boolean) {
-        if (accepted)
-            launchBg {
-                toggleItemLoading(roomId)
-                val result = sharedCircleDataSource.acceptSharedCircleInvite(roomId)
-                postInviteResult(result, roomId)
-            }
-        else rejectRoomInvite(roomId)
-    }
-
     private fun postInviteResult(result: Response<Unit?>, id: String) {
         inviteResultLiveData.postValue(result)
         toggleItemLoading(id)
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt
index 3a619e8e3..d479fcd95 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt
@@ -3,28 +3,19 @@ package org.futo.circles.core.feature.room.invites.list
 import android.view.ViewGroup
 import org.futo.circles.core.base.list.BaseRvAdapter
 import org.futo.circles.core.model.CircleRoomTypeArg
-import org.futo.circles.core.model.ConnectionInviteListItem
-import org.futo.circles.core.model.FollowRequestListItem
-import org.futo.circles.core.model.InviteHeader
-import org.futo.circles.core.model.InviteListItem
 import org.futo.circles.core.model.RoomInviteListItem
 
-enum class InviteViewType { Circle, Group, Photo, Header, PeopleInvite, PeopleKnock }
+enum class InviteViewType { Circle, Group, Photo }
 
 class InvitesAdapter(
-    private val onInviteClicked: (InviteListItem, Boolean) -> Unit,
-    private val onUnblurProfileIconClicked: (InviteListItem) -> Unit
-) : BaseRvAdapter<InviteListItem, InviteViewHolder>(DefaultIdEntityCallback()) {
-
-    override fun getItemViewType(position: Int): Int = when (val item = getItem(position)) {
-        is ConnectionInviteListItem -> InviteViewType.PeopleInvite.ordinal
-        is FollowRequestListItem -> InviteViewType.PeopleKnock.ordinal
-        is InviteHeader -> InviteViewType.Header.ordinal
-        is RoomInviteListItem -> when (item.roomType) {
-            CircleRoomTypeArg.Circle -> InviteViewType.Circle.ordinal
-            CircleRoomTypeArg.Group -> InviteViewType.Group.ordinal
-            CircleRoomTypeArg.Photo -> InviteViewType.Photo.ordinal
-        }
+    private val onInviteClicked: (RoomInviteListItem, Boolean) -> Unit,
+    private val onUnblurProfileIconClicked: (RoomInviteListItem) -> Unit
+) : BaseRvAdapter<RoomInviteListItem, InviteViewHolder>(DefaultIdEntityCallback()) {
+
+    override fun getItemViewType(position: Int): Int = when (getItem(position).roomType) {
+        CircleRoomTypeArg.Circle -> InviteViewType.Circle.ordinal
+        CircleRoomTypeArg.Group -> InviteViewType.Group.ordinal
+        CircleRoomTypeArg.Photo -> InviteViewType.Photo.ordinal
     }
 
     override fun onCreateViewHolder(
@@ -58,19 +49,6 @@ class InvitesAdapter(
                 onShowProfileIconClicked = { position ->
                     onUnblurProfileIconClicked(getItem(position))
                 })
-
-        InviteViewType.Header -> InviteHeaderViewHolder(parent)
-        InviteViewType.PeopleInvite -> ConnectionInviteViewHolder(
-            parent = parent,
-            onRequestClicked = { position, isAccepted ->
-                onInviteClicked(getItem(position), isAccepted)
-            })
-
-        InviteViewType.PeopleKnock -> FollowRequestViewHolder(
-            parent = parent,
-            onRequestClicked = { position, isAccepted ->
-                onInviteClicked(getItem(position), isAccepted)
-            })
     }
 
 
diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt
index 24b4c012e..6edb90583 100644
--- a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt
+++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt
@@ -6,26 +6,17 @@ import androidx.recyclerview.widget.RecyclerView
 import org.futo.circles.core.R
 import org.futo.circles.core.base.list.ViewBindingHolder
 import org.futo.circles.core.base.list.context
-import org.futo.circles.core.databinding.ListItemConnectionInviteBinding
-import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
 import org.futo.circles.core.databinding.ListItemInvitedCircleBinding
 import org.futo.circles.core.databinding.ListItemInvitedGalleryBinding
 import org.futo.circles.core.databinding.ListItemInvitedGroupBinding
-import org.futo.circles.core.databinding.ListItemPeopleRequestBinding
 import org.futo.circles.core.extensions.loadRoomProfileIcon
-import org.futo.circles.core.extensions.loadUserProfileIcon
 import org.futo.circles.core.extensions.onClick
 import org.futo.circles.core.extensions.setIsEncryptedIcon
 import org.futo.circles.core.extensions.setIsVisible
-import org.futo.circles.core.model.CirclesUserSummary
-import org.futo.circles.core.model.ConnectionInviteListItem
-import org.futo.circles.core.model.FollowRequestListItem
-import org.futo.circles.core.model.InviteHeader
-import org.futo.circles.core.model.InviteListItem
 import org.futo.circles.core.model.RoomInviteListItem
 
 abstract class InviteViewHolder(view: View) : RecyclerView.ViewHolder(view) {
-    abstract fun bind(data: InviteListItem)
+    abstract fun bind(data: RoomInviteListItem)
 }
 
 
@@ -45,9 +36,7 @@ class InvitedGroupViewHolder(
         onClick(binding.ivGroup) { position -> onShowProfileIconClicked(position) }
     }
 
-    override fun bind(data: InviteListItem) {
-        if (data !is RoomInviteListItem) return
-
+    override fun bind(data: RoomInviteListItem) {
         with(binding) {
             setLoading(data.isLoading)
             ivGroup.loadRoomProfileIcon(
@@ -90,9 +79,7 @@ class InvitedCircleViewHolder(
         onClick(binding.ivCircle) { position -> onShowProfileIconClicked(position) }
     }
 
-    override fun bind(data: InviteListItem) {
-        if (data !is RoomInviteListItem) return
-
+    override fun bind(data: RoomInviteListItem) {
         with(binding) {
             setLoading(data.isLoading)
             tvShowProfileImage.setIsVisible(data.shouldBlurIcon)
@@ -135,9 +122,7 @@ class InvitedGalleryViewHolder(
         onClick(binding.ivGallery) { position -> onShowProfileIconClicked(position) }
     }
 
-    override fun bind(data: InviteListItem) {
-        if (data !is RoomInviteListItem) return
-
+    override fun bind(data: RoomInviteListItem) {
         with(binding) {
             setLoading(data.isLoading)
             tvGalleryTitle.text = data.info.title
@@ -159,95 +144,3 @@ class InvitedGalleryViewHolder(
         }
     }
 }
-
-class FollowRequestViewHolder(
-    parent: ViewGroup,
-    private val onRequestClicked: (Int, Boolean) -> Unit
-) : InviteViewHolder(inflate(parent, ListItemPeopleRequestBinding::inflate)) {
-
-    private companion object : ViewBindingHolder
-
-    private val binding = baseBinding as ListItemPeopleRequestBinding
-
-    init {
-        onClick(binding.btnAccept) { position -> onRequestClicked(position, true) }
-        onClick(binding.btnDecline) { position -> onRequestClicked(position, false) }
-    }
-
-    override fun bind(data: InviteListItem) {
-        if (data !is FollowRequestListItem) return
-
-        setLoading(data.isLoading)
-        bindUser(data.user)
-        binding.tvReasonMessage.apply {
-            setIsVisible(data.reasonMessage != null)
-            text = data.reasonMessage
-        }
-    }
-
-    private fun bindUser(user: CirclesUserSummary) {
-        with(binding) {
-            tvUserName.text = user.name
-            ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
-        }
-    }
-
-    private fun setLoading(isLoading: Boolean) {
-        with(binding) {
-            vLoading.setIsVisible(isLoading)
-            btnAccept.setIsVisible(!isLoading)
-            btnDecline.setIsVisible(!isLoading)
-        }
-    }
-}
-
-class ConnectionInviteViewHolder(
-    parent: ViewGroup,
-    private val onRequestClicked: (Int, Boolean) -> Unit
-) : InviteViewHolder(inflate(parent, ListItemConnectionInviteBinding::inflate)) {
-
-    private companion object : ViewBindingHolder
-
-    private val binding = baseBinding as ListItemConnectionInviteBinding
-
-    init {
-        onClick(binding.btnAccept) { position -> onRequestClicked(position, true) }
-        onClick(binding.btnDecline) { position -> onRequestClicked(position, false) }
-    }
-
-    override fun bind(data: InviteListItem) {
-        if (data !is ConnectionInviteListItem) return
-
-        setLoading(data.isLoading)
-        bindUser(data.user)
-    }
-
-    private fun bindUser(user: CirclesUserSummary) {
-        with(binding) {
-            tvUserName.text = user.name
-            ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id)
-        }
-    }
-
-    private fun setLoading(isLoading: Boolean) {
-        with(binding) {
-            vLoading.setIsVisible(isLoading)
-            btnAccept.setIsVisible(!isLoading)
-            btnDecline.setIsVisible(!isLoading)
-        }
-    }
-}
-
-class InviteHeaderViewHolder(
-    parent: ViewGroup,
-) : InviteViewHolder(inflate(parent, ListItemInviteHeaderBinding::inflate)) {
-
-    private companion object : ViewBindingHolder
-
-    private val binding = baseBinding as ListItemInviteHeaderBinding
-
-    override fun bind(data: InviteListItem) {
-        if (data !is InviteHeader) return
-        binding.tvHeader.text = context.getString(data.titleRes)
-    }
-}
diff --git a/core/src/main/java/org/futo/circles/core/model/InviteTypeArg.kt b/core/src/main/java/org/futo/circles/core/model/InviteTypeArg.kt
index 9c917551d..f31238666 100644
--- a/core/src/main/java/org/futo/circles/core/model/InviteTypeArg.kt
+++ b/core/src/main/java/org/futo/circles/core/model/InviteTypeArg.kt
@@ -1,3 +1,3 @@
 package org.futo.circles.core.model
 
-enum class InviteTypeArg { Circle, Group, Photo, People }
\ No newline at end of file
+enum class InviteTypeArg { Circle, Group, Photo }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/model/RoomInviteListItem.kt b/core/src/main/java/org/futo/circles/core/model/RoomInviteListItem.kt
new file mode 100644
index 000000000..ecf322a95
--- /dev/null
+++ b/core/src/main/java/org/futo/circles/core/model/RoomInviteListItem.kt
@@ -0,0 +1,34 @@
+package org.futo.circles.core.model
+
+import org.futo.circles.core.base.list.IdEntity
+import org.futo.circles.core.extensions.notEmptyDisplayName
+import org.futo.circles.core.mapping.toRoomInfo
+import org.futo.circles.core.provider.MatrixSessionProvider
+import org.matrix.android.sdk.api.session.getUserOrDefault
+import org.matrix.android.sdk.api.session.room.model.RoomSummary
+
+data class RoomInviteListItem(
+    val roomId: String,
+    val roomType: CircleRoomTypeArg,
+    val info: RoomInfo,
+    val isEncrypted: Boolean,
+    val inviterName: String,
+    val shouldBlurIcon: Boolean,
+    val isLoading: Boolean = false
+) : IdEntity<String> {
+    override val id: String = roomId
+}
+
+fun RoomSummary.toRoomInviteListItem(roomType: CircleRoomTypeArg, shouldBlurIcon: Boolean) =
+    RoomInviteListItem(
+        roomId = roomId,
+        info = toRoomInfo(),
+        inviterName = getInviterName(),
+        isEncrypted = isEncrypted,
+        shouldBlurIcon = shouldBlurIcon,
+        roomType = roomType
+    )
+
+fun RoomSummary.getInviterName() =
+    MatrixSessionProvider.currentSession?.getUserOrDefault(inviterId ?: "")?.notEmptyDisplayName()
+        ?: ""
\ No newline at end of file
diff --git a/core/src/main/res/layout/list_item_connection_invite.xml b/core/src/main/res/layout/list_item_connection_invite.xml
deleted file mode 100644
index efcf47b6c..000000000
--- a/core/src/main/res/layout/list_item_connection_invite.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingHorizontal="8dp"
-    android:paddingVertical="4dp"
-    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
-
-    <com.google.android.material.imageview.ShapeableImageView
-        android:id="@+id/ivUserImage"
-        android:layout_width="72dp"
-        android:layout_height="72dp"
-        android:scaleType="centerCrop"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent"
-        tools:background="@color/blue" />
-
-    <TextView
-        android:id="@+id/tvUserName"
-        style="@style/title2"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dp"
-        android:layout_marginEnd="8dp"
-        android:ellipsize="end"
-        android:lines="1"
-        app:layout_constraintBottom_toTopOf="@id/tvInvitesToConnect"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_chainStyle="packed"
-        tools:text="Android01" />
-
-    <TextView
-        android:id="@+id/tvInvitesToConnect"
-        style="@style/subheadline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:ellipsize="end"
-        android:lines="1"
-        android:text="@string/invites_you_to_connect"
-        android:textSize="13sp"
-        app:layout_constraintEnd_toEndOf="@id/tvUserName"
-        app:layout_constraintStart_toStartOf="@id/tvUserName"
-        app:layout_constraintTop_toBottomOf="@id/tvUserName" />
-
-
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btnAccept"
-        style="@style/AccentButtonStyle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="4dp"
-        android:layout_marginEnd="8dp"
-        android:padding="0dp"
-        android:text="@string/accept"
-        android:textSize="14sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/btnDecline"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toBottomOf="@id/tvInvitesToConnect"
-
-        />
-
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btnDecline"
-        style="@style/NegativeButtonStyle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="0dp"
-        android:text="@string/decline"
-        android:textSize="14sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/btnAccept"
-        app:layout_constraintTop_toTopOf="@id/btnAccept" />
-
-
-    <ProgressBar
-        android:id="@+id/vLoading"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:layout_marginTop="4dp"
-        android:visibility="gone"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toBottomOf="@+id/tvInvitesToConnect" />
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/core/src/main/res/layout/list_item_people_request.xml b/core/src/main/res/layout/list_item_people_request.xml
deleted file mode 100644
index d8f60007d..000000000
--- a/core/src/main/res/layout/list_item_people_request.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingHorizontal="8dp"
-    android:paddingVertical="4dp"
-    tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
-
-    <com.google.android.material.imageview.ShapeableImageView
-        android:id="@+id/ivUserImage"
-        android:layout_width="72dp"
-        android:layout_height="72dp"
-        android:scaleType="centerCrop"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent"
-        tools:background="@color/blue" />
-
-    <TextView
-        android:id="@+id/tvUserName"
-        style="@style/title2"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="8dp"
-        android:layout_marginEnd="8dp"
-        android:ellipsize="end"
-        android:lines="1"
-        app:layout_constraintBottom_toTopOf="@id/tvFollowText"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintVertical_chainStyle="packed"
-        tools:text="Android01" />
-
-    <TextView
-        android:id="@+id/tvFollowText"
-        style="@style/subheadline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:ellipsize="end"
-        android:lines="1"
-        android:text="@string/requests_to_follow_you"
-        android:textSize="13sp"
-        app:layout_constraintEnd_toEndOf="@id/tvUserName"
-        app:layout_constraintStart_toStartOf="@id/tvUserName"
-        app:layout_constraintTop_toBottomOf="@id/tvUserName" />
-
-    <TextView
-        android:id="@+id/tvReasonMessage"
-        style="@style/subheadline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="4dp"
-        android:ellipsize="end"
-        android:maxLines="3"
-        android:textSize="13sp"
-        android:visibility="gone"
-        app:layout_constraintEnd_toEndOf="@id/tvUserName"
-        app:layout_constraintStart_toStartOf="@id/tvUserName"
-        app:layout_constraintTop_toBottomOf="@id/tvFollowText"
-        tools:text="Reason message messagemessagemessagemessagemessagemessagemessagemessagemessagemessagemessage"
-        tools:visibility="visible" />
-
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btnAccept"
-        style="@style/AccentButtonStyle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="4dp"
-        android:layout_marginEnd="8dp"
-        android:padding="0dp"
-        android:text="@string/accept"
-        android:textSize="14sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toStartOf="@id/btnDecline"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toBottomOf="@id/tvReasonMessage"
-
-        />
-
-    <com.google.android.material.button.MaterialButton
-        android:id="@+id/btnDecline"
-        style="@style/NegativeButtonStyle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="0dp"
-        android:text="@string/decline"
-        android:textSize="14sp"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/btnAccept"
-        app:layout_constraintTop_toTopOf="@id/btnAccept" />
-
-
-    <ProgressBar
-        android:id="@+id/vLoading"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:layout_marginTop="4dp"
-        android:visibility="gone"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toEndOf="@id/ivUserImage"
-        app:layout_constraintTop_toBottomOf="@+id/tvReasonMessage" />
-
-
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 1df4cca11..1f314a129 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -133,7 +133,6 @@
     <string name="create">Create</string>
     <string name="show">Show</string>
     <string name="gallery_invites_notification_format">Show %d Gallery invitations</string>
-    <string name="connection_invites_requests">Connection invites/requests</string>
     <string name="group_invitations">Group invitations</string>
     <string name="gallery_invitations">Gallery invitations</string>
     <string name="circle_invitations">Circle invitations</string>
-- 
GitLab