Refactor userEventPermissions

This commit is contained in:
ganfra 2024-07-29 13:43:47 +02:00
parent 2605ddec7a
commit 6ad547833f
7 changed files with 41 additions and 24 deletions

View file

@ -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,22 +236,16 @@ 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,
) )
} }
} }
}
private fun MatrixRoomInfo.avatarData(): AvatarData { private fun MatrixRoomInfo.avatarData(): AvatarData {
return AvatarData( return AvatarData(

View file

@ -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(

View file

@ -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
) )
}
}

View file

@ -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()) {

View file

@ -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

View file

@ -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)

View file

@ -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)