Implemented message forwarding for media previews and media timelines (#4579)

* implemented message forwarding for media previews and media timelines

* updated tests

* pr suggestion

* fix tests

* fix tests
This commit is contained in:
Mauro
2025-10-07 14:34:14 +02:00
committed by GitHub
parent 6def8e5973
commit e7ee0af70d
42 changed files with 166 additions and 50 deletions
@@ -25,6 +25,7 @@ struct MediaEventsTimelineScreenCoordinatorParameters {
enum MediaEventsTimelineScreenCoordinatorAction {
case viewInRoomTimeline(TimelineItemIdentifier)
case displayMessageForwarding(MessageForwardingItem)
}
final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
@@ -73,9 +74,12 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
viewModel.actionsPublisher
.sink { [weak self] action in
guard let self else { return }
switch action {
case .displayMessageForwarding(let forwardingItem):
actionsSubject.send(.displayMessageForwarding(forwardingItem))
case .viewInRoomTimeline(let itemID):
self?.actionsSubject.send(.viewInRoomTimeline(itemID))
actionsSubject.send(.viewInRoomTimeline(itemID))
}
}
.store(in: &cancellables)
@@ -8,6 +8,7 @@
import SwiftUI
enum MediaEventsTimelineScreenViewModelAction {
case displayMessageForwarding(MessageForwardingItem)
case viewInRoomTimeline(TimelineItemIdentifier)
}
@@ -155,6 +155,8 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
sheetModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .displayMessageForwarding(let forwardingItem):
displayMessageForwarding(forwardingItem: forwardingItem)
case .viewInRoomTimeline(let itemID):
actionsSubject.send(.viewInRoomTimeline(itemID))
case .dismiss:
@@ -222,6 +224,8 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
viewModel.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .displayMessageForwarding(let forwardingItem):
displayMessageForwarding(forwardingItem: forwardingItem)
case .viewInRoomTimeline(let itemID):
state.bindings.mediaPreviewViewModel = nil
actionsSubject.send(.viewInRoomTimeline(itemID))
@@ -241,4 +245,13 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType
date.formatted(.dateTime.month(.wide).year())
}
}
private func displayMessageForwarding(forwardingItem: MessageForwardingItem) {
state.bindings.mediaPreviewViewModel = nil
state.bindings.mediaPreviewSheetViewModel = nil
// We need a small delay because we need to wait for the presented sheet to be fully dismissed.
DispatchQueue.main.asyncAfter(deadline: .now() + TimelineMediaPreviewViewModel.displayMessageForwardingDelay) {
self.actionsSubject.send(.displayMessageForwarding(forwardingItem))
}
}
}