Fixes #4222 - Hide timeline item actions that the user's power level does not allow

This commit is contained in:
Stefan Ceriu
2025-06-18 17:02:49 +03:00
committed by Stefan Ceriu
parent f04f3e74a7
commit ccb0fc7de0
7 changed files with 14 additions and 2 deletions
@@ -140,6 +140,7 @@ class TimelineMediaPreviewViewModel: TimelineMediaPreviewViewModelType {
state.currentItemActions = switch state.currentItem {
case .media(let mediaItem):
TimelineItemMenuActionProvider(timelineItem: mediaItem.timelineItem,
canCurrentUserSendMessage: timelineContext.viewState.canCurrentUserSendMessage,
canCurrentUserRedactSelf: timelineContext.viewState.canCurrentUserRedactSelf,
canCurrentUserRedactOthers: timelineContext.viewState.canCurrentUserRedactOthers,
canCurrentUserPin: timelineContext.viewState.canCurrentUserPin,
@@ -101,6 +101,7 @@ struct TimelineViewState: BindableState {
var timelineState: TimelineState // check the doc before changing this
var ownUserID: String
var canCurrentUserSendMessage = false
var canCurrentUserRedactOthers = false
var canCurrentUserRedactSelf = false
var canCurrentUserPin = false
@@ -404,6 +404,12 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
}
private func updatePermissions() async {
if case let .success(value) = await roomProxy.canUser(userID: roomProxy.ownUserID, sendMessage: .roomMessage) {
state.canCurrentUserSendMessage = value
} else {
state.canCurrentUserSendMessage = false
}
if case let .success(value) = await roomProxy.canUserRedactOther(userID: roomProxy.ownUserID) {
state.canCurrentUserRedactOthers = value
} else {
@@ -342,6 +342,7 @@ struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview {
deliveryStatus: TimelineItemDeliveryStatus? = nil) -> (EventBasedTimelineItemProtocol, TimelineItemMenuActions)! {
guard var item = makeItem(itemType: itemType) else { return nil }
let provider = TimelineItemMenuActionProvider(timelineItem: item,
canCurrentUserSendMessage: true,
canCurrentUserRedactSelf: true,
canCurrentUserRedactOthers: false,
canCurrentUserPin: true,
@@ -10,6 +10,7 @@ import Foundation
@MainActor
struct TimelineItemMenuActionProvider {
let timelineItem: RoomTimelineItemProtocol
let canCurrentUserSendMessage: Bool
let canCurrentUserRedactSelf: Bool
let canCurrentUserRedactOthers: Bool
let canCurrentUserPin: Bool
@@ -47,7 +48,7 @@ struct TimelineItemMenuActionProvider {
actions.append(.endPoll(pollStartID: eventID))
}
if item.canBeRepliedTo {
if item.canBeRepliedTo, canCurrentUserSendMessage {
if let messageItem = item as? EventBasedMessageTimelineItemProtocol {
actions.append(.reply(isThread: messageItem.properties.isThreaded))
} else {
@@ -63,7 +64,7 @@ struct TimelineItemMenuActionProvider {
actions.append(.forward(itemID: item.id))
}
if item.isEditable {
if item.isEditable, canCurrentUserSendMessage {
if item.supportsMediaCaption {
if item.hasMediaCaption {
actions.append(.editCaption)
@@ -150,6 +150,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
}
.contextMenu {
let provider = TimelineItemMenuActionProvider(timelineItem: timelineItem,
canCurrentUserSendMessage: context.viewState.canCurrentUserSendMessage,
canCurrentUserRedactSelf: context.viewState.canCurrentUserRedactSelf,
canCurrentUserRedactOthers: context.viewState.canCurrentUserRedactOthers,
canCurrentUserPin: context.viewState.canCurrentUserPin,
@@ -27,6 +27,7 @@ struct TimelineView: View {
.sheet(item: $timelineContext.debugInfo) { TimelineItemDebugView(info: $0) }
.sheet(item: $timelineContext.actionMenuInfo) { info in
let actions = TimelineItemMenuActionProvider(timelineItem: info.item,
canCurrentUserSendMessage: timelineContext.viewState.canCurrentUserSendMessage,
canCurrentUserRedactSelf: timelineContext.viewState.canCurrentUserRedactSelf,
canCurrentUserRedactOthers: timelineContext.viewState.canCurrentUserRedactOthers,
canCurrentUserPin: timelineContext.viewState.canCurrentUserPin,