From 6ad547833fa7e8b93fc11c88d3d6e06162336e29 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 29 Jul 2024 13:43:47 +0200 Subject: [PATCH] Refactor userEventPermissions --- .../messages/impl/MessagesPresenter.kt | 30 ++++++++----------- .../messages/impl/MessagesStateProvider.kt | 2 +- .../messages/impl/UserEventPermissions.kt | 14 +++++++-- .../impl/actionlist/ActionListPresenter.kt | 4 +-- .../messages/impl/MessagesViewTest.kt | 3 +- .../room/powerlevels/MatrixRoomPowerLevels.kt | 5 ++++ .../matrix/ui/room/MatrixRoomState.kt | 7 +++++ 7 files changed, 41 insertions(+), 24 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 16698d7e34..c86b587063 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope 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.MessageEventType 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.model.getAvatarData 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.ui.strings.CommonStrings import kotlinx.collections.immutable.toPersistentList @@ -234,20 +236,14 @@ class MessagesPresenter @AssistedInject constructor( @Composable private fun userEventPermissions(updateKey: Long): State { - val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = updateKey) - val userHasPermissionToRedactOwn by room.canRedactOwnAsState(updateKey = updateKey) - val userHasPermissionToRedactOther by room.canRedactOtherAsState(updateKey = updateKey) - val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = updateKey) - return remember { - derivedStateOf { - UserEventPermissions( - canSendMessage = userHasPermissionToSendMessage, - canRedactOwn = userHasPermissionToRedactOwn, - canRedactOther = userHasPermissionToRedactOther, - canSendReaction = userHasPermissionToSendReaction, - canPin = false, - ) - } + return produceState(UserEventPermissions.DEFAULT, key1 = updateKey) { + value = UserEventPermissions( + canSendMessage = room.canSendMessage(type = MessageEventType.ROOM_MESSAGE).getOrElse { true }, + canSendReaction = room.canSendMessage(type = MessageEventType.REACTION).getOrElse { true }, + canRedactOwn = room.canRedactOwn().getOrElse { false }, + canRedactOther = room.canRedactOther().getOrElse { false }, + canPinUnpin = room.canPinUnpin().getOrElse { false }, + ) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 61f2189cc6..a95657be28 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -150,7 +150,7 @@ fun aUserEventPermissions( canRedactOther = canRedactOther, canSendMessage = canSendMessage, canSendReaction = canSendReaction, - canPin = canPin, + canPinUnpin = canPin, ) fun aReactionSummaryState( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt index c75054be3a..77a24b8c5d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt @@ -25,5 +25,15 @@ data class UserEventPermissions( val canRedactOther: Boolean, val canSendMessage: 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 + ) + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt index 3387373734..55f58294f6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt @@ -133,8 +133,8 @@ private fun buildActions( add(TimelineItemAction.EndPoll) } // TODO: handle unpin - val canPin = isPinnedEventsEnabled && usersEventPermissions.canPin && timelineItem.isRemote - if (canPin) { + val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote + if (canPinUnpin) { add(TimelineItemAction.Pin) } if (timelineItem.content.canBeCopied()) { diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt index 17a051ba9b..e876b5ec60 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt @@ -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.bottomsheet.ReadReceiptBottomSheetEvents 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.testtags.TestTags import io.element.android.libraries.ui.strings.CommonStrings @@ -181,7 +180,7 @@ class MessagesViewTest { canRedactOwn = userHasPermissionToRedactOwn, canRedactOther = userHasPermissionToRedactOther, canSendReaction = userHasPermissionToSendReaction, - canPin = userCanPinEvent, + canPinUnpin = userCanPinEvent, ), ) val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt index ef4e6f747e..2abd42f519 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt @@ -65,3 +65,8 @@ suspend fun MatrixRoom.canRedactOwn(): Result = canUserRedactOwn(sessio * Shortcut for calling [MatrixRoom.canRedactOther] with our own user. */ suspend fun MatrixRoom.canRedactOther(): Result = canUserRedactOther(sessionId) + +/** + * Shortcut for calling [MatrixRoom.canUserPinUnpin] with our own user. + */ +suspend fun MatrixRoom.canPinUnpin(): Result = canUserPinUnpin(sessionId) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt index ab3c80a6e2..8ff8b1a894 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt @@ -56,6 +56,13 @@ fun MatrixRoom.canCall(updateKey: Long): State { } } +@Composable +fun MatrixRoom.canPinUnpin(updateKey: Long): State { + return produceState(initialValue = false, key1 = updateKey) { + value = canUserPinUnpin(sessionId).getOrElse { false } + } +} + @Composable fun MatrixRoom.isOwnUserAdmin(): Boolean { val roomInfo by roomInfoFlow.collectAsState(initial = null)