Skip to content

Commit 0149007

Browse files
committed
Timeline Action : refactor how it's computed and align with iOS
1 parent 183e392 commit 0149007

File tree

21 files changed

+323
-296
lines changed

21 files changed

+323
-296
lines changed

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

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import android.os.Build
2020
import androidx.compose.runtime.Composable
2121
import androidx.compose.runtime.LaunchedEffect
2222
import androidx.compose.runtime.MutableState
23+
import androidx.compose.runtime.State
2324
import androidx.compose.runtime.collectAsState
2425
import androidx.compose.runtime.derivedStateOf
2526
import androidx.compose.runtime.getValue
@@ -131,10 +132,9 @@ class MessagesPresenter @AssistedInject constructor(
131132
val readReceiptBottomSheetState = readReceiptBottomSheetPresenter.present()
132133

133134
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
134-
val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = syncUpdateFlow.value)
135-
val userHasPermissionToRedactOwn by room.canRedactOwnAsState(updateKey = syncUpdateFlow.value)
136-
val userHasPermissionToRedactOther by room.canRedactOtherAsState(updateKey = syncUpdateFlow.value)
137-
val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = syncUpdateFlow.value)
135+
136+
val userEventPermissions by userEventPermissions(syncUpdateFlow.value)
137+
138138
val roomName: AsyncData<String> by remember {
139139
derivedStateOf { roomInfo?.name?.let { AsyncData.Success(it) } ?: AsyncData.Uninitialized }
140140
}
@@ -211,11 +211,8 @@ class MessagesPresenter @AssistedInject constructor(
211211
roomName = roomName,
212212
roomAvatar = roomAvatar,
213213
heroes = heroes,
214-
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
215-
userHasPermissionToRedactOwn = userHasPermissionToRedactOwn,
216-
userHasPermissionToRedactOther = userHasPermissionToRedactOther,
217-
userHasPermissionToSendReaction = userHasPermissionToSendReaction,
218214
composerState = composerState,
215+
userEventPermissions = userEventPermissions,
219216
voiceMessageComposerState = voiceMessageComposerState,
220217
timelineState = timelineState,
221218
typingNotificationState = typingNotificationState,
@@ -235,6 +232,24 @@ class MessagesPresenter @AssistedInject constructor(
235232
)
236233
}
237234

235+
@Composable
236+
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+
)
249+
}
250+
}
251+
}
252+
238253
private fun MatrixRoomInfo.avatarData(): AvatarData {
239254
return AvatarData(
240255
id = id.value,

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ data class MessagesState(
3737
val roomName: AsyncData<String>,
3838
val roomAvatar: AsyncData<AvatarData>,
3939
val heroes: ImmutableList<AvatarData>,
40-
val userHasPermissionToSendMessage: Boolean,
41-
val userHasPermissionToRedactOwn: Boolean,
42-
val userHasPermissionToRedactOther: Boolean,
43-
val userHasPermissionToSendReaction: Boolean,
40+
val userEventPermissions: UserEventPermissions,
4441
val composerState: MessageComposerState,
4542
val voiceMessageComposerState: VoiceMessageComposerState,
4643
val timelineState: TimelineState,

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ open class MessagesStateProvider : PreviewParameterProvider<MessagesState> {
5353
aMessagesState(),
5454
aMessagesState(hasNetworkConnection = false),
5555
aMessagesState(composerState = aMessageComposerState(showAttachmentSourcePicker = true)),
56-
aMessagesState(userHasPermissionToSendMessage = false),
56+
aMessagesState(userEventPermissions = aUserEventPermissions(canSendMessage = false)),
5757
aMessagesState(showReinvitePrompt = true),
5858
aMessagesState(
5959
roomName = AsyncData.Uninitialized,
@@ -93,10 +93,7 @@ open class MessagesStateProvider : PreviewParameterProvider<MessagesState> {
9393
fun aMessagesState(
9494
roomName: AsyncData<String> = AsyncData.Success("Room name"),
9595
roomAvatar: AsyncData<AvatarData> = AsyncData.Success(AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom)),
96-
userHasPermissionToSendMessage: Boolean = true,
97-
userHasPermissionToRedactOwn: Boolean = false,
98-
userHasPermissionToRedactOther: Boolean = false,
99-
userHasPermissionToSendReaction: Boolean = true,
96+
userEventPermissions: UserEventPermissions = aUserEventPermissions(),
10097
composerState: MessageComposerState = aMessageComposerState(
10198
textEditorState = TextEditorState.Rich(aRichTextEditorState(initialText = "Hello", initialFocus = true)),
10299
isFullScreen = false,
@@ -122,10 +119,7 @@ fun aMessagesState(
122119
roomName = roomName,
123120
roomAvatar = roomAvatar,
124121
heroes = persistentListOf(),
125-
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
126-
userHasPermissionToRedactOwn = userHasPermissionToRedactOwn,
127-
userHasPermissionToRedactOther = userHasPermissionToRedactOther,
128-
userHasPermissionToSendReaction = userHasPermissionToSendReaction,
122+
userEventPermissions = userEventPermissions,
129123
composerState = composerState,
130124
voiceMessageComposerState = voiceMessageComposerState,
131125
typingNotificationState = aTypingNotificationState(),
@@ -145,6 +139,18 @@ fun aMessagesState(
145139
eventSink = eventSink,
146140
)
147141

142+
fun aUserEventPermissions(
143+
canRedactOwn: Boolean = false,
144+
canRedactOther: Boolean = false,
145+
canSendMessage: Boolean = true,
146+
canSendReaction: Boolean = true,
147+
) = UserEventPermissions(
148+
canRedactOwn = canRedactOwn,
149+
canRedactOther = canRedactOther,
150+
canSendMessage = canSendMessage,
151+
canSendReaction = canSendReaction,
152+
)
153+
148154
fun aReactionSummaryState(
149155
target: ReactionSummaryState.Summary? = null,
150156
eventSink: (ReactionSummaryEvents) -> Unit = {}

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,7 @@ fun MessagesView(
154154
state.actionListState.eventSink(
155155
ActionListEvents.ComputeForMessage(
156156
event = event,
157-
canRedactOwn = state.userHasPermissionToRedactOwn,
158-
canRedactOther = state.userHasPermissionToRedactOther,
159-
canSendMessage = state.userHasPermissionToSendMessage,
160-
canSendReaction = state.userHasPermissionToSendReaction,
157+
userEventPermissions = state.userEventPermissions,
161158
)
162159
)
163160
}
@@ -408,7 +405,7 @@ private fun MessagesViewComposerBottomSheetContents(
408405
subcomposing: Boolean,
409406
state: MessagesState,
410407
) {
411-
if (state.userHasPermissionToSendMessage) {
408+
if (state.userEventPermissions.canSendMessage) {
412409
Column(modifier = Modifier.fillMaxWidth()) {
413410
MentionSuggestionsPickerView(
414411
modifier = Modifier
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (c) 2024 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.element.android.features.messages.impl
18+
19+
/**
20+
* Represents the permissions a user has in a room.
21+
* It's dependent of the user's power level in the room.
22+
*/
23+
data class UserEventPermissions(
24+
val canRedactOwn: Boolean,
25+
val canRedactOther: Boolean,
26+
val canSendMessage: Boolean,
27+
val canSendReaction: Boolean,
28+
)

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616

1717
package io.element.android.features.messages.impl.actionlist
1818

19+
import io.element.android.features.messages.impl.UserEventPermissions
1920
import io.element.android.features.messages.impl.timeline.model.TimelineItem
2021

2122
sealed interface ActionListEvents {
2223
data object Clear : ActionListEvents
2324
data class ComputeForMessage(
2425
val event: TimelineItem.Event,
25-
val canRedactOwn: Boolean,
26-
val canRedactOther: Boolean,
27-
val canSendMessage: Boolean,
28-
val canSendReaction: Boolean,
26+
val userEventPermissions: UserEventPermissions,
2927
) : ActionListEvents
3028
}

0 commit comments

Comments
 (0)