Pinning items Feature Flag (#3063)

This commit is contained in:
Mauro
2024-07-18 18:28:30 +02:00
committed by GitHub
parent 7fbdc2c20f
commit d437e1f3ed
24 changed files with 66 additions and 21 deletions
@@ -171,6 +171,9 @@ class RoomScreenInteractionHandler {
Task { await roomProxy.timeline.toggleReaction(key, to: eventID) }
case .endPoll(let pollStartID):
endPoll(pollStartID: pollStartID)
case .pin:
// TODO: Implement the pin action
break
}
if action.switchToDefaultComposer {
@@ -163,6 +163,7 @@ struct RoomScreenViewState: BindableState {
var ownUserID: String
var canCurrentUserRedactOthers = false
var canCurrentUserRedactSelf = false
var canCurrentUserPin = false
var isViewSourceEnabled: Bool
var canJoinCall = false
@@ -359,6 +359,13 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
} else {
state.canCurrentUserRedactSelf = false
}
if appSettings.pinningEnabled,
case let .success(value) = await roomProxy.canUser(userID: roomProxy.ownUserID, sendStateEvent: .roomPinnedEvents) {
state.canCurrentUserPin = value
} else {
state.canCurrentUserPin = false
}
}
private func setupSubscriptions() {
@@ -183,7 +183,7 @@ struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview {
@ViewBuilder
static var testView: some View {
if let item = RoomTimelineItemFixtures.singleMessageChunk.first as? EventBasedTimelineItemProtocol,
let actions = TimelineItemMenuActions(isReactable: true, actions: [.copy, .edit, .reply(isThread: false), .redact], debugActions: [.viewSource]) {
let actions = TimelineItemMenuActions(isReactable: true, actions: [.copy, .edit, .reply(isThread: false), .pin, .redact], debugActions: [.viewSource]) {
TimelineItemMenu(item: item, actions: actions)
.environmentObject(viewModel.context)
}
@@ -61,6 +61,7 @@ enum TimelineItemMenuAction: Identifiable, Hashable {
case react
case toggleReaction(key: String)
case endPoll(pollStartID: String)
case pin
var id: Self { self }
@@ -133,6 +134,8 @@ enum TimelineItemMenuAction: Identifiable, Hashable {
Label(L10n.actionReact, icon: \.reactionAdd)
case .endPoll:
Label(L10n.actionEndPoll, icon: \.pollsEnd)
case .pin:
Label(L10n.Action.pin, icon: \.pin)
}
}
}
@@ -20,6 +20,7 @@ struct TimelineItemMenuActionProvider {
let timelineItem: RoomTimelineItemProtocol
let canCurrentUserRedactSelf: Bool
let canCurrentUserRedactOthers: Bool
let canCurrentUserPin: Bool
let isDM: Bool
let isViewSourceEnabled: Bool
@@ -64,6 +65,11 @@ struct TimelineItemMenuActionProvider {
if item.isForwardable {
actions.append(.forward(itemID: item.id))
}
if canCurrentUserPin {
// TODO: If the event is already pinned use the unpinned action
actions.append(.pin)
}
if item.isEditable {
actions.append(.edit)
@@ -60,6 +60,7 @@ struct RoomScreen: View {
let actions = TimelineItemMenuActionProvider(timelineItem: info.item,
canCurrentUserRedactSelf: context.viewState.canCurrentUserRedactSelf,
canCurrentUserRedactOthers: context.viewState.canCurrentUserRedactOthers,
canCurrentUserPin: context.viewState.canCurrentUserPin,
isDM: context.viewState.isEncryptedOneToOneRoom,
isViewSourceEnabled: context.viewState.isViewSourceEnabled).makeActions()
if let actions {
@@ -146,6 +146,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
let provider = TimelineItemMenuActionProvider(timelineItem: timelineItem,
canCurrentUserRedactSelf: context.viewState.canCurrentUserRedactSelf,
canCurrentUserRedactOthers: context.viewState.canCurrentUserRedactOthers,
canCurrentUserPin: context.viewState.canCurrentUserPin,
isDM: context.viewState.isEncryptedOneToOneRoom,
isViewSourceEnabled: context.viewState.isViewSourceEnabled)
TimelineItemMacContextMenu(item: timelineItem, actionProvider: provider) { action in