From ac20ff0fc335840c1a694a5ef88d9b291d7a3e15 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 22 May 2026 10:12:08 +0300 Subject: [PATCH] Forward current composer text to the media upload preview screen as captions --- .../RoomFlowCoordinator.swift | 33 ++++++++++--------- .../RoomFlowCoordinatorStateMachine.swift | 32 +++++++++--------- .../MediaUploadPreviewScreenCoordinator.swift | 2 ++ .../MediaUploadPreviewScreenModels.swift | 4 +-- .../MediaUploadPreviewScreenViewModel.swift | 4 ++- .../View/MediaUploadPreviewScreen.swift | 1 + .../RoomScreen/RoomScreenCoordinator.swift | 16 +++++---- .../ThreadTimelineScreenCoordinator.swift | 18 ++++++---- ...diaUploadPreviewScreenViewModelTests.swift | 1 + 9 files changed, 64 insertions(+), 47 deletions(-) diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift index d6736f97b..b0858a71e 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinator.swift @@ -426,11 +426,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { case (_, .presentReportContent, .reportContent(let itemID, let senderID, _)): presentReportContent(for: itemID, from: senderID) - case (_, .presentMediaUploadPicker, .mediaUploadPicker(let mode, _)): + case (_, .presentMediaUploadPicker, .mediaUploadPicker(let mode, let caption, _)): guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else { fatalError("Missing required TimelineController") } - presentMediaUploadPickerWithMode(mode, timelineController: timelineController, animated: animated) + presentMediaUploadPickerWithMode(mode, caption: caption, timelineController: timelineController, animated: animated) case (_, .presentEmojiPicker, .emojiPicker(let itemID, let selectedEmoji, _)): guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else { @@ -537,12 +537,12 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } presentPollForm(mode: mode, timelineController: timelineController) - case (_, .presentMediaUploadPreview, .mediaUploadPreview(let mediaURLs, _)): + case (_, .presentMediaUploadPreview, .mediaUploadPreview(let mediaURLs, let caption, _)): guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else { fatalError("Missing required TimelineController") } - presentMediaUploadPreviewScreen(for: mediaURLs, timelineController: timelineController, animated: animated) + presentMediaUploadPreviewScreen(for: mediaURLs, caption: caption, timelineController: timelineController, animated: animated) case (_, .presentInviteUsersScreen(let flow), .inviteUsersScreen): presentInviteUsersScreen(flow: flow) @@ -600,7 +600,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { case .eventFocus(let focusedEvent): roomScreenCoordinator?.focusOnEvent(focusedEvent) case .share(.mediaFiles(_, let mediaFiles)): - stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaFiles.map(\.url)), + stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaFiles.map(\.url), caption: nil), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) case .share(.text(_, let text)): roomScreenCoordinator?.shareText(text) @@ -645,7 +645,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { switch presentationAction { case .share(.mediaFiles(_, let mediaFiles)): - stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaFiles.map(\.url)), + stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaFiles.map(\.url), caption: nil), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) case .thread(let rootEventID, let focusEvent): stateMachine.tryEvent(.presentThread(threadRootEventID: rootEventID, focusEventID: focusEvent?.eventID)) @@ -702,11 +702,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { case .presentReportContent(let itemID, let senderID): stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID)) - case .presentMediaUploadPicker(let mode): - stateMachine.tryEvent(.presentMediaUploadPicker(mode: mode), + case .presentMediaUploadPicker(let mode, let caption): + stateMachine.tryEvent(.presentMediaUploadPicker(mode: mode, caption: caption), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) - case .presentMediaUploadPreviewScreen(let url): - stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: url), + case .presentMediaUploadPreviewScreen(let url, let caption): + stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: url, caption: caption), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) case .presentEmojiPicker(let itemID, let selectedEmojis): stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis), @@ -814,11 +814,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { switch action { case .presentReportContent(let itemID, let senderID): stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID)) - case .presentMediaUploadPicker(let mode): - stateMachine.tryEvent(.presentMediaUploadPicker(mode: mode), + case .presentMediaUploadPicker(let mode, let caption): + stateMachine.tryEvent(.presentMediaUploadPicker(mode: mode, caption: caption), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) - case .presentMediaUploadPreviewScreen(let mediaURLs): - stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaURLs), + case .presentMediaUploadPreviewScreen(let mediaURLs, let caption): + stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: mediaURLs, caption: caption), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) case .presentLocationPicker: stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker(shouldShowLiveLocationOption: false)), @@ -1079,6 +1079,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } private func presentMediaUploadPickerWithMode(_ mode: MediaPickerScreenMode, + caption: NSAttributedString, timelineController: TimelineControllerProtocol, animated: Bool) { let stackCoordinator = NavigationStackCoordinator() @@ -1093,7 +1094,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { case .cancel: navigationStackCoordinator.setSheetCoordinator(nil) case .selectedMediaAtURLs(let urls): - stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: urls), + stateMachine.tryEvent(.presentMediaUploadPreview(mediaURLs: urls, caption: caption), userInfo: EventUserInfo(animated: animated, timelineController: timelineController)) } } @@ -1108,6 +1109,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } private func presentMediaUploadPreviewScreen(for mediaURLs: [URL], + caption: NSAttributedString?, timelineController: TimelineControllerProtocol, animated: Bool) { let stackCoordinator = NavigationStackCoordinator() @@ -1119,6 +1121,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol { } let parameters = MediaUploadPreviewScreenCoordinatorParameters(mediaURLs: mediaURLs, + caption: caption, title: title, isRoomEncrypted: roomProxy.infoPublisher.value.isEncrypted, shouldShowCaptionWarning: flowParameters.appSettings.shouldShowMediaCaptionWarning, diff --git a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinatorStateMachine.swift b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinatorStateMachine.swift index 272fbbf68..e9d17eb48 100644 --- a/ElementX/Sources/FlowCoordinators/RoomFlowCoordinatorStateMachine.swift +++ b/ElementX/Sources/FlowCoordinators/RoomFlowCoordinatorStateMachine.swift @@ -66,8 +66,8 @@ extension RoomFlowCoordinator { case notificationSettings case globalNotificationSettings case inviteUsersScreen(flow: InviteUsersFlow, previousState: State) - case mediaUploadPicker(mode: MediaPickerScreenMode, previousState: State) - case mediaUploadPreview(mediaURLs: [URL], previousState: State) + case mediaUploadPicker(mode: MediaPickerScreenMode, caption: NSAttributedString, previousState: State) + case mediaUploadPreview(mediaURLs: [URL], caption: NSAttributedString?, previousState: State) case emojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set, previousState: State) case mapNavigator(previousState: State) case messageForwarding(forwardingItem: MessageForwardingItem, previousState: State) @@ -139,10 +139,10 @@ extension RoomFlowCoordinator { case presentInviteUsersScreen(flow: InviteUsersFlow) case dismissInviteUsersScreen - case presentMediaUploadPicker(mode: MediaPickerScreenMode) + case presentMediaUploadPicker(mode: MediaPickerScreenMode, caption: NSAttributedString) case dismissMediaUploadPicker - case presentMediaUploadPreview(mediaURLs: [URL]) + case presentMediaUploadPreview(mediaURLs: [URL], caption: NSAttributedString?) case dismissMediaUploadPreview case presentEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set) @@ -210,11 +210,11 @@ extension RoomFlowCoordinator { case (.room, .presentReportContent(let itemID, let senderID)): return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState) - case (.room, .presentMediaUploadPicker(let mode)): - return .mediaUploadPicker(mode: mode, previousState: fromState) + case (.room, .presentMediaUploadPicker(let mode, let caption)): + return .mediaUploadPicker(mode: mode, caption: caption, previousState: fromState) - case (.room, .presentMediaUploadPreview(let mediaURLs)): - return .mediaUploadPreview(mediaURLs: mediaURLs, previousState: fromState) + case (.room, .presentMediaUploadPreview(let mediaURLs, let caption)): + return .mediaUploadPreview(mediaURLs: mediaURLs, caption: caption, previousState: fromState) case (.room, .presentEmojiPicker(let itemID, let selectedEmoji)): return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState) @@ -259,11 +259,11 @@ extension RoomFlowCoordinator { case (.thread, .presentReportContent(let itemID, let senderID)): return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState) - case (.thread, .presentMediaUploadPicker(let mode)): - return .mediaUploadPicker(mode: mode, previousState: fromState) + case (.thread, .presentMediaUploadPicker(let mode, let caption)): + return .mediaUploadPicker(mode: mode, caption: caption, previousState: fromState) - case (.thread, .presentMediaUploadPreview(let mediaURLs)): - return .mediaUploadPreview(mediaURLs: mediaURLs, previousState: fromState) + case (.thread, .presentMediaUploadPreview(let mediaURLs, let caption)): + return .mediaUploadPreview(mediaURLs: mediaURLs, caption: caption, previousState: fromState) case (.thread, .presentEmojiPicker(let itemID, let selectedEmoji)): return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState) @@ -282,7 +282,7 @@ extension RoomFlowCoordinator { // Room + Thread - case (.mediaUploadPicker(_, let previousState), .dismissMediaUploadPicker): + case (.mediaUploadPicker(_, _, let previousState), .dismissMediaUploadPicker): return previousState case (.emojiPicker(_, _, let previouState), .dismissEmojiPicker): @@ -388,7 +388,7 @@ extension RoomFlowCoordinator { case (.knockRequestsList(let previousState), .dismissKnockRequestsListScreen): return previousState - case (.mediaUploadPreview(_, let previousState), .dismissMediaUploadPreview): + case (.mediaUploadPreview(_, _, let previousState), .dismissMediaUploadPreview): return previousState case (.notificationSettings, .presentGlobalNotificationSettingsScreen): @@ -401,8 +401,8 @@ extension RoomFlowCoordinator { case (.pollsHistoryForm, .dismissPollForm): return .pollsHistory - case (.mediaUploadPicker(_, let previousMediaUploadPickerState), .presentMediaUploadPreview(let mediaURLs)): - return .mediaUploadPreview(mediaURLs: mediaURLs, previousState: previousMediaUploadPickerState) + case (.mediaUploadPicker(_, _, let previousMediaUploadPickerState), .presentMediaUploadPreview(let mediaURLs, let caption)): + return .mediaUploadPreview(mediaURLs: mediaURLs, caption: caption, previousState: previousMediaUploadPickerState) case (_, .presentInviteUsersScreen(let flow)): return .inviteUsersScreen(flow: flow, previousState: fromState) diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift index 584feab32..9550b225b 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenCoordinator.swift @@ -11,6 +11,7 @@ import SwiftUI struct MediaUploadPreviewScreenCoordinatorParameters { let mediaURLs: [URL] + let caption: NSAttributedString? let title: String? let isRoomEncrypted: Bool let shouldShowCaptionWarning: Bool @@ -35,6 +36,7 @@ final class MediaUploadPreviewScreenCoordinator: CoordinatorProtocol { init(parameters: MediaUploadPreviewScreenCoordinatorParameters) { viewModel = MediaUploadPreviewScreenViewModel(mediaURLs: parameters.mediaURLs, + caption: parameters.caption, title: parameters.title, isRoomEncrypted: parameters.isRoomEncrypted, shouldShowCaptionWarning: parameters.shouldShowCaptionWarning, diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenModels.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenModels.swift index 51079ef9d..92e5ba9c3 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenModels.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenModels.swift @@ -22,11 +22,11 @@ struct MediaUploadPreviewScreenViewState: BindableState { var mediaEditVersion = 0 - var bindings = MediaUploadPreviewScreenBindings() + var bindings: MediaUploadPreviewScreenBindings } struct MediaUploadPreviewScreenBindings: BindableState { - var caption = NSAttributedString() + var caption: NSAttributedString var presendCallback: (() -> Void)? var selectedRange = NSRange(location: 0, length: 0) diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift index d39775914..e0ae5f39a 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/MediaUploadPreviewScreenViewModel.swift @@ -30,6 +30,7 @@ class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType, } init(mediaURLs: [URL], + caption: NSAttributedString?, title: String?, isRoomEncrypted: Bool, shouldShowCaptionWarning: Bool, @@ -49,7 +50,8 @@ class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType, super.init(initialViewState: MediaUploadPreviewScreenViewState(mediaURLs: mediaURLs, title: title, shouldShowCaptionWarning: shouldShowCaptionWarning, - isRoomEncrypted: isRoomEncrypted)) + isRoomEncrypted: isRoomEncrypted, + bindings: .init(caption: caption ?? NSAttributedString()))) } override func process(viewAction: MediaUploadPreviewScreenViewAction) { diff --git a/ElementX/Sources/Screens/MediaUploadPreviewScreen/View/MediaUploadPreviewScreen.swift b/ElementX/Sources/Screens/MediaUploadPreviewScreen/View/MediaUploadPreviewScreen.swift index 205e5ac9a..60edb4cdb 100644 --- a/ElementX/Sources/Screens/MediaUploadPreviewScreen/View/MediaUploadPreviewScreen.swift +++ b/ElementX/Sources/Screens/MediaUploadPreviewScreen/View/MediaUploadPreviewScreen.swift @@ -367,6 +367,7 @@ struct MediaUploadPreviewScreen_Previews: PreviewProvider, TestablePreview { static let testURL = Bundle.main.url(forResource: "AppIcon60x60@2x", withExtension: "png") static let viewModel = MediaUploadPreviewScreenViewModel(mediaURLs: [snapshotURL], + caption: nil, title: "App Icon.png", isRoomEncrypted: true, shouldShowCaptionWarning: true, diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift index 47caa6db4..d6929c0e1 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenCoordinator.swift @@ -34,8 +34,8 @@ struct RoomScreenCoordinatorParameters { enum RoomScreenCoordinatorAction { case presentReportContent(itemID: TimelineItemIdentifier, senderID: String) - case presentMediaUploadPicker(mode: MediaPickerScreenMode) - case presentMediaUploadPreviewScreen(mediaURLs: [URL]) + case presentMediaUploadPicker(mode: MediaPickerScreenMode, caption: NSAttributedString) + case presentMediaUploadPreviewScreen(mediaURLs: [URL], caption: NSAttributedString) case presentRoomDetails case presentLocationPicker case presentPollForm(mode: PollFormMode) @@ -122,11 +122,14 @@ final class RoomScreenCoordinator: CoordinatorProtocol { case .displayReportContent(let itemID, let senderID): actionsSubject.send(.presentReportContent(itemID: itemID, senderID: senderID)) case .displayCameraPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .camera, selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .camera, selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayMediaPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .photoLibrary, selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .photoLibrary, selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayDocumentPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .documents(), selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .documents(), selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayMediaPreview(let mediaPreviewViewModel): roomViewModel.displayMediaPreview(mediaPreviewViewModel) case .displayLocationPicker: @@ -134,7 +137,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol { case .displayPollForm(let mode): actionsSubject.send(.presentPollForm(mode: mode)) case .displayMediaUploadPreviewScreen(let mediaURLs): - actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs)) + actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs, + caption: composerViewModel.context.plainComposerText)) case .displaySenderDetails(userID: let userID): actionsSubject.send(.presentRoomMemberDetails(userID: userID)) case .displayMessageForwarding(let forwardingItem): diff --git a/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenCoordinator.swift b/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenCoordinator.swift index 2bcdcff07..6dd68658f 100644 --- a/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenCoordinator.swift +++ b/ElementX/Sources/Screens/ThreadTimelineScreen/ThreadTimelineScreenCoordinator.swift @@ -30,8 +30,8 @@ struct ThreadTimelineScreenCoordinatorParameters { enum ThreadTimelineScreenCoordinatorAction { case presentReportContent(itemID: TimelineItemIdentifier, senderID: String) - case presentMediaUploadPicker(mode: MediaPickerScreenMode) - case presentMediaUploadPreviewScreen(mediaURLs: [URL]) + case presentMediaUploadPicker(mode: MediaPickerScreenMode, caption: NSAttributedString) + case presentMediaUploadPreviewScreen(mediaURLs: [URL], caption: NSAttributedString) case presentLocationPicker case presentLocationViewer(StaticLocationData) case presentLiveLocationViewer(sender: TimelineItemSender, initialLiveLocationShare: LiveLocationShare) @@ -103,18 +103,21 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol { timelineViewModel.actions .sink { [weak self] action in guard let self else { return } - + switch action { case .displayEmojiPicker(let itemID, let selectedEmojis): actionsSubject.send(.presentEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis)) case .displayReportContent(let itemID, let senderID): actionsSubject.send(.presentReportContent(itemID: itemID, senderID: senderID)) case .displayCameraPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .camera, selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .camera, selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayMediaPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .photoLibrary, selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .photoLibrary, selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayDocumentPicker: - actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .documents(), selectionType: .multiple))) + actionsSubject.send(.presentMediaUploadPicker(mode: .init(source: .documents(), selectionType: .multiple), + caption: composerViewModel.context.plainComposerText)) case .displayMediaPreview(let mediaPreviewViewModel): viewModel.displayMediaPreview(mediaPreviewViewModel) case .displayLocationPicker: @@ -126,7 +129,8 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol { case .displayPollForm(let mode): actionsSubject.send(.presentPollForm(mode: mode)) case .displayMediaUploadPreviewScreen(let mediaURLs): - actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs)) + actionsSubject.send(.presentMediaUploadPreviewScreen(mediaURLs: mediaURLs, + caption: composerViewModel.context.plainComposerText)) case .displaySenderDetails(userID: let userID): actionsSubject.send(.presentRoomMemberDetails(userID: userID)) case .displayMessageForwarding(let forwardingItem): diff --git a/UnitTests/Sources/MediaUploadPreviewScreenViewModelTests.swift b/UnitTests/Sources/MediaUploadPreviewScreenViewModelTests.swift index 072cdf2df..1223947e5 100644 --- a/UnitTests/Sources/MediaUploadPreviewScreenViewModelTests.swift +++ b/UnitTests/Sources/MediaUploadPreviewScreenViewModelTests.swift @@ -288,6 +288,7 @@ final class MediaUploadPreviewScreenViewModelTests { } viewModel = MediaUploadPreviewScreenViewModel(mediaURLs: urls, + caption: nil, title: "Some File", isRoomEncrypted: true, shouldShowCaptionWarning: true,