mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-05 20:09:04 +00:00
Add support for sending media within threads.
This patch add the `threadRootEventID` as a parameter to media sending functions and forwards the timeline thread root between various application states to the place where its needed. The 2 missing items are Locations and Polls which currently don't have any support on the Rust side for being sent within threads. That will come in a separate PR.
This commit is contained in:
committed by
Stefan Ceriu
parent
6481093107
commit
558cdf5be3
@@ -301,8 +301,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case (_, .presentReportContent, .reportContent(let itemID, let senderID, _)):
|
||||
presentReportContent(for: itemID, from: senderID)
|
||||
|
||||
case (_, .presentMediaUploadPicker, .mediaUploadPicker(let source, _)):
|
||||
presentMediaUploadPickerWithSource(source)
|
||||
case (_, .presentMediaUploadPicker, .mediaUploadPicker(let source, let threadRootEventID, _)):
|
||||
presentMediaUploadPickerWithSource(source, threadRootEventID: threadRootEventID)
|
||||
|
||||
case (_, .presentEmojiPicker, .emojiPicker(let itemID, let selectedEmoji, _)):
|
||||
presentEmojiPicker(for: itemID, selectedEmoji: selectedEmoji)
|
||||
@@ -387,8 +387,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case (.pollsHistory, .presentPollForm(let mode), .pollsHistoryForm):
|
||||
presentPollForm(mode: mode)
|
||||
|
||||
case (_, .presentMediaUploadPreview, .mediaUploadPreview(let fileURL, _)):
|
||||
presentMediaUploadPreviewScreen(for: fileURL, animated: animated)
|
||||
case (_, .presentMediaUploadPreview, .mediaUploadPreview(let fileURL, let threadRootEventID, _)):
|
||||
presentMediaUploadPreviewScreen(for: fileURL, threadRootEventID: threadRootEventID, animated: animated)
|
||||
|
||||
case (_, .presentInviteUsersScreen, .inviteUsersScreen):
|
||||
presentInviteUsersScreen()
|
||||
@@ -441,7 +441,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case .eventFocus(let focusedEvent):
|
||||
roomScreenCoordinator?.focusOnEvent(focusedEvent)
|
||||
case .share(.mediaFile(_, let mediaFile)):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url), userInfo: EventUserInfo(animated: animated))
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url, threadRootEventID: nil),
|
||||
userInfo: EventUserInfo(animated: animated))
|
||||
case .share(.text(_, let text)):
|
||||
roomScreenCoordinator?.shareText(text)
|
||||
case .none:
|
||||
@@ -477,7 +478,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
|
||||
switch presentationAction {
|
||||
case .share(.mediaFile(_, let mediaFile)):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url), userInfo: EventUserInfo(animated: animated))
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url, threadRootEventID: nil),
|
||||
userInfo: EventUserInfo(animated: animated))
|
||||
case .share(.text), .eventFocus:
|
||||
break // These are both handled in the coordinator's init.
|
||||
case .none:
|
||||
@@ -528,9 +530,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case .presentReportContent(let itemID, let senderID):
|
||||
stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID))
|
||||
case .presentMediaUploadPicker(let source):
|
||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source))
|
||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source, threadRootEventID: nil))
|
||||
case .presentMediaUploadPreviewScreen(let url):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url))
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url, threadRootEventID: nil))
|
||||
case .presentEmojiPicker(let itemID, let selectedEmojis):
|
||||
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis))
|
||||
case .presentLocationPicker:
|
||||
@@ -605,10 +607,12 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
switch action {
|
||||
case .presentReportContent(let itemID, let senderID):
|
||||
stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID))
|
||||
case .presentMediaUploadPicker(let source):
|
||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source))
|
||||
case .presentMediaUploadPreviewScreen(let url):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url))
|
||||
case .presentMediaUploadPicker(let source, let threadRootEventID):
|
||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source,
|
||||
threadRootEventID: threadRootEventID))
|
||||
case .presentMediaUploadPreviewScreen(let url, let threadRootEventID):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url,
|
||||
threadRootEventID: threadRootEventID))
|
||||
case .presentLocationPicker:
|
||||
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker))
|
||||
case .presentPollForm(let mode):
|
||||
@@ -867,7 +871,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
private func presentMediaUploadPickerWithSource(_ source: MediaPickerScreenSource) {
|
||||
private func presentMediaUploadPickerWithSource(_ source: MediaPickerScreenSource,
|
||||
threadRootEventID: String?) {
|
||||
let stackCoordinator = NavigationStackCoordinator()
|
||||
|
||||
let mediaPickerCoordinator = MediaPickerScreenCoordinator(userIndicatorController: userIndicatorController,
|
||||
@@ -880,7 +885,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
case .cancel:
|
||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
case .selectMediaAtURL(let url):
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url))
|
||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url, threadRootEventID: threadRootEventID))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -893,7 +898,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
private func presentMediaUploadPreviewScreen(for url: URL, animated: Bool) {
|
||||
private func presentMediaUploadPreviewScreen(for url: URL,
|
||||
threadRootEventID: String?,
|
||||
animated: Bool) {
|
||||
let stackCoordinator = NavigationStackCoordinator()
|
||||
|
||||
let parameters = MediaUploadPreviewScreenCoordinatorParameters(userIndicatorController: userIndicatorController,
|
||||
@@ -901,6 +908,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: appSettings),
|
||||
title: url.lastPathComponent,
|
||||
url: url,
|
||||
threadRootEventID: threadRootEventID,
|
||||
shouldShowCaptionWarning: appSettings.shouldShowMediaCaptionWarning)
|
||||
|
||||
let mediaUploadPreviewScreenCoordinator = MediaUploadPreviewScreenCoordinator(parameters: parameters)
|
||||
@@ -966,11 +974,13 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
switch action {
|
||||
case .selectedLocation(let geoURI, let isUserLocation):
|
||||
Task {
|
||||
#warning("Allow sending locations within threads when the SDK allows it")
|
||||
_ = await self.roomProxy.timeline.sendLocation(body: geoURI.bodyMessage,
|
||||
geoURI: geoURI,
|
||||
description: nil,
|
||||
zoomLevel: 15,
|
||||
assetType: isUserLocation ? .sender : .pin)
|
||||
assetType: isUserLocation ? .sender : .pin,
|
||||
threadRootEventID: nil)
|
||||
self.navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
}
|
||||
|
||||
@@ -1028,7 +1038,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
||||
|
||||
private func createPoll(question: String, options: [String], pollKind: Poll.Kind) {
|
||||
Task {
|
||||
let result = await roomProxy.timeline.createPoll(question: question, answers: options, pollKind: pollKind)
|
||||
#warning("Allow sending polls within threads when the SDK allows it")
|
||||
let result = await roomProxy.timeline.createPoll(question: question, answers: options, pollKind: pollKind, threadRootEventID: nil)
|
||||
|
||||
self.analytics.trackComposer(inThread: false,
|
||||
isEditing: false,
|
||||
|
||||
@@ -57,8 +57,8 @@ extension RoomFlowCoordinator {
|
||||
case roomMemberDetails(userID: String, previousState: State)
|
||||
case userProfile(userID: String, previousState: State)
|
||||
case inviteUsersScreen(previousState: State)
|
||||
case mediaUploadPicker(source: MediaPickerScreenSource, previousState: State)
|
||||
case mediaUploadPreview(fileURL: URL, previousState: State)
|
||||
case mediaUploadPicker(source: MediaPickerScreenSource, threadRootEventID: String?, previousState: State)
|
||||
case mediaUploadPreview(fileURL: URL, threadRootEventID: String?, previousState: State)
|
||||
case emojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>, previousState: State)
|
||||
case mapNavigator(previousState: State)
|
||||
case messageForwarding(forwardingItem: MessageForwardingItem, previousState: State)
|
||||
@@ -122,10 +122,10 @@ extension RoomFlowCoordinator {
|
||||
case presentInviteUsersScreen
|
||||
case dismissInviteUsersScreen
|
||||
|
||||
case presentMediaUploadPicker(source: MediaPickerScreenSource)
|
||||
case presentMediaUploadPicker(source: MediaPickerScreenSource, threadRootEventID: String?)
|
||||
case dismissMediaUploadPicker
|
||||
|
||||
case presentMediaUploadPreview(fileURL: URL)
|
||||
case presentMediaUploadPreview(fileURL: URL, threadRootEventID: String?)
|
||||
case dismissMediaUploadPreview
|
||||
|
||||
case presentEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
|
||||
@@ -184,11 +184,11 @@ extension RoomFlowCoordinator {
|
||||
case (.room, .presentReportContent(let itemID, let senderID)):
|
||||
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
||||
|
||||
case (.room, .presentMediaUploadPicker(let source)):
|
||||
return .mediaUploadPicker(source: source, previousState: fromState)
|
||||
case (.room, .presentMediaUploadPicker(let source, let threadRootEventID)):
|
||||
return .mediaUploadPicker(source: source, threadRootEventID: threadRootEventID, previousState: fromState)
|
||||
|
||||
case (.room, .presentMediaUploadPreview(let fileURL)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, previousState: fromState)
|
||||
case (.room, .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: fromState)
|
||||
|
||||
case (.room, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
||||
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
||||
@@ -221,11 +221,11 @@ extension RoomFlowCoordinator {
|
||||
case (.thread, .presentReportContent(let itemID, let senderID)):
|
||||
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
||||
|
||||
case (.thread, .presentMediaUploadPicker(let source)):
|
||||
return .mediaUploadPicker(source: source, previousState: fromState)
|
||||
case (.thread, .presentMediaUploadPicker(let source, let threadRootEventID)):
|
||||
return .mediaUploadPicker(source: source, threadRootEventID: threadRootEventID, previousState: fromState)
|
||||
|
||||
case (.thread, .presentMediaUploadPreview(let fileURL)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, previousState: fromState)
|
||||
case (.thread, .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: fromState)
|
||||
|
||||
case (.thread, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
||||
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
||||
@@ -244,7 +244,7 @@ extension RoomFlowCoordinator {
|
||||
|
||||
// Room + Thread
|
||||
|
||||
case (.mediaUploadPicker(_, let previousState), .dismissMediaUploadPicker):
|
||||
case (.mediaUploadPicker(_, _, let previousState), .dismissMediaUploadPicker):
|
||||
return previousState
|
||||
|
||||
case (.emojiPicker(_, _, let previouState), .dismissEmojiPicker):
|
||||
@@ -343,7 +343,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):
|
||||
@@ -361,8 +361,8 @@ extension RoomFlowCoordinator {
|
||||
case (.pollsHistoryForm, .dismissPollForm):
|
||||
return .pollsHistory
|
||||
|
||||
case (.mediaUploadPicker(_, let previousMediaUploadPickerState), .presentMediaUploadPreview(let fileURL)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, previousState: previousMediaUploadPickerState)
|
||||
case (.mediaUploadPicker(_, _, let previousMediaUploadPickerState), .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: previousMediaUploadPickerState)
|
||||
|
||||
case (_, .presentInviteUsersScreen):
|
||||
return .inviteUsersScreen(previousState: fromState)
|
||||
|
||||
Reference in New Issue
Block a user