From 4fe21b67c0bccedccf57b40bfc9a3f709be4a68a Mon Sep 17 00:00:00 2001 From: Doug Date: Wed, 5 Feb 2025 12:25:28 +0000 Subject: [PATCH] Make sure to clean-up any previews when the coordinator is done. --- .../MediaEventsTimelineScreenCoordinator.swift | 4 ++++ .../MediaEventsTimelineScreenViewModel.swift | 5 +++++ .../MediaEventsTimelineScreenViewModelProtocol.swift | 2 ++ .../PinnedEventsTimelineScreenCoordinator.swift | 4 ++++ .../PinnedEventsTimelineScreenViewModel.swift | 5 +++++ .../PinnedEventsTimelineScreenViewModelProtocol.swift | 2 ++ .../Sources/Screens/RoomScreen/RoomScreenCoordinator.swift | 2 +- .../Sources/Screens/RoomScreen/RoomScreenViewModel.swift | 5 +++++ .../Screens/RoomScreen/RoomScreenViewModelProtocol.swift | 2 ++ ElementX/Sources/Screens/Timeline/TimelineViewModel.swift | 5 ----- .../Sources/Screens/Timeline/TimelineViewModelProtocol.swift | 2 +- 11 files changed, 31 insertions(+), 7 deletions(-) diff --git a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenCoordinator.swift b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenCoordinator.swift index efcdfb6c2d..ed7e47744f 100644 --- a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenCoordinator.swift +++ b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenCoordinator.swift @@ -79,6 +79,10 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol { .store(in: &cancellables) } + func stop() { + viewModel.stop() + } + func toPresentable() -> AnyView { AnyView(MediaEventsTimelineScreen(context: viewModel.context)) } diff --git a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModel.swift b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModel.swift index ac3c47e361..24323bc2b9 100644 --- a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModel.swift +++ b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModel.swift @@ -120,6 +120,11 @@ class MediaEventsTimelineScreenViewModel: MediaEventsTimelineScreenViewModelType } } + func stop() { + // Work around QLPreviewController dismissal issues, see the InteractiveQuickLookModifier. + state.bindings.mediaPreviewViewModel = nil + } + // MARK: - Private private func updateWithTimelineViewState(_ timelineViewState: TimelineViewState) { diff --git a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModelProtocol.swift b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModelProtocol.swift index 990f97b091..e024f2a2af 100644 --- a/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModelProtocol.swift +++ b/ElementX/Sources/Screens/MediaEventsTimelineScreen/MediaEventsTimelineScreenViewModelProtocol.swift @@ -11,4 +11,6 @@ import Combine protocol MediaEventsTimelineScreenViewModelProtocol { var actionsPublisher: AnyPublisher { get } var context: MediaEventsTimelineScreenViewModelType.Context { get } + + func stop() } diff --git a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenCoordinator.swift b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenCoordinator.swift index 68122d9a38..b3d7c9c180 100644 --- a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenCoordinator.swift +++ b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenCoordinator.swift @@ -93,6 +93,10 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol { } .store(in: &cancellables) } + + func stop() { + viewModel.stop() + } func toPresentable() -> AnyView { AnyView(PinnedEventsTimelineScreen(context: viewModel.context, timelineContext: timelineViewModel.context)) diff --git a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModel.swift b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModel.swift index d9fa9993a0..82f796a006 100644 --- a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModel.swift +++ b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModel.swift @@ -35,6 +35,11 @@ class PinnedEventsTimelineScreenViewModel: PinnedEventsTimelineScreenViewModelTy } } + func stop() { + // Work around QLPreviewController dismissal issues, see the InteractiveQuickLookModifier. + state.bindings.mediaPreviewViewModel = nil + } + func displayMediaPreview(_ mediaPreviewViewModel: TimelineMediaPreviewViewModel) { mediaPreviewViewModel.actions.sink { [weak self] action in switch action { diff --git a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModelProtocol.swift b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModelProtocol.swift index 3e19732e27..ccf9906fd8 100644 --- a/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModelProtocol.swift +++ b/ElementX/Sources/Screens/PinnedEventsTimelineScreen/PinnedEventsTimelineScreenViewModelProtocol.swift @@ -12,5 +12,7 @@ protocol PinnedEventsTimelineScreenViewModelProtocol { var actionsPublisher: AnyPublisher { get } var context: PinnedEventsTimelineScreenViewModelType.Context { get } + func stop() + func displayMediaPreview(_ mediaPreviewViewModel: TimelineMediaPreviewViewModel) } diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift index 638b096bb2..7af774f779 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift @@ -201,7 +201,7 @@ final class RoomScreenCoordinator: CoordinatorProtocol { func stop() { composerViewModel.saveDraft() - timelineViewModel.stop() + roomViewModel.stop() } func toPresentable() -> AnyView { diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 1cfebaaea6..d8e09bd37a 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -115,6 +115,11 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } } + func stop() { + // Work around QLPreviewController dismissal issues, see the InteractiveQuickLookModifier. + state.bindings.mediaPreviewViewModel = nil + } + func timelineHasScrolled(direction: ScrollDirection) { state.lastScrollDirection = direction } diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModelProtocol.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModelProtocol.swift index 5ec33f7d47..c0b50248d0 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModelProtocol.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModelProtocol.swift @@ -12,6 +12,8 @@ protocol RoomScreenViewModelProtocol { var actions: AnyPublisher { get } var context: RoomScreenViewModel.Context { get } + func stop() + func timelineHasScrolled(direction: ScrollDirection) func setSelectedPinnedEventID(_ eventID: String) func displayMediaPreview(_ mediaPreviewViewModel: TimelineMediaPreviewViewModel) diff --git a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift index 60a154ad9b..1fc2c0ab69 100644 --- a/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift +++ b/ElementX/Sources/Screens/Timeline/TimelineViewModel.swift @@ -125,11 +125,6 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol { // MARK: - Public - func stop() { - // Work around QLPreviewController dismissal issues, see the InteractiveQuickLookModifier. -// state.bindings.mediaPreviewViewModel = nil - } - override func process(viewAction: TimelineViewAction) { switch viewAction { case .itemAppeared(let id): diff --git a/ElementX/Sources/Screens/Timeline/TimelineViewModelProtocol.swift b/ElementX/Sources/Screens/Timeline/TimelineViewModelProtocol.swift index f38181f6ab..eecee50a25 100644 --- a/ElementX/Sources/Screens/Timeline/TimelineViewModelProtocol.swift +++ b/ElementX/Sources/Screens/Timeline/TimelineViewModelProtocol.swift @@ -13,8 +13,8 @@ import SwiftUI protocol TimelineViewModelProtocol { var actions: AnyPublisher { get } var context: TimelineViewModel.Context { get } + func process(composerAction: ComposerToolbarViewModelAction) /// Updates the timeline to show and highlight the item with the corresponding event ID. func focusOnEvent(eventID: String) async - func stop() }