MediaTimelinePreviewDetails can now be opened by long pressing in the media timeline (#4474)

* presenting media actions from the media timeline

* implemented view in timeline and fixed an issue that made dark mode being when trying to delete the file

* pr suggestions
This commit is contained in:
Mauro
2025-09-05 15:30:36 +02:00
committed by GitHub
parent 5be7967f94
commit eee11ed67c
12 changed files with 148 additions and 48 deletions
@@ -75,9 +75,12 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
.store(in: &cancellables)
mediaTimelineViewModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .displayMediaPreview(let mediaPreviewViewModel):
self?.displayMediaPreview(mediaPreviewViewModel)
displayMediaPreview(mediaPreviewViewModel)
case .displayMediaDetails(item: let item):
displayMediaPreviewSheet(for: item)
case .displayEmojiPicker, .displayReportContent, .displayCameraPicker, .displayMediaPicker,
.displayDocumentPicker, .displayLocationPicker, .displayPollForm, .displayMediaUploadPreviewScreen,
.displaySenderDetails, .displayMessageForwarding, .displayLocation, .displayResolveSendFailure,
@@ -97,9 +100,12 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
.store(in: &cancellables)
filesTimelineViewModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .displayMediaPreview(let mediaPreviewViewModel):
self?.displayMediaPreview(mediaPreviewViewModel)
displayMediaPreview(mediaPreviewViewModel)
case .displayMediaDetails(item: let item):
displayMediaPreviewSheet(for: item)
case .displayEmojiPicker, .displayReportContent, .displayCameraPicker, .displayMediaPicker,
.displayDocumentPicker, .displayLocationPicker, .displayPollForm, .displayMediaUploadPreviewScreen,
.displaySenderDetails, .displayMessageForwarding, .displayLocation, .displayResolveSendFailure,
@@ -127,6 +133,8 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
isOldestItemVisible = false
case .tappedItem(let item):
activeTimelineViewModel.context.send(viewAction: .mediaTapped(itemID: item.identifier))
case .longPressedItem(let item):
activeTimelineViewModel.context.send(viewAction: .displayTimelineItemMenu(itemID: item.identifier))
}
}
@@ -137,6 +145,29 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
// MARK: - Private
private func displayMediaPreviewSheet(for item: EventBasedMessageTimelineItemProtocol) {
let sheetModel = TimelineMediaPreviewViewModel(initialItem: item,
timelineViewModel: activeTimelineViewModel,
mediaProvider: mediaProvider,
photoLibraryManager: PhotoLibraryManager(),
userIndicatorController: userIndicatorController,
appMediator: appMediator)
sheetModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .viewInRoomTimeline(let itemID):
actionsSubject.send(.viewInRoomTimeline(itemID))
case .dismiss:
state.bindings.mediaPreviewSheetViewModel = nil
}
}
.store(in: &cancellables)
// Triggers a download of the item so that can be shared/saved
sheetModel.context.send(viewAction: .updateCurrentItem(sheetModel.state.currentItem))
state.bindings.mediaPreviewSheetViewModel = sheetModel
}
private func updateWithTimelineViewState(_ timelineViewState: TimelineViewState) {
var newGroups = [MediaEventsTimelineGroup]()
var currentItems = [RoomTimelineItemViewState]()