mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
Move message forwarding out of the flow coordinator. (#2738)
This commit is contained in:
+37
-23
@@ -20,8 +20,10 @@ import SwiftUI
|
||||
typealias MessageForwardingScreenViewModelType = StateStoreViewModel<MessageForwardingScreenViewState, MessageForwardingScreenViewAction>
|
||||
|
||||
class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, MessageForwardingScreenViewModelProtocol {
|
||||
private let roomSummaryProvider: RoomSummaryProviderProtocol?
|
||||
private let sourceRoomID: String
|
||||
private let forwardingItem: MessageForwardingItem
|
||||
private let clientProxy: ClientProxyProtocol
|
||||
private let roomSummaryProvider: RoomSummaryProviderProtocol
|
||||
private let userIndicatorController: UserIndicatorControllerProtocol
|
||||
|
||||
private var actionsSubject: PassthroughSubject<MessageForwardingScreenViewModelAction, Never> = .init()
|
||||
|
||||
@@ -29,11 +31,15 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
actionsSubject.eraseToAnyPublisher()
|
||||
}
|
||||
|
||||
init(roomSummaryProvider: RoomSummaryProviderProtocol,
|
||||
mediaProvider: MediaProviderProtocol,
|
||||
sourceRoomID: String) {
|
||||
init(forwardingItem: MessageForwardingItem,
|
||||
clientProxy: ClientProxyProtocol,
|
||||
roomSummaryProvider: RoomSummaryProviderProtocol,
|
||||
userIndicatorController: UserIndicatorControllerProtocol,
|
||||
mediaProvider: MediaProviderProtocol) {
|
||||
self.forwardingItem = forwardingItem
|
||||
self.clientProxy = clientProxy
|
||||
self.roomSummaryProvider = roomSummaryProvider
|
||||
self.sourceRoomID = sourceRoomID
|
||||
self.userIndicatorController = userIndicatorController
|
||||
|
||||
super.init(initialViewState: MessageForwardingScreenViewState(), imageProvider: mediaProvider)
|
||||
|
||||
@@ -49,7 +55,7 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
.removeDuplicates()
|
||||
.sink { [weak self] searchQuery in
|
||||
guard let self else { return }
|
||||
self.roomSummaryProvider?.setFilter(.search(query: searchQuery))
|
||||
self.roomSummaryProvider.setFilter(.search(query: searchQuery))
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
@@ -60,13 +66,9 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
switch viewAction {
|
||||
case .cancel:
|
||||
actionsSubject.send(.dismiss)
|
||||
roomSummaryProvider?.setFilter(.all(filters: []))
|
||||
roomSummaryProvider.setFilter(.all(filters: []))
|
||||
case .send:
|
||||
guard let roomID = state.selectedRoomID else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
actionsSubject.send(.send(roomID: roomID))
|
||||
Task { await forward() }
|
||||
case .selectRoom(let roomID):
|
||||
state.selectedRoomID = roomID
|
||||
case .reachedTop:
|
||||
@@ -79,11 +81,6 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
// MARK: - Private
|
||||
|
||||
private func updateRooms() {
|
||||
guard let roomSummaryProvider else {
|
||||
MXLog.error("Room summary provider unavailable")
|
||||
return
|
||||
}
|
||||
|
||||
MXLog.verbose("Updating rooms")
|
||||
|
||||
var rooms = [MessageForwardingRoom]()
|
||||
@@ -93,7 +90,7 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
case .empty, .invalidated:
|
||||
continue
|
||||
case .filled(let details):
|
||||
if details.id == sourceRoomID {
|
||||
if details.id == forwardingItem.roomID {
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -114,10 +111,6 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
/// we just need the respective bounds to be there to trigger a next page load or
|
||||
/// a reset to just one page
|
||||
private func updateVisibleRange(edge: UIRectEdge) {
|
||||
guard let roomSummaryProvider else {
|
||||
return
|
||||
}
|
||||
|
||||
switch edge {
|
||||
case .top:
|
||||
roomSummaryProvider.updateVisibleRange(0..<0)
|
||||
@@ -128,4 +121,25 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
private func forward() async {
|
||||
guard let roomID = state.selectedRoomID else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
guard let targetRoomProxy = await clientProxy.roomForIdentifier(roomID) else {
|
||||
MXLog.error("Failed retrieving room to forward to with id: \(roomID)")
|
||||
userIndicatorController.submitIndicator(UserIndicator(title: L10n.errorUnknown))
|
||||
return
|
||||
}
|
||||
|
||||
if case .failure(let error) = await targetRoomProxy.timeline.sendMessageEventContent(forwardingItem.content) {
|
||||
MXLog.error("Failed forwarding message with error: \(error)")
|
||||
userIndicatorController.submitIndicator(UserIndicator(title: L10n.errorUnknown))
|
||||
return
|
||||
}
|
||||
|
||||
// Timelines are cached - the local echo will be visible when fetching the room by its ID.
|
||||
actionsSubject.send(.sent(roomID: roomID))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user