Skip to content

Commit 210e209

Browse files
committed
Refactor userEventPermissions
1 parent 52a643f commit 210e209

File tree

7 files changed

+41
-24
lines changed

7 files changed

+41
-24
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import androidx.compose.runtime.collectAsState
2525
import androidx.compose.runtime.derivedStateOf
2626
import androidx.compose.runtime.getValue
2727
import androidx.compose.runtime.mutableStateOf
28+
import androidx.compose.runtime.produceState
2829
import androidx.compose.runtime.remember
2930
import androidx.compose.runtime.rememberCoroutineScope
3031
import androidx.compose.runtime.saveable.rememberSaveable
@@ -74,12 +75,13 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
7475
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
7576
import io.element.android.libraries.matrix.api.room.MessageEventType
7677
import io.element.android.libraries.matrix.api.room.isDm
78+
import io.element.android.libraries.matrix.api.room.powerlevels.canPinUnpin
79+
import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOther
80+
import io.element.android.libraries.matrix.api.room.powerlevels.canRedactOwn
81+
import io.element.android.libraries.matrix.api.room.powerlevels.canSendMessage
7782
import io.element.android.libraries.matrix.ui.messages.reply.map
7883
import io.element.android.libraries.matrix.ui.model.getAvatarData
7984
import io.element.android.libraries.matrix.ui.room.canCall
80-
import io.element.android.libraries.matrix.ui.room.canRedactOtherAsState
81-
import io.element.android.libraries.matrix.ui.room.canRedactOwnAsState
82-
import io.element.android.libraries.matrix.ui.room.canSendMessageAsState
8385
import io.element.android.libraries.textcomposer.model.MessageComposerMode
8486
import io.element.android.libraries.ui.strings.CommonStrings
8587
import kotlinx.collections.immutable.toPersistentList
@@ -234,20 +236,14 @@ class MessagesPresenter @AssistedInject constructor(
234236

235237
@Composable
236238
private fun userEventPermissions(updateKey: Long): State<UserEventPermissions> {
237-
val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = updateKey)
238-
val userHasPermissionToRedactOwn by room.canRedactOwnAsState(updateKey = updateKey)
239-
val userHasPermissionToRedactOther by room.canRedactOtherAsState(updateKey = updateKey)
240-
val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = updateKey)
241-
return remember {
242-
derivedStateOf {
243-
UserEventPermissions(
244-
canSendMessage = userHasPermissionToSendMessage,
245-
canRedactOwn = userHasPermissionToRedactOwn,
246-
canRedactOther = userHasPermissionToRedactOther,
247-
canSendReaction = userHasPermissionToSendReaction,
248-
canPin = false,
249-
)
250-
}
239+
return produceState(UserEventPermissions.DEFAULT, key1 = updateKey) {
240+
value = UserEventPermissions(
241+
canSendMessage = room.canSendMessage(type = MessageEventType.ROOM_MESSAGE).getOrElse { true },
242+
canSendReaction = room.canSendMessage(type = MessageEventType.REACTION).getOrElse { true },
243+
canRedactOwn = room.canRedactOwn().getOrElse { false },
244+
canRedactOther = room.canRedactOther().getOrElse { false },
245+
canPinUnpin = room.canPinUnpin().getOrElse { false },
246+
)
251247
}
252248
}
253249

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ fun aUserEventPermissions(
150150
canRedactOther = canRedactOther,
151151
canSendMessage = canSendMessage,
152152
canSendReaction = canSendReaction,
153-
canPin = canPin,
153+
canPinUnpin = canPin,
154154
)
155155

156156
fun aReactionSummaryState(

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/UserEventPermissions.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,15 @@ data class UserEventPermissions(
2525
val canRedactOther: Boolean,
2626
val canSendMessage: Boolean,
2727
val canSendReaction: Boolean,
28-
val canPin: Boolean,
29-
)
28+
val canPinUnpin: Boolean,
29+
) {
30+
companion object {
31+
val DEFAULT = UserEventPermissions(
32+
canRedactOwn = false,
33+
canRedactOther = false,
34+
canSendMessage = true,
35+
canSendReaction = true,
36+
canPinUnpin = false
37+
)
38+
}
39+
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ private fun buildActions(
133133
add(TimelineItemAction.EndPoll)
134134
}
135135
// TODO: handle unpin
136-
val canPin = isPinnedEventsEnabled && usersEventPermissions.canPin && timelineItem.isRemote
137-
if (canPin) {
136+
val canPinUnpin = isPinnedEventsEnabled && usersEventPermissions.canPinUnpin && timelineItem.isRemote
137+
if (canPinUnpin) {
138138
add(TimelineItemAction.Pin)
139139
}
140140
if (timelineItem.content.canBeCopied()) {

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import io.element.android.features.messages.impl.timeline.components.reactionsum
5353
import io.element.android.features.messages.impl.timeline.components.receipt.aReadReceiptData
5454
import io.element.android.features.messages.impl.timeline.components.receipt.bottomsheet.ReadReceiptBottomSheetEvents
5555
import io.element.android.features.messages.impl.timeline.model.TimelineItem
56-
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent
5756
import io.element.android.libraries.matrix.api.core.UserId
5857
import io.element.android.libraries.testtags.TestTags
5958
import io.element.android.libraries.ui.strings.CommonStrings
@@ -181,7 +180,7 @@ class MessagesViewTest {
181180
canRedactOwn = userHasPermissionToRedactOwn,
182181
canRedactOther = userHasPermissionToRedactOther,
183182
canSendReaction = userHasPermissionToSendReaction,
184-
canPin = userCanPinEvent,
183+
canPinUnpin = userCanPinEvent,
185184
),
186185
)
187186
val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,8 @@ suspend fun MatrixRoom.canRedactOwn(): Result<Boolean> = canUserRedactOwn(sessio
6565
* Shortcut for calling [MatrixRoom.canRedactOther] with our own user.
6666
*/
6767
suspend fun MatrixRoom.canRedactOther(): Result<Boolean> = canUserRedactOther(sessionId)
68+
69+
/**
70+
* Shortcut for calling [MatrixRoom.canUserPinUnpin] with our own user.
71+
*/
72+
suspend fun MatrixRoom.canPinUnpin(): Result<Boolean> = canUserPinUnpin(sessionId)

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/room/MatrixRoomState.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ fun MatrixRoom.canCall(updateKey: Long): State<Boolean> {
5656
}
5757
}
5858

59+
@Composable
60+
fun MatrixRoom.canPinUnpin(updateKey: Long): State<Boolean> {
61+
return produceState(initialValue = false, key1 = updateKey) {
62+
value = canUserPinUnpin(sessionId).getOrElse { false }
63+
}
64+
}
65+
5966
@Composable
6067
fun MatrixRoom.isOwnUserAdmin(): Boolean {
6168
val roomInfo by roomInfoFlow.collectAsState(initial = null)

0 commit comments

Comments
 (0)