Skip to content
Snippets Groups Projects
Commit a4d7e0bd authored by Taras's avatar Taras
Browse files

Add knock request message for profile knock request

parent 134b8f70
No related branches found
No related tags found
No related merge requests found
package org.futo.circles.feature.people package org.futo.circles.feature.people
import androidx.lifecycle.asFlow import androidx.lifecycle.asFlow
import androidx.lifecycle.map
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
...@@ -9,22 +8,24 @@ import kotlinx.coroutines.flow.distinctUntilChanged ...@@ -9,22 +8,24 @@ import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.futo.circles.core.extensions.createResult import org.futo.circles.core.extensions.createResult
import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.feature.room.knoks.KnockRequestsDataSource
import org.futo.circles.core.feature.select_users.SearchUserDataSource import org.futo.circles.core.feature.select_users.SearchUserDataSource
import org.futo.circles.core.feature.workspace.SharedCircleDataSource import org.futo.circles.core.feature.workspace.SharedCircleDataSource
import org.futo.circles.core.model.KnockRequestListItem
import org.futo.circles.core.provider.MatrixSessionProvider
import org.futo.circles.mapping.toPeopleUserListItem import org.futo.circles.mapping.toPeopleUserListItem
import org.futo.circles.model.PeopleHeaderItem import org.futo.circles.model.PeopleHeaderItem
import org.futo.circles.model.PeopleItemType import org.futo.circles.model.PeopleItemType
import org.futo.circles.model.PeopleListItem import org.futo.circles.model.PeopleListItem
import org.futo.circles.model.toPeopleRequestListItem
import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.session.user.model.User
import javax.inject.Inject import javax.inject.Inject
class PeopleDataSource @Inject constructor( class PeopleDataSource @Inject constructor(
private val searchUserDataSource: SearchUserDataSource, private val searchUserDataSource: SearchUserDataSource,
private val sharedCircleDataSource: SharedCircleDataSource private val sharedCircleDataSource: SharedCircleDataSource,
private val knockRequestsDataSource: KnockRequestsDataSource
) { ) {
private val session = MatrixSessionProvider.currentSession private val session = MatrixSessionProvider.currentSession
...@@ -37,10 +38,9 @@ class PeopleDataSource @Inject constructor( ...@@ -37,10 +38,9 @@ class PeopleDataSource @Inject constructor(
suspend fun declineFollowRequest(userId: String) = suspend fun declineFollowRequest(userId: String) =
createResult { session?.getRoom(profileRoomId)?.membershipService()?.remove(userId) } createResult { session?.getRoom(profileRoomId)?.membershipService()?.remove(userId) }
private fun getProfileRoomMembersKnockFlow(): Flow<List<User>> = private fun getProfileRoomMembersKnockFlow(): Flow<List<KnockRequestListItem>> =
session?.getRoom(profileRoomId)?.membershipService() knockRequestsDataSource.getKnockRequestsListItemsLiveData(profileRoomId)?.asFlow()
?.getRoomMembersLive(roomMemberQueryParams { memberships = listOf(Membership.KNOCK) }) ?: flowOf()
?.map { it.map { User(it.userId, it.displayName, it.avatarUrl) } }?.asFlow() ?: flowOf()
suspend fun getPeopleList(query: String) = combine( suspend fun getPeopleList(query: String) = combine(
searchUserDataSource.searchKnownUsers(query), searchUserDataSource.searchKnownUsers(query),
...@@ -62,11 +62,11 @@ class PeopleDataSource @Inject constructor( ...@@ -62,11 +62,11 @@ class PeopleDataSource @Inject constructor(
knowUsers: List<User>, knowUsers: List<User>,
suggestions: List<User>, suggestions: List<User>,
ignoredUsers: List<User>, ignoredUsers: List<User>,
requests: List<User> requests: List<KnockRequestListItem>
): List<PeopleListItem> { ): List<PeopleListItem> {
val uniqueItemsList = mutableListOf<PeopleListItem>().apply { val uniqueItemsList = mutableListOf<PeopleListItem>().apply {
addAll(ignoredUsers.map { it.toPeopleUserListItem(PeopleItemType.Ignored) }) addAll(ignoredUsers.map { it.toPeopleUserListItem(PeopleItemType.Ignored) })
addAll(requests.map { it.toPeopleUserListItem(PeopleItemType.Request) }) addAll(requests.map { it.toPeopleRequestListItem() })
addAll(knowUsers.map { it.toPeopleUserListItem(getKnownUserItemType(it.userId)) }) addAll(knowUsers.map { it.toPeopleUserListItem(getKnownUserItemType(it.userId)) })
addAll(suggestions.map { it.toPeopleUserListItem(PeopleItemType.Suggestion) }) addAll(suggestions.map { it.toPeopleUserListItem(PeopleItemType.Suggestion) })
}.distinctBy { it.id }.filterNot { it.id == session?.myUserId } }.distinctBy { it.id }.filterNot { it.id == session?.myUserId }
......
...@@ -3,17 +3,19 @@ package org.futo.circles.feature.people.list ...@@ -3,17 +3,19 @@ package org.futo.circles.feature.people.list
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.futo.circles.core.base.list.ViewBindingHolder
import org.futo.circles.core.base.list.context
import org.futo.circles.core.databinding.ListItemInviteHeaderBinding import org.futo.circles.core.databinding.ListItemInviteHeaderBinding
import org.futo.circles.core.extensions.loadProfileIcon import org.futo.circles.core.extensions.loadProfileIcon
import org.futo.circles.core.extensions.onClick import org.futo.circles.core.extensions.onClick
import org.futo.circles.core.base.list.ViewBindingHolder import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.core.base.list.context
import org.futo.circles.core.model.CirclesUserSummary import org.futo.circles.core.model.CirclesUserSummary
import org.futo.circles.databinding.ListItemPeopleDefaultBinding import org.futo.circles.databinding.ListItemPeopleDefaultBinding
import org.futo.circles.databinding.ListItemPeopleIgnoredBinding import org.futo.circles.databinding.ListItemPeopleIgnoredBinding
import org.futo.circles.databinding.ListItemPeopleRequestBinding import org.futo.circles.databinding.ListItemPeopleRequestBinding
import org.futo.circles.model.PeopleHeaderItem import org.futo.circles.model.PeopleHeaderItem
import org.futo.circles.model.PeopleListItem import org.futo.circles.model.PeopleListItem
import org.futo.circles.model.PeopleRequestListItem
import org.futo.circles.model.PeopleUserListItem import org.futo.circles.model.PeopleUserListItem
import org.futo.circles.model.PeopleUserListItemPayload import org.futo.circles.model.PeopleUserListItemPayload
...@@ -81,8 +83,12 @@ class PeopleRequestUserViewHolder( ...@@ -81,8 +83,12 @@ class PeopleRequestUserViewHolder(
} }
override fun bind(data: PeopleListItem) { override fun bind(data: PeopleListItem) {
val user = (data as? PeopleUserListItem)?.user ?: return val user = (data as? PeopleRequestListItem)?.user ?: return
bindUser(user) bindUser(user)
binding.tvReasonMessage.apply {
setIsVisible(data.reasonMessage != null)
text = data.reasonMessage
}
} }
override fun bindPayload(data: PeopleUserListItemPayload) { override fun bindPayload(data: PeopleUserListItemPayload) {
......
...@@ -3,6 +3,8 @@ package org.futo.circles.model ...@@ -3,6 +3,8 @@ package org.futo.circles.model
import org.futo.circles.R import org.futo.circles.R
import org.futo.circles.core.base.list.IdEntity import org.futo.circles.core.base.list.IdEntity
import org.futo.circles.core.model.CirclesUserSummary import org.futo.circles.core.model.CirclesUserSummary
import org.futo.circles.core.model.KnockRequestListItem
import org.futo.circles.core.model.toCircleUser
enum class PeopleItemType { Header, Friend, Following, Follower, Request, Known, Suggestion, Ignored } enum class PeopleItemType { Header, Friend, Following, Follower, Request, Known, Suggestion, Ignored }
sealed class PeopleListItem( sealed class PeopleListItem(
...@@ -31,3 +33,12 @@ class PeopleUserListItem( ...@@ -31,3 +33,12 @@ class PeopleUserListItem(
) : PeopleListItem(type) { ) : PeopleListItem(type) {
override val id: String = user.id override val id: String = user.id
} }
class PeopleRequestListItem(
val user: CirclesUserSummary,
val reasonMessage: String?
) : PeopleListItem(PeopleItemType.Request) {
override val id: String = user.id
}
fun KnockRequestListItem.toPeopleRequestListItem() = PeopleRequestListItem(toCircleUser(), message)
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
android:layout_width="72dp" android:layout_width="72dp"
android:layout_height="0dp" android:layout_height="0dp"
android:scaleType="centerCrop" android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1" app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
...@@ -26,10 +25,11 @@ ...@@ -26,10 +25,11 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:ellipsize="end" android:ellipsize="end"
android:lines="1" android:lines="1"
app:layout_constraintBottom_toTopOf="@id/tvFollowText" app:layout_constraintBottom_toTopOf="@id/tvFollowText"
app:layout_constraintEnd_toStartOf="@id/btnAccept" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ivUserImage" app:layout_constraintStart_toEndOf="@id/ivUserImage"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" app:layout_constraintVertical_chainStyle="packed"
...@@ -44,23 +44,42 @@ ...@@ -44,23 +44,42 @@
android:lines="1" android:lines="1"
android:text="@string/wants_to_follow_you" android:text="@string/wants_to_follow_you"
android:textSize="13sp" android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@id/tvUserName"
app:layout_constraintEnd_toStartOf="@id/btnAccept"
app:layout_constraintStart_toStartOf="@id/tvUserName" app:layout_constraintStart_toStartOf="@id/tvUserName"
app:layout_constraintTop_toBottomOf="@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 <com.google.android.material.button.MaterialButton
android:id="@+id/btnAccept" android:id="@+id/btnAccept"
style="@style/AccentButtonStyle" style="@style/AccentButtonStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:padding="0dp" android:padding="0dp"
android:text="@string/accept" android:text="@string/accept"
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnDecline" app:layout_constraintEnd_toStartOf="@id/btnDecline"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintStart_toEndOf="@id/ivUserImage"
app:layout_constraintTop_toBottomOf="@id/tvReasonMessage"
/>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/btnDecline" android:id="@+id/btnDecline"
...@@ -72,6 +91,7 @@ ...@@ -72,6 +91,7 @@
android:textSize="14sp" android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintStart_toEndOf="@id/btnAccept"
app:layout_constraintTop_toTopOf="@id/btnAccept" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment