mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Remove the threadRootEventID associated value from all the RoomFlowCoordinatorStateMachine states and replace them with a UserInfo passed TimelineController.
This commit is contained in:
committed by
Stefan Ceriu
parent
3fcbc8c60a
commit
1fc15a220d
@@ -268,6 +268,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// swiftlint:disable:next function_body_length
|
||||||
private func setupStateMachine() {
|
private func setupStateMachine() {
|
||||||
addRouteMapping(stateMachine: stateMachine)
|
addRouteMapping(stateMachine: stateMachine)
|
||||||
|
|
||||||
@@ -280,9 +281,13 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
// Room
|
// Room
|
||||||
|
|
||||||
case (_, .presentRoom(let presentationAction), .room):
|
case (_, .presentRoom(let presentationAction), .room):
|
||||||
|
guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else {
|
||||||
|
fatalError()
|
||||||
|
}
|
||||||
Task {
|
Task {
|
||||||
await self.presentRoom(fromState: context.fromState,
|
await self.presentRoom(fromState: context.fromState,
|
||||||
presentationAction: presentationAction,
|
presentationAction: presentationAction,
|
||||||
|
timelineController: timelineController,
|
||||||
animated: animated)
|
animated: animated)
|
||||||
}
|
}
|
||||||
case (_, .dismissFlow, .complete):
|
case (_, .dismissFlow, .complete):
|
||||||
@@ -294,15 +299,18 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
// Thread
|
// Thread
|
||||||
|
|
||||||
case (.room, .presentThread(let itemID), .thread):
|
case (.room, .presentThread(let itemID), .thread):
|
||||||
Task { await self.presentThread(itemID: itemID) }
|
Task { await self.presentThread(itemID: itemID, animated: animated) }
|
||||||
|
|
||||||
// Thread + Room
|
// Thread + Room
|
||||||
|
|
||||||
case (_, .presentReportContent, .reportContent(let itemID, let senderID, _)):
|
case (_, .presentReportContent, .reportContent(let itemID, let senderID, _)):
|
||||||
presentReportContent(for: itemID, from: senderID)
|
presentReportContent(for: itemID, from: senderID)
|
||||||
|
|
||||||
case (_, .presentMediaUploadPicker, .mediaUploadPicker(let source, let threadRootEventID, _)):
|
case (_, .presentMediaUploadPicker, .mediaUploadPicker(let source, _)):
|
||||||
presentMediaUploadPickerWithSource(source, threadRootEventID: threadRootEventID)
|
guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else {
|
||||||
|
fatalError()
|
||||||
|
}
|
||||||
|
presentMediaUploadPickerWithSource(source, timelineController: timelineController, animated: animated)
|
||||||
|
|
||||||
case (_, .presentEmojiPicker, .emojiPicker(let itemID, let selectedEmoji, _)):
|
case (_, .presentEmojiPicker, .emojiPicker(let itemID, let selectedEmoji, _)):
|
||||||
presentEmojiPicker(for: itemID, selectedEmoji: selectedEmoji)
|
presentEmojiPicker(for: itemID, selectedEmoji: selectedEmoji)
|
||||||
@@ -310,8 +318,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
case (_, .presentMessageForwarding(let forwardingItem), .messageForwarding):
|
case (_, .presentMessageForwarding(let forwardingItem), .messageForwarding):
|
||||||
presentMessageForwarding(with: forwardingItem)
|
presentMessageForwarding(with: forwardingItem)
|
||||||
|
|
||||||
case (_, .presentMapNavigator(let mode, let threadRootEventID), .mapNavigator):
|
case (_, .presentMapNavigator(let mode), .mapNavigator):
|
||||||
presentMapNavigator(interactionMode: mode, threadRootEventID: threadRootEventID)
|
guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else {
|
||||||
|
fatalError()
|
||||||
|
}
|
||||||
|
presentMapNavigator(interactionMode: mode, timelineController: timelineController, animated: animated)
|
||||||
|
|
||||||
case (_, .presentPollForm(let mode), .pollForm):
|
case (_, .presentPollForm(let mode), .pollForm):
|
||||||
presentPollForm(mode: mode)
|
presentPollForm(mode: mode)
|
||||||
@@ -387,8 +398,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
case (.pollsHistory, .presentPollForm(let mode), .pollsHistoryForm):
|
case (.pollsHistory, .presentPollForm(let mode), .pollsHistoryForm):
|
||||||
presentPollForm(mode: mode)
|
presentPollForm(mode: mode)
|
||||||
|
|
||||||
case (_, .presentMediaUploadPreview, .mediaUploadPreview(let fileURL, let threadRootEventID, _)):
|
case (_, .presentMediaUploadPreview, .mediaUploadPreview(let fileURL, _)):
|
||||||
presentMediaUploadPreviewScreen(for: fileURL, threadRootEventID: threadRootEventID, animated: animated)
|
guard let timelineController = (context.userInfo as? EventUserInfo)?.timelineController else {
|
||||||
|
fatalError()
|
||||||
|
}
|
||||||
|
presentMediaUploadPreviewScreen(for: fileURL, timelineController: timelineController, animated: animated)
|
||||||
|
|
||||||
case (_, .presentInviteUsersScreen, .inviteUsersScreen):
|
case (_, .presentInviteUsersScreen, .inviteUsersScreen):
|
||||||
presentInviteUsersScreen()
|
presentInviteUsersScreen()
|
||||||
@@ -418,9 +432,13 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
/// Updates the navigation stack so it displays the timeline for the given room
|
/// Updates the navigation stack so it displays the timeline for the given room
|
||||||
/// - Parameters:
|
/// - Parameters:
|
||||||
/// - fromState: The state that asked for the room presentation.
|
/// - fromState: The state that asked for the room presentation.
|
||||||
/// - focussedEvent: An (optional) struct that contains the event ID that the timeline should be focussed around, and a boolean telling if such event should update the pinned events banner
|
/// - presentationAction: The action that should happen after the room is presented
|
||||||
|
/// - timelineController: This room's main timeline controller
|
||||||
/// - animated: whether it should animate the transition
|
/// - animated: whether it should animate the transition
|
||||||
private func presentRoom(fromState: State, presentationAction: PresentationAction?, animated: Bool) async {
|
private func presentRoom(fromState: State,
|
||||||
|
presentationAction: PresentationAction?,
|
||||||
|
timelineController: TimelineControllerProtocol,
|
||||||
|
animated: Bool) async {
|
||||||
// If any sheets are presented dismiss them, rely on their dismissal callbacks to transition the state machine
|
// If any sheets are presented dismiss them, rely on their dismissal callbacks to transition the state machine
|
||||||
// through the correct states before presenting the room
|
// through the correct states before presenting the room
|
||||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||||
@@ -441,8 +459,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
case .eventFocus(let focusedEvent):
|
case .eventFocus(let focusedEvent):
|
||||||
roomScreenCoordinator?.focusOnEvent(focusedEvent)
|
roomScreenCoordinator?.focusOnEvent(focusedEvent)
|
||||||
case .share(.mediaFile(_, let mediaFile)):
|
case .share(.mediaFile(_, let mediaFile)):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url, threadRootEventID: nil),
|
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url),
|
||||||
userInfo: EventUserInfo(animated: animated))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .share(.text(_, let text)):
|
case .share(.text(_, let text)):
|
||||||
roomScreenCoordinator?.shareText(text)
|
roomScreenCoordinator?.shareText(text)
|
||||||
case .none:
|
case .none:
|
||||||
@@ -458,7 +476,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
|
|
||||||
analytics.trackViewRoom(isDM: roomProxy.infoPublisher.value.isDirect, isSpace: roomProxy.infoPublisher.value.isSpace)
|
analytics.trackViewRoom(isDM: roomProxy.infoPublisher.value.isDirect, isSpace: roomProxy.infoPublisher.value.isSpace)
|
||||||
|
|
||||||
let coordinator = makeRoomScreenCoordinator(presentationAction: presentationAction)
|
let coordinator = makeRoomScreenCoordinator(presentationAction: presentationAction, animated: animated)
|
||||||
roomScreenCoordinator = coordinator
|
roomScreenCoordinator = coordinator
|
||||||
|
|
||||||
if !isChildFlow {
|
if !isChildFlow {
|
||||||
@@ -478,8 +496,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
|
|
||||||
switch presentationAction {
|
switch presentationAction {
|
||||||
case .share(.mediaFile(_, let mediaFile)):
|
case .share(.mediaFile(_, let mediaFile)):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url, threadRootEventID: nil),
|
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: mediaFile.url),
|
||||||
userInfo: EventUserInfo(animated: animated))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .share(.text), .eventFocus:
|
case .share(.text), .eventFocus:
|
||||||
break // These are both handled in the coordinator's init.
|
break // These are both handled in the coordinator's init.
|
||||||
case .none:
|
case .none:
|
||||||
@@ -487,7 +505,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func makeRoomScreenCoordinator(presentationAction: PresentationAction?) -> RoomScreenCoordinator {
|
private func makeRoomScreenCoordinator(presentationAction: PresentationAction?, animated: Bool) -> RoomScreenCoordinator {
|
||||||
let userID = userSession.clientProxy.userID
|
let userID = userSession.clientProxy.userID
|
||||||
let timelineItemFactory = RoomTimelineItemFactory(userID: userID,
|
let timelineItemFactory = RoomTimelineItemFactory(userID: userID,
|
||||||
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
attributedStringBuilder: AttributedStringBuilder(mentionBuilder: MentionBuilder()),
|
||||||
@@ -533,22 +551,22 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
stateMachine.tryEvent(.presentReportContent(itemID: itemID,
|
stateMachine.tryEvent(.presentReportContent(itemID: itemID,
|
||||||
senderID: senderID))
|
senderID: senderID))
|
||||||
case .presentMediaUploadPicker(let source):
|
case .presentMediaUploadPicker(let source):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source,
|
stateMachine.tryEvent(.presentMediaUploadPicker(source: source),
|
||||||
threadRootEventID: nil))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentMediaUploadPreviewScreen(let url):
|
case .presentMediaUploadPreviewScreen(let url):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url,
|
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url),
|
||||||
threadRootEventID: nil))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentEmojiPicker(let itemID, let selectedEmojis):
|
case .presentEmojiPicker(let itemID, let selectedEmojis):
|
||||||
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID,
|
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID,
|
||||||
selectedEmojis: selectedEmojis))
|
selectedEmojis: selectedEmojis))
|
||||||
case .presentLocationPicker:
|
case .presentLocationPicker:
|
||||||
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker,
|
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker),
|
||||||
threadRootEventID: nil))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentPollForm(let mode):
|
case .presentPollForm(let mode):
|
||||||
stateMachine.tryEvent(.presentPollForm(mode: mode))
|
stateMachine.tryEvent(.presentPollForm(mode: mode))
|
||||||
case .presentLocationViewer(_, let geoURI, let description):
|
case .presentLocationViewer(_, let geoURI, let description):
|
||||||
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .viewOnly(geoURI: geoURI, description: description),
|
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .viewOnly(geoURI: geoURI, description: description)),
|
||||||
threadRootEventID: nil))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentRoomMemberDetails(userID: let userID):
|
case .presentRoomMemberDetails(userID: let userID):
|
||||||
stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID))
|
stateMachine.tryEvent(.presentRoomMemberDetails(userID: userID))
|
||||||
case .presentMessageForwarding(let forwardingItem):
|
case .presentMessageForwarding(let forwardingItem):
|
||||||
@@ -575,7 +593,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
return coordinator
|
return coordinator
|
||||||
}
|
}
|
||||||
|
|
||||||
private func presentThread(itemID: TimelineItemIdentifier) async {
|
private func presentThread(itemID: TimelineItemIdentifier, animated: Bool) async {
|
||||||
showLoadingIndicator()
|
showLoadingIndicator()
|
||||||
defer { hideLoadingIndicator() }
|
defer { hideLoadingIndicator() }
|
||||||
|
|
||||||
@@ -621,20 +639,20 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
case .presentReportContent(let itemID, let senderID):
|
case .presentReportContent(let itemID, let senderID):
|
||||||
stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID))
|
stateMachine.tryEvent(.presentReportContent(itemID: itemID, senderID: senderID))
|
||||||
case .presentMediaUploadPicker(let source, let threadRootEventID):
|
case .presentMediaUploadPicker(let source, let threadRootEventID):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPicker(source: source,
|
stateMachine.tryEvent(.presentMediaUploadPicker(source: source),
|
||||||
threadRootEventID: threadRootEventID))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentMediaUploadPreviewScreen(let url, let threadRootEventID):
|
case .presentMediaUploadPreviewScreen(let url, let threadRootEventID):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url,
|
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url),
|
||||||
threadRootEventID: threadRootEventID))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentLocationPicker(let threadRootEventID):
|
case .presentLocationPicker(let threadRootEventID):
|
||||||
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker,
|
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .picker),
|
||||||
threadRootEventID: threadRootEventID))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentPollForm(let mode):
|
case .presentPollForm(let mode):
|
||||||
stateMachine.tryEvent(.presentPollForm(mode: mode))
|
stateMachine.tryEvent(.presentPollForm(mode: mode))
|
||||||
case .presentLocationViewer(_, let geoURI, let description, let threadRootEventID):
|
case .presentLocationViewer(_, let geoURI, let description, let threadRootEventID):
|
||||||
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .viewOnly(geoURI: geoURI,
|
stateMachine.tryEvent(.presentMapNavigator(interactionMode: .viewOnly(geoURI: geoURI,
|
||||||
description: description),
|
description: description)),
|
||||||
threadRootEventID: threadRootEventID))
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
case .presentEmojiPicker(let itemID, let selectedEmojis):
|
case .presentEmojiPicker(let itemID, let selectedEmojis):
|
||||||
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID,
|
stateMachine.tryEvent(.presentEmojiPicker(itemID: itemID,
|
||||||
selectedEmojis: selectedEmojis))
|
selectedEmojis: selectedEmojis))
|
||||||
@@ -890,7 +908,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func presentMediaUploadPickerWithSource(_ source: MediaPickerScreenSource,
|
private func presentMediaUploadPickerWithSource(_ source: MediaPickerScreenSource,
|
||||||
threadRootEventID: String?) {
|
timelineController: TimelineControllerProtocol,
|
||||||
|
animated: Bool) {
|
||||||
let stackCoordinator = NavigationStackCoordinator()
|
let stackCoordinator = NavigationStackCoordinator()
|
||||||
|
|
||||||
let mediaPickerCoordinator = MediaPickerScreenCoordinator(userIndicatorController: userIndicatorController,
|
let mediaPickerCoordinator = MediaPickerScreenCoordinator(userIndicatorController: userIndicatorController,
|
||||||
@@ -903,7 +922,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
case .cancel:
|
case .cancel:
|
||||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||||
case .selectMediaAtURL(let url):
|
case .selectMediaAtURL(let url):
|
||||||
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url, threadRootEventID: threadRootEventID))
|
stateMachine.tryEvent(.presentMediaUploadPreview(fileURL: url),
|
||||||
|
userInfo: EventUserInfo(animated: animated, timelineController: timelineController))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -917,16 +937,16 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func presentMediaUploadPreviewScreen(for url: URL,
|
private func presentMediaUploadPreviewScreen(for url: URL,
|
||||||
threadRootEventID: String?,
|
timelineController: TimelineControllerProtocol,
|
||||||
animated: Bool) {
|
animated: Bool) {
|
||||||
let stackCoordinator = NavigationStackCoordinator()
|
let stackCoordinator = NavigationStackCoordinator()
|
||||||
|
|
||||||
let parameters = MediaUploadPreviewScreenCoordinatorParameters(userIndicatorController: userIndicatorController,
|
let parameters = MediaUploadPreviewScreenCoordinatorParameters(roomProxy: roomProxy,
|
||||||
roomProxy: roomProxy,
|
timelineController: timelineController,
|
||||||
|
userIndicatorController: userIndicatorController,
|
||||||
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: appSettings),
|
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: appSettings),
|
||||||
title: url.lastPathComponent,
|
title: url.lastPathComponent,
|
||||||
url: url,
|
url: url,
|
||||||
threadRootEventID: threadRootEventID,
|
|
||||||
shouldShowCaptionWarning: appSettings.shouldShowMediaCaptionWarning)
|
shouldShowCaptionWarning: appSettings.shouldShowMediaCaptionWarning)
|
||||||
|
|
||||||
let mediaUploadPreviewScreenCoordinator = MediaUploadPreviewScreenCoordinator(parameters: parameters)
|
let mediaUploadPreviewScreenCoordinator = MediaUploadPreviewScreenCoordinator(parameters: parameters)
|
||||||
@@ -980,7 +1000,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func presentMapNavigator(interactionMode: StaticLocationInteractionMode,
|
private func presentMapNavigator(interactionMode: StaticLocationInteractionMode,
|
||||||
threadRootEventID: String?) {
|
timelineController: TimelineControllerProtocol,
|
||||||
|
animated: Bool) {
|
||||||
let stackCoordinator = NavigationStackCoordinator()
|
let stackCoordinator = NavigationStackCoordinator()
|
||||||
|
|
||||||
let params = StaticLocationScreenCoordinatorParameters(interactionMode: interactionMode,
|
let params = StaticLocationScreenCoordinatorParameters(interactionMode: interactionMode,
|
||||||
|
|||||||
@@ -57,10 +57,10 @@ extension RoomFlowCoordinator {
|
|||||||
case roomMemberDetails(userID: String, previousState: State)
|
case roomMemberDetails(userID: String, previousState: State)
|
||||||
case userProfile(userID: String, previousState: State)
|
case userProfile(userID: String, previousState: State)
|
||||||
case inviteUsersScreen(previousState: State)
|
case inviteUsersScreen(previousState: State)
|
||||||
case mediaUploadPicker(source: MediaPickerScreenSource, threadRootEventID: String?, previousState: State)
|
case mediaUploadPicker(source: MediaPickerScreenSource, previousState: State)
|
||||||
case mediaUploadPreview(fileURL: URL, threadRootEventID: String?, previousState: State)
|
case mediaUploadPreview(fileURL: URL, previousState: State)
|
||||||
case emojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>, previousState: State)
|
case emojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>, previousState: State)
|
||||||
case mapNavigator(threadRootEventID: String?, previousState: State)
|
case mapNavigator(previousState: State)
|
||||||
case messageForwarding(forwardingItem: MessageForwardingItem, previousState: State)
|
case messageForwarding(forwardingItem: MessageForwardingItem, previousState: State)
|
||||||
case reportContent(itemID: TimelineItemIdentifier, senderID: String, previousState: State)
|
case reportContent(itemID: TimelineItemIdentifier, senderID: String, previousState: State)
|
||||||
case pollForm(previousState: State)
|
case pollForm(previousState: State)
|
||||||
@@ -83,6 +83,7 @@ extension RoomFlowCoordinator {
|
|||||||
|
|
||||||
struct EventUserInfo {
|
struct EventUserInfo {
|
||||||
let animated: Bool
|
let animated: Bool
|
||||||
|
var timelineController: TimelineControllerProtocol?
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Event: EventType {
|
enum Event: EventType {
|
||||||
@@ -122,16 +123,16 @@ extension RoomFlowCoordinator {
|
|||||||
case presentInviteUsersScreen
|
case presentInviteUsersScreen
|
||||||
case dismissInviteUsersScreen
|
case dismissInviteUsersScreen
|
||||||
|
|
||||||
case presentMediaUploadPicker(source: MediaPickerScreenSource, threadRootEventID: String?)
|
case presentMediaUploadPicker(source: MediaPickerScreenSource)
|
||||||
case dismissMediaUploadPicker
|
case dismissMediaUploadPicker
|
||||||
|
|
||||||
case presentMediaUploadPreview(fileURL: URL, threadRootEventID: String?)
|
case presentMediaUploadPreview(fileURL: URL)
|
||||||
case dismissMediaUploadPreview
|
case dismissMediaUploadPreview
|
||||||
|
|
||||||
case presentEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
|
case presentEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
|
||||||
case dismissEmojiPicker
|
case dismissEmojiPicker
|
||||||
|
|
||||||
case presentMapNavigator(interactionMode: StaticLocationInteractionMode, threadRootEventID: String?)
|
case presentMapNavigator(interactionMode: StaticLocationInteractionMode)
|
||||||
case dismissMapNavigator
|
case dismissMapNavigator
|
||||||
|
|
||||||
case presentMessageForwarding(forwardingItem: MessageForwardingItem)
|
case presentMessageForwarding(forwardingItem: MessageForwardingItem)
|
||||||
@@ -184,11 +185,11 @@ extension RoomFlowCoordinator {
|
|||||||
case (.room, .presentReportContent(let itemID, let senderID)):
|
case (.room, .presentReportContent(let itemID, let senderID)):
|
||||||
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
||||||
|
|
||||||
case (.room, .presentMediaUploadPicker(let source, let threadRootEventID)):
|
case (.room, .presentMediaUploadPicker(let source)):
|
||||||
return .mediaUploadPicker(source: source, threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mediaUploadPicker(source: source, previousState: fromState)
|
||||||
|
|
||||||
case (.room, .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
case (.room, .presentMediaUploadPreview(let fileURL)):
|
||||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mediaUploadPreview(fileURL: fileURL, previousState: fromState)
|
||||||
|
|
||||||
case (.room, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
case (.room, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
||||||
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
||||||
@@ -196,8 +197,8 @@ extension RoomFlowCoordinator {
|
|||||||
case (.room, .presentMessageForwarding(let forwardingItem)):
|
case (.room, .presentMessageForwarding(let forwardingItem)):
|
||||||
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
|
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
|
||||||
|
|
||||||
case (.room, .presentMapNavigator(_, let threadRootEventID)):
|
case (.room, .presentMapNavigator(_)):
|
||||||
return .mapNavigator(threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mapNavigator(previousState: fromState)
|
||||||
|
|
||||||
case (.room, .presentPollForm):
|
case (.room, .presentPollForm):
|
||||||
return .pollForm(previousState: fromState)
|
return .pollForm(previousState: fromState)
|
||||||
@@ -221,11 +222,11 @@ extension RoomFlowCoordinator {
|
|||||||
case (.thread, .presentReportContent(let itemID, let senderID)):
|
case (.thread, .presentReportContent(let itemID, let senderID)):
|
||||||
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
return .reportContent(itemID: itemID, senderID: senderID, previousState: fromState)
|
||||||
|
|
||||||
case (.thread, .presentMediaUploadPicker(let source, let threadRootEventID)):
|
case (.thread, .presentMediaUploadPicker(let source)):
|
||||||
return .mediaUploadPicker(source: source, threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mediaUploadPicker(source: source, previousState: fromState)
|
||||||
|
|
||||||
case (.thread, .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
case (.thread, .presentMediaUploadPreview(let fileURL)):
|
||||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mediaUploadPreview(fileURL: fileURL, previousState: fromState)
|
||||||
|
|
||||||
case (.thread, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
case (.thread, .presentEmojiPicker(let itemID, let selectedEmoji)):
|
||||||
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
return .emojiPicker(itemID: itemID, selectedEmojis: selectedEmoji, previousState: fromState)
|
||||||
@@ -233,8 +234,8 @@ extension RoomFlowCoordinator {
|
|||||||
case (.thread, .presentMessageForwarding(let forwardingItem)):
|
case (.thread, .presentMessageForwarding(let forwardingItem)):
|
||||||
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
|
return .messageForwarding(forwardingItem: forwardingItem, previousState: fromState)
|
||||||
|
|
||||||
case (.thread, .presentMapNavigator(_, let threadRootEventID)):
|
case (.thread, .presentMapNavigator(_)):
|
||||||
return .mapNavigator(threadRootEventID: threadRootEventID, previousState: fromState)
|
return .mapNavigator(previousState: fromState)
|
||||||
|
|
||||||
case (.thread, .presentPollForm):
|
case (.thread, .presentPollForm):
|
||||||
return .pollForm(previousState: fromState)
|
return .pollForm(previousState: fromState)
|
||||||
@@ -244,7 +245,7 @@ extension RoomFlowCoordinator {
|
|||||||
|
|
||||||
// Room + Thread
|
// Room + Thread
|
||||||
|
|
||||||
case (.mediaUploadPicker(_, _, let previousState), .dismissMediaUploadPicker):
|
case (.mediaUploadPicker(_, let previousState), .dismissMediaUploadPicker):
|
||||||
return previousState
|
return previousState
|
||||||
|
|
||||||
case (.emojiPicker(_, _, let previouState), .dismissEmojiPicker):
|
case (.emojiPicker(_, _, let previouState), .dismissEmojiPicker):
|
||||||
@@ -256,7 +257,7 @@ extension RoomFlowCoordinator {
|
|||||||
case (.messageForwarding(_, let previousState), .dismissMessageForwarding):
|
case (.messageForwarding(_, let previousState), .dismissMessageForwarding):
|
||||||
return previousState
|
return previousState
|
||||||
|
|
||||||
case (.mapNavigator(_, let previousState), .dismissMapNavigator):
|
case (.mapNavigator(let previousState), .dismissMapNavigator):
|
||||||
return previousState
|
return previousState
|
||||||
|
|
||||||
case (.pollForm(let previousState), .dismissPollForm):
|
case (.pollForm(let previousState), .dismissPollForm):
|
||||||
@@ -343,7 +344,7 @@ extension RoomFlowCoordinator {
|
|||||||
case (.knockRequestsList(let previousState), .dismissKnockRequestsListScreen):
|
case (.knockRequestsList(let previousState), .dismissKnockRequestsListScreen):
|
||||||
return previousState
|
return previousState
|
||||||
|
|
||||||
case (.mediaUploadPreview(_, _, let previousState), .dismissMediaUploadPreview):
|
case (.mediaUploadPreview(_, let previousState), .dismissMediaUploadPreview):
|
||||||
return previousState
|
return previousState
|
||||||
|
|
||||||
case (.notificationSettings, .presentGlobalNotificationSettingsScreen):
|
case (.notificationSettings, .presentGlobalNotificationSettingsScreen):
|
||||||
@@ -361,8 +362,8 @@ extension RoomFlowCoordinator {
|
|||||||
case (.pollsHistoryForm, .dismissPollForm):
|
case (.pollsHistoryForm, .dismissPollForm):
|
||||||
return .pollsHistory
|
return .pollsHistory
|
||||||
|
|
||||||
case (.mediaUploadPicker(_, _, let previousMediaUploadPickerState), .presentMediaUploadPreview(let fileURL, let threadRootEventID)):
|
case (.mediaUploadPicker(_, let previousMediaUploadPickerState), .presentMediaUploadPreview(let fileURL)):
|
||||||
return .mediaUploadPreview(fileURL: fileURL, threadRootEventID: threadRootEventID, previousState: previousMediaUploadPickerState)
|
return .mediaUploadPreview(fileURL: fileURL, previousState: previousMediaUploadPickerState)
|
||||||
|
|
||||||
case (_, .presentInviteUsersScreen):
|
case (_, .presentInviteUsersScreen):
|
||||||
return .inviteUsersScreen(previousState: fromState)
|
return .inviteUsersScreen(previousState: fromState)
|
||||||
|
|||||||
+5
-5
@@ -9,12 +9,12 @@ import Combine
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct MediaUploadPreviewScreenCoordinatorParameters {
|
struct MediaUploadPreviewScreenCoordinatorParameters {
|
||||||
let userIndicatorController: UserIndicatorControllerProtocol
|
|
||||||
let roomProxy: JoinedRoomProxyProtocol
|
let roomProxy: JoinedRoomProxyProtocol
|
||||||
|
let timelineController: TimelineControllerProtocol
|
||||||
|
let userIndicatorController: UserIndicatorControllerProtocol
|
||||||
let mediaUploadingPreprocessor: MediaUploadingPreprocessor
|
let mediaUploadingPreprocessor: MediaUploadingPreprocessor
|
||||||
let title: String?
|
let title: String?
|
||||||
let url: URL
|
let url: URL
|
||||||
let threadRootEventID: String?
|
|
||||||
let shouldShowCaptionWarning: Bool
|
let shouldShowCaptionWarning: Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,12 +32,12 @@ final class MediaUploadPreviewScreenCoordinator: CoordinatorProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
init(parameters: MediaUploadPreviewScreenCoordinatorParameters) {
|
init(parameters: MediaUploadPreviewScreenCoordinatorParameters) {
|
||||||
viewModel = MediaUploadPreviewScreenViewModel(userIndicatorController: parameters.userIndicatorController,
|
viewModel = MediaUploadPreviewScreenViewModel(roomProxy: parameters.roomProxy,
|
||||||
roomProxy: parameters.roomProxy,
|
timelineController: parameters.timelineController,
|
||||||
|
userIndicatorController: parameters.userIndicatorController,
|
||||||
mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor,
|
mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor,
|
||||||
title: parameters.title,
|
title: parameters.title,
|
||||||
url: parameters.url,
|
url: parameters.url,
|
||||||
threadRootEventID: parameters.threadRootEventID,
|
|
||||||
shouldShowCaptionWarning: parameters.shouldShowCaptionWarning)
|
shouldShowCaptionWarning: parameters.shouldShowCaptionWarning)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-7
@@ -12,11 +12,12 @@ import SwiftUI
|
|||||||
typealias MediaUploadPreviewScreenViewModelType = StateStoreViewModelV2<MediaUploadPreviewScreenViewState, MediaUploadPreviewScreenViewAction>
|
typealias MediaUploadPreviewScreenViewModelType = StateStoreViewModelV2<MediaUploadPreviewScreenViewState, MediaUploadPreviewScreenViewAction>
|
||||||
|
|
||||||
class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType, MediaUploadPreviewScreenViewModelProtocol {
|
class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType, MediaUploadPreviewScreenViewModelProtocol {
|
||||||
private let userIndicatorController: UserIndicatorControllerProtocol
|
|
||||||
private let roomProxy: JoinedRoomProxyProtocol
|
private let roomProxy: JoinedRoomProxyProtocol
|
||||||
|
private let timelineController: TimelineControllerProtocol
|
||||||
|
private let userIndicatorController: UserIndicatorControllerProtocol
|
||||||
|
|
||||||
private let mediaUploadingPreprocessor: MediaUploadingPreprocessor
|
private let mediaUploadingPreprocessor: MediaUploadingPreprocessor
|
||||||
private let url: URL
|
private let url: URL
|
||||||
private let threadRootEventID: String?
|
|
||||||
|
|
||||||
private var processingTask: Task<Result<MediaInfo, MediaUploadingPreprocessorError>, Never>
|
private var processingTask: Task<Result<MediaInfo, MediaUploadingPreprocessorError>, Never>
|
||||||
private var requestHandle: SendAttachmentJoinHandleProtocol?
|
private var requestHandle: SendAttachmentJoinHandleProtocol?
|
||||||
@@ -27,18 +28,18 @@ class MediaUploadPreviewScreenViewModel: MediaUploadPreviewScreenViewModelType,
|
|||||||
actionsSubject.eraseToAnyPublisher()
|
actionsSubject.eraseToAnyPublisher()
|
||||||
}
|
}
|
||||||
|
|
||||||
init(userIndicatorController: UserIndicatorControllerProtocol,
|
init(roomProxy: JoinedRoomProxyProtocol,
|
||||||
roomProxy: JoinedRoomProxyProtocol,
|
timelineController: TimelineControllerProtocol,
|
||||||
|
userIndicatorController: UserIndicatorControllerProtocol,
|
||||||
mediaUploadingPreprocessor: MediaUploadingPreprocessor,
|
mediaUploadingPreprocessor: MediaUploadingPreprocessor,
|
||||||
title: String?,
|
title: String?,
|
||||||
url: URL,
|
url: URL,
|
||||||
threadRootEventID: String?,
|
|
||||||
shouldShowCaptionWarning: Bool) {
|
shouldShowCaptionWarning: Bool) {
|
||||||
self.userIndicatorController = userIndicatorController
|
|
||||||
self.roomProxy = roomProxy
|
self.roomProxy = roomProxy
|
||||||
|
self.timelineController = timelineController
|
||||||
|
self.userIndicatorController = userIndicatorController
|
||||||
self.mediaUploadingPreprocessor = mediaUploadingPreprocessor
|
self.mediaUploadingPreprocessor = mediaUploadingPreprocessor
|
||||||
self.url = url
|
self.url = url
|
||||||
self.threadRootEventID = threadRootEventID
|
|
||||||
|
|
||||||
// Start processing the media whilst the user is reviewing it/adding a caption.
|
// Start processing the media whilst the user is reviewing it/adding a caption.
|
||||||
processingTask = Task { await mediaUploadingPreprocessor.processMedia(at: url) }
|
processingTask = Task { await mediaUploadingPreprocessor.processMedia(at: url) }
|
||||||
|
|||||||
+3
-3
@@ -227,12 +227,12 @@ struct MediaUploadPreviewScreen_Previews: PreviewProvider, TestablePreview {
|
|||||||
static let snapshotURL = URL.picturesDirectory
|
static let snapshotURL = URL.picturesDirectory
|
||||||
static let testURL = Bundle.main.url(forResource: "AppIcon60x60@2x", withExtension: "png")
|
static let testURL = Bundle.main.url(forResource: "AppIcon60x60@2x", withExtension: "png")
|
||||||
|
|
||||||
static let viewModel = MediaUploadPreviewScreenViewModel(userIndicatorController: UserIndicatorControllerMock.default,
|
static let viewModel = MediaUploadPreviewScreenViewModel(roomProxy: JoinedRoomProxyMock(.init()),
|
||||||
roomProxy: JoinedRoomProxyMock(.init()),
|
timelineController: MockTimelineController(),
|
||||||
|
userIndicatorController: UserIndicatorControllerMock.default,
|
||||||
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
|
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
|
||||||
title: "App Icon.png",
|
title: "App Icon.png",
|
||||||
url: snapshotURL,
|
url: snapshotURL,
|
||||||
threadRootEventID: nil,
|
|
||||||
shouldShowCaptionWarning: true)
|
shouldShowCaptionWarning: true)
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
|
|||||||
@@ -115,7 +115,11 @@ class MockTimelineController: TimelineControllerProtocol {
|
|||||||
intentionalMentions: IntentionalMentions) async { }
|
intentionalMentions: IntentionalMentions) async { }
|
||||||
|
|
||||||
func sendVoiceMessage(url: URL, audioInfo: AudioInfo, waveform: [UInt16]) async -> Result<Void, TimelineProxyError> {
|
func sendVoiceMessage(url: URL, audioInfo: AudioInfo, waveform: [UInt16]) async -> Result<Void, TimelineProxyError> {
|
||||||
await timelineProxy?.sendVoiceMessage(url: url, audioInfo: audioInfo, waveform: waveform, requestHandle: { _ in }) ?? .success(())
|
if let timelineProxy {
|
||||||
|
return await timelineProxy.sendVoiceMessage(url: url, audioInfo: audioInfo, waveform: waveform) { _ in }
|
||||||
|
}
|
||||||
|
|
||||||
|
return .success(())
|
||||||
}
|
}
|
||||||
|
|
||||||
func toggleReaction(_ reaction: String, to eventID: TimelineItemIdentifier.EventOrTransactionID) async { }
|
func toggleReaction(_ reaction: String, to eventID: TimelineItemIdentifier.EventOrTransactionID) async { }
|
||||||
|
|||||||
@@ -121,12 +121,12 @@ class MediaUploadPreviewScreenViewModelTests: XCTestCase {
|
|||||||
|
|
||||||
let roomProxy = JoinedRoomProxyMock(.init())
|
let roomProxy = JoinedRoomProxyMock(.init())
|
||||||
roomProxy.timeline = timelineProxy
|
roomProxy.timeline = timelineProxy
|
||||||
viewModel = MediaUploadPreviewScreenViewModel(userIndicatorController: UserIndicatorControllerMock(),
|
viewModel = MediaUploadPreviewScreenViewModel(roomProxy: roomProxy,
|
||||||
roomProxy: roomProxy,
|
timelineController: MockTimelineController(timelineProxy: timelineProxy),
|
||||||
|
userIndicatorController: UserIndicatorControllerMock(),
|
||||||
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
|
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
|
||||||
title: "Some File",
|
title: "Some File",
|
||||||
url: url,
|
url: url,
|
||||||
threadRootEventID: nil,
|
|
||||||
shouldShowCaptionWarning: true)
|
shouldShowCaptionWarning: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user