Skip to content

Commit

Permalink
Fix macOS timeline context menu missing the Remove item. (#2830)
Browse files Browse the repository at this point in the history
The necessary permissions were only being checked when presenting the long press menu.
  • Loading branch information
pixlwave authored May 10, 2024
1 parent ae06226 commit 178797a
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 17 deletions.
1 change: 1 addition & 0 deletions ElementX/Sources/Mocks/RoomProxyMock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ extension RoomProxyMock {
}
canUserInviteUserIDReturnValue = .success(configuration.canUserInvite)
canUserRedactOtherUserIDReturnValue = .success(false)
canUserRedactOwnUserIDReturnValue = .success(false)
canUserKickUserIDClosure = { [weak self] userID in
.success(self?.membersPublisher.value.first { $0.userID == userID }?.role ?? .user != .user)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,16 @@ class RoomScreenInteractionHandler {
self.appSettings = appSettings
self.analyticsService = analyticsService
pollInteractionHandler = PollInteractionHandler(analyticsService: analyticsService, roomProxy: roomProxy)

// Set initial values for redacting from the macOS context menu.
Task { await updatePermissions() }
}

// MARK: Timeline Item Action Menu

func displayTimelineItemActionMenu(for itemID: TimelineItemIdentifier) {
Task {
if case let .success(value) = await roomProxy.canUserRedactOther(userID: roomProxy.ownUserID) {
canCurrentUserRedactOthers = value
} else {
canCurrentUserRedactOthers = false
}

if case let .success(value) = await roomProxy.canUserRedactOwn(userID: roomProxy.ownUserID) {
canCurrentUserRedactSelf = value
} else {
canCurrentUserRedactSelf = false
}
await updatePermissions()

guard let timelineItem = timelineController.timelineItems.firstUsingStableID(itemID),
let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol else {
Expand Down Expand Up @@ -607,6 +600,20 @@ class RoomScreenInteractionHandler {

// MARK: - Private

private func updatePermissions() async {
if case let .success(value) = await roomProxy.canUserRedactOther(userID: roomProxy.ownUserID) {
canCurrentUserRedactOthers = value
} else {
canCurrentUserRedactOthers = false
}

if case let .success(value) = await roomProxy.canUserRedactOwn(userID: roomProxy.ownUserID) {
canCurrentUserRedactSelf = value
} else {
canCurrentUserRedactSelf = false
}
}

private func canRedactItem(_ item: EventBasedTimelineItemProtocol) -> Bool {
item.isOutgoing ? canCurrentUserRedactSelf : canCurrentUserRedactOthers && !roomProxy.isDirect
}
Expand Down
4 changes: 2 additions & 2 deletions ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -814,7 +814,7 @@ extension RoomScreenViewModel {
}

private struct RoomContextKey: EnvironmentKey {
@MainActor static let defaultValue = RoomScreenViewModel.mock.context
@MainActor static let defaultValue: RoomScreenViewModel.Context? = nil
}

private struct FocussedEventID: EnvironmentKey {
Expand All @@ -823,7 +823,7 @@ private struct FocussedEventID: EnvironmentKey {

extension EnvironmentValues {
/// Used to access and inject the room context without observing it
var roomContext: RoomScreenViewModel.Context {
var roomContext: RoomScreenViewModel.Context? {
get { self[RoomContextKey.self] }
set { self[RoomContextKey.self] = newValue }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import SwiftUI

struct RoomTimelineItemView: View {
@Environment(\.roomContext) var context: RoomScreenViewModel.Context
@Environment(\.roomContext) var context
@ObservedObject var viewState: RoomTimelineItemViewState

var body: some View {
Expand All @@ -25,10 +25,10 @@ struct RoomTimelineItemView: View {
.animation(.elementDefault, value: viewState.type)
.environment(\.timelineGroupStyle, viewState.groupStyle)
.onAppear {
context.send(viewAction: .itemAppeared(itemID: viewState.identifier))
context?.send(viewAction: .itemAppeared(itemID: viewState.identifier))
}
.onDisappear {
context.send(viewAction: .itemDisappeared(itemID: viewState.identifier))
context?.send(viewAction: .itemDisappeared(itemID: viewState.identifier))
}
}

Expand Down Expand Up @@ -73,7 +73,7 @@ struct RoomTimelineItemView: View {
case .poll(let item):
PollRoomTimelineView(timelineItem: item)
case .voice(let item):
VoiceMessageRoomTimelineView(timelineItem: item, playerState: context.viewState.audioPlayerStateProvider?(item.id) ?? AudioPlayerState(id: .timelineItemIdentifier(item.id), duration: 0))
VoiceMessageRoomTimelineView(timelineItem: item, playerState: context?.viewState.audioPlayerStateProvider?(item.id) ?? AudioPlayerState(id: .timelineItemIdentifier(item.id), duration: 0))
case .callInvite(let item):
CallInviteRoomTimelineView(timelineItem: item)
}
Expand Down

0 comments on commit 178797a

Please sign in to comment.