mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 01:20:12 +00:00
Use the new preview screen when tapping media on the room and pinned events screens. (#3736)
* Use the new TimelineMediaPreview modifier on the room and pinned timeline screens. * Use the same presentation logic for all timeline media previews. * Fix a bug with the detection of the timeline end. * Send pagination requests from the media preview screen. * Add SwiftLint to the Danger workflow (it is no longer installed on the runner). * Put SwiftLint back on all of the GitHub runners too. * Set the function_parameter_count lint rule to 10. * Make sure to clean-up any previews when the coordinator is done. * Handle the viewInRoomTimeline action more appropriately.
This commit is contained in:
@@ -74,8 +74,11 @@ class MockTimelineController: TimelineControllerProtocol {
|
||||
focusLiveCallCount += 1
|
||||
callbacks.send(.isLive(true))
|
||||
}
|
||||
|
||||
|
||||
private(set) var paginateBackwardsCallCount = 0
|
||||
func paginateBackwards(requestSize: UInt16) async -> Result<Void, TimelineControllerError> {
|
||||
paginateBackwardsCallCount += 1
|
||||
|
||||
paginationState = PaginationState(backward: .paginating, forward: .timelineEndReached)
|
||||
|
||||
if client == nil {
|
||||
@@ -85,9 +88,10 @@ class MockTimelineController: TimelineControllerProtocol {
|
||||
return .success(())
|
||||
}
|
||||
|
||||
private(set) var paginateForwardsCallCount = 0
|
||||
func paginateForwards(requestSize: UInt16) async -> Result<Void, TimelineControllerError> {
|
||||
// try? await simulateForwardPagination()
|
||||
.success(())
|
||||
paginateForwardsCallCount += 1
|
||||
return .success(())
|
||||
}
|
||||
|
||||
func sendReadReceipt(for itemID: TimelineItemIdentifier) async {
|
||||
|
||||
@@ -42,7 +42,7 @@ class TimelineController: TimelineControllerProtocol {
|
||||
}
|
||||
|
||||
var timelineKind: TimelineKind {
|
||||
liveTimelineProvider.kind
|
||||
activeTimelineProvider.kind
|
||||
}
|
||||
|
||||
init(roomProxy: JoinedRoomProxyProtocol,
|
||||
|
||||
+3
-2
@@ -36,12 +36,13 @@ struct TimelineControllerFactory: TimelineControllerFactoryProtocol {
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
}
|
||||
|
||||
func buildMessageFilteredTimelineController(allowedMessageTypes: [RoomMessageEventMessageType],
|
||||
func buildMessageFilteredTimelineController(focus: TimelineFocus,
|
||||
allowedMessageTypes: [TimelineAllowedMessageType],
|
||||
presentation: TimelineKind.MediaPresentation,
|
||||
roomProxy: JoinedRoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol) async -> Result<TimelineControllerProtocol, TimelineFactoryControllerError> {
|
||||
switch await roomProxy.messageFilteredTimeline(allowedMessageTypes: allowedMessageTypes, presentation: presentation) {
|
||||
switch await roomProxy.messageFilteredTimeline(focus: focus, allowedMessageTypes: allowedMessageTypes, presentation: presentation) {
|
||||
case .success(let timelineProxy):
|
||||
return .success(TimelineController(roomProxy: roomProxy,
|
||||
timelineProxy: timelineProxy,
|
||||
|
||||
+2
-1
@@ -23,7 +23,8 @@ protocol TimelineControllerFactoryProtocol {
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol) async -> TimelineControllerProtocol?
|
||||
|
||||
func buildMessageFilteredTimelineController(allowedMessageTypes: [RoomMessageEventMessageType],
|
||||
func buildMessageFilteredTimelineController(focus: TimelineFocus,
|
||||
allowedMessageTypes: [TimelineAllowedMessageType],
|
||||
presentation: TimelineKind.MediaPresentation,
|
||||
roomProxy: JoinedRoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
|
||||
+8
-1
@@ -16,7 +16,14 @@ enum TimelineControllerCallback {
|
||||
}
|
||||
|
||||
enum TimelineControllerAction {
|
||||
case displayMediaFile(file: MediaFileHandleProxy, title: String?)
|
||||
enum TimelineViewModelKind {
|
||||
/// Use the active timeline view model.
|
||||
case active
|
||||
/// Use the newly generated view model provided.
|
||||
case new(TimelineViewModel)
|
||||
}
|
||||
|
||||
case displayMediaPreview(item: EventBasedMessageTimelineItemProtocol, timelineViewModel: TimelineViewModelKind)
|
||||
case displayLocation(body: String, geoURI: GeoURI, description: String?)
|
||||
case none
|
||||
}
|
||||
|
||||
@@ -76,7 +76,6 @@ struct RoomStateEventStringBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
// swiftlint:disable:next function_parameter_count
|
||||
func buildProfileChangeString(displayName: String?, previousDisplayName: String?,
|
||||
avatarURLString: String?, previousAvatarURLString: String?,
|
||||
member: String, memberIsYou: Bool) -> String? {
|
||||
|
||||
@@ -379,8 +379,7 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
||||
orderedReadReceipts: orderReadReceipts(eventItemProxy.readReceipts),
|
||||
encryptionAuthenticity: authenticity(eventItemProxy.shieldState)))
|
||||
}
|
||||
|
||||
// swiftlint:disable:next function_parameter_count
|
||||
|
||||
private func buildPollTimelineItem(_ question: String,
|
||||
_ pollKind: PollKind,
|
||||
_ maxSelections: UInt64,
|
||||
@@ -645,7 +644,6 @@ struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
|
||||
return buildStateTimelineItem(for: eventItemProxy, text: text, isOutgoing: isOutgoing)
|
||||
}
|
||||
|
||||
// swiftlint:disable:next function_parameter_count
|
||||
private func buildStateProfileChangeTimelineItem(for eventItemProxy: EventTimelineItemProxy,
|
||||
displayName: String?,
|
||||
previousDisplayName: String?,
|
||||
|
||||
@@ -591,8 +591,8 @@ final class TimelineProxy: TimelineProxyProtocol {
|
||||
backPaginationStatusSubject.send(.idle)
|
||||
forwardPaginationStatusSubject.send(.idle)
|
||||
case .media(let presentation):
|
||||
backPaginationStatusSubject.send(.idle)
|
||||
forwardPaginationStatusSubject.send(presentation == .mediaFilesScreen ? .timelineEndReached : .idle)
|
||||
backPaginationStatusSubject.send(presentation == .pinnedEventsScreen ? .timelineEndReached : .idle)
|
||||
forwardPaginationStatusSubject.send(presentation == .roomScreenDetached ? .idle : .timelineEndReached)
|
||||
case .pinned:
|
||||
backPaginationStatusSubject.send(.timelineEndReached)
|
||||
forwardPaginationStatusSubject.send(.timelineEndReached)
|
||||
|
||||
@@ -14,10 +14,20 @@ enum TimelineKind: Equatable {
|
||||
case detached
|
||||
case pinned
|
||||
|
||||
enum MediaPresentation { case roomScreen, mediaFilesScreen }
|
||||
enum MediaPresentation { case roomScreenLive, roomScreenDetached, pinnedEventsScreen, mediaFilesScreen }
|
||||
case media(MediaPresentation)
|
||||
}
|
||||
|
||||
enum TimelineFocus {
|
||||
case live
|
||||
case eventID(String)
|
||||
case pinned
|
||||
}
|
||||
|
||||
enum TimelineAllowedMessageType {
|
||||
case audio, file, image, video
|
||||
}
|
||||
|
||||
enum TimelineProxyError: Error {
|
||||
case sdkError(Error)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user