Refactor userEventPermissions
This commit is contained in:
parent
2605ddec7a
commit
6ad547833f
7 changed files with 41 additions and 24 deletions
|
|
@ -25,6 +25,7 @@ import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.produceState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
|
|
@ -74,12 +75,13 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
||||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||||
import io.element.android.libraries.matrix.api.room.isDm
|
import io.element.android.libraries.matrix.api.room.isDm
|
||||||
|
import io.element.android.libraries.matrix.api.room.powerlevels.canPinUnpin
|
||||||
|
import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther
|
||||||
|
import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOwn
|
||||||
|
import io.element.android.libraries.matrix.api.room.powerlevels.canSendMessage
|
||||||
import io.element.android.libraries.matrix.ui.messages.reply.map
|
import io.element.android.libraries.matrix.ui.messages.reply.map
|
||||||
import io.element.android.libraries.matrix.ui.model.getAvatarData
|
import io.element.android.libraries.matrix.ui.model.getAvatarData
|
||||||
import io.element.android.libraries.matrix.ui.room.canCall
|
import io.element.android.libraries.matrix.ui.room.canCall
|
||||||
import io.element.android.libraries.matrix.ui.room.canRedactOtherAsState
|
|
||||||
import io.element.android.libraries.matrix.ui.room.canRedactOwnAsState
|
|
||||||
import io.element.android.libraries.matrix.ui.room.canSendMessageAsState
|
|
||||||
import io.element.android.libraries.textcomposer.model.MessageComposerMode
|
import io.element.android.libraries.textcomposer.model.MessageComposerMode
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
|
|
@ -234,20 +236,14 @@ class MessagesPresenter @AssistedInject constructor(
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun userEventPermissions(updateKey: Long): State<UserEventPermissions> {
|
private fun userEventPermissions(updateKey: Long): State<UserEventPermissions> {
|
||||||
val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = updateKey)
|
return produceState(UserEventPermissions.DEFAULT, key1 = updateKey) {
|
||||||
val userHasPermissionToRedactOwn by room.canRedactOwnAsState(updateKey = updateKey)
|
value = UserEventPermissions(
|
||||||
val userHasPermissionToRedactOther by room.canRedactOtherAsState(updateKey = updateKey)
|
canSendMessage = room.canSendMessage(type = MessageEventType.ROOM_MESSAGE).getOrElse { true },
|
||||||
val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = updateKey)
|
canSendReaction = room.canSendMessage(type = MessageEventType.REACTION).getOrElse { true },
|
||||||
return remember {
|
canRedactOwn = room.canRedactOwn().getOrElse { false },
|
||||||
derivedStateOf {
|
canRedactOther = room.canRedactOther().getOrElse { false },
|
||||||
UserEventPermissions(
|
canPinUnpin = room.canPinUnpin().getOrElse { false },
|
||||||
canSendMessage = userHasPermissionToSendMessage,
|
)
|
||||||
canRedactOwn = userHasPermissionToRedactOwn,
|
|
||||||
canRedactOther = userHasPermissionToRedactOther,
|
|
||||||
canSendReaction = userHasPermissionToSendReaction,
|
|
||||||
canPin = false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@ fun aUserEventPermissions(
|
||||||
canRedactOther = canRedactOther,
|
canRedactOther = canRedactOther,
|
||||||
canSendMessage = canSendMessage,
|
canSendMessage = canSendMessage,
|
||||||
canSendReaction = canSendReaction,
|
canSendReaction = canSendReaction,
|
||||||
canPin = canPin,
|
canPinUnpin = canPin,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun aReactionSummaryState(
|
fun aReactionSummaryState(
|
||||||
|
|
|
||||||
|
|
@ -25,5 +25,15 @@ data class UserEventPermissions(
|
||||||
val canRedactOther: Boolean,
|
val canRedactOther: Boolean,
|
||||||
val canSendMessage: Boolean,
|
val canSendMessage: Boolean,
|
||||||
val canSendReaction: Boolean,
|
val canSendReaction: Boolean,
|
||||||
val canPin: Boolean,
|
val canPinUnpin: Boolean,
|
||||||
)
|
) {
|
||||||
|
companion object {
|
||||||
|
val DEFAULT = UserEventPermissions(
|
||||||
|
canRedactOwn = false,
|
||||||
|
canRedactOther = false,
|
||||||
|
canSendMessage = true,
|
||||||
|
canSendReaction = true,
|
||||||
|
canPinUnpin = false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -133,8 +133,8 @@ private fun buildActions(
|
||||||
add(TimelineItemAction.EndPoll)
|
add(TimelineItemAction.EndPoll)
|
||||||
}
|
}
|
||||||
// TODO: handle unpin
|
// TODO: handle unpin
|
||||||
val canPin = isPinnedEventsEnabled && usersEventPermissions.canPin && timelineItem.isRemote
|
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
|
||||||
if (canPin) {
|
if (canPinUnpin) {
|
||||||
add(TimelineItemAction.Pin)
|
add(TimelineItemAction.Pin)
|
||||||
}
|
}
|
||||||
if (timelineItem.content.canBeCopied()) {
|
if (timelineItem.content.canBeCopied()) {
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,6 @@ import io.element.android.features.messages.impl.timeline.components.reactionsum
|
||||||
import io.element.android.features.messages.impl.timeline.components.receipt.aReadReceiptData
|
import io.element.android.features.messages.impl.timeline.components.receipt.aReadReceiptData
|
||||||
import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetEvents
|
import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetEvents
|
||||||
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
||||||
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent
|
|
||||||
import io.element.android.libraries.matrix.api.core.UserId
|
import io.element.android.libraries.matrix.api.core.UserId
|
||||||
import io.element.android.libraries.testtags.TestTags
|
import io.element.android.libraries.testtags.TestTags
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
|
|
@ -181,7 +180,7 @@ class MessagesViewTest {
|
||||||
canRedactOwn = userHasPermissionToRedactOwn,
|
canRedactOwn = userHasPermissionToRedactOwn,
|
||||||
canRedactOther = userHasPermissionToRedactOther,
|
canRedactOther = userHasPermissionToRedactOther,
|
||||||
canSendReaction = userHasPermissionToSendReaction,
|
canSendReaction = userHasPermissionToSendReaction,
|
||||||
canPin = userCanPinEvent,
|
canPinUnpin = userCanPinEvent,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event
|
val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event
|
||||||
|
|
|
||||||
|
|
@ -65,3 +65,8 @@ suspend fun MatrixRoom.canRedactOwn(): Result<Boolean> = canUserRedactOwn(sessio
|
||||||
* Shortcut for calling [MatrixRoom.canRedactOther] with our own user.
|
* Shortcut for calling [MatrixRoom.canRedactOther] with our own user.
|
||||||
*/
|
*/
|
||||||
suspend fun MatrixRoom.canRedactOther(): Result<Boolean> = canUserRedactOther(sessionId)
|
suspend fun MatrixRoom.canRedactOther(): Result<Boolean> = canUserRedactOther(sessionId)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shortcut for calling [MatrixRoom.canUserPinUnpin] with our own user.
|
||||||
|
*/
|
||||||
|
suspend fun MatrixRoom.canPinUnpin(): Result<Boolean> = canUserPinUnpin(sessionId)
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,13 @@ fun MatrixRoom.canCall(updateKey: Long): State<Boolean> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun MatrixRoom.canPinUnpin(updateKey: Long): State<Boolean> {
|
||||||
|
return produceState(initialValue = false, key1 = updateKey) {
|
||||||
|
value = canUserPinUnpin(sessionId).getOrElse { false }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun MatrixRoom.isOwnUserAdmin(): Boolean {
|
fun MatrixRoom.isOwnUserAdmin(): Boolean {
|
||||||
val roomInfo by roomInfoFlow.collectAsState(initial = null)
|
val roomInfo by roomInfoFlow.collectAsState(initial = null)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue