mirror of
https://github.com/element-hq/element-x-ios.git
synced 2025-03-10 21:39:12 +00:00
Correctly building image items for the timeline. Missing URL and way to load image.
This commit is contained in:
parent
439f09095a
commit
30378ae6a9
@ -28,6 +28,8 @@
|
|||||||
18C5745427E1D88E00D70937 /* TextRoomMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745327E1D88E00D70937 /* TextRoomMessage.swift */; };
|
18C5745427E1D88E00D70937 /* TextRoomMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745327E1D88E00D70937 /* TextRoomMessage.swift */; };
|
||||||
18C5745627E1DCA800D70937 /* RoomMessageFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */; };
|
18C5745627E1DCA800D70937 /* RoomMessageFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */; };
|
||||||
18C5745827E1EB6E00D70937 /* TimelineItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */; };
|
18C5745827E1EB6E00D70937 /* TimelineItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */; };
|
||||||
|
18DF7C2A27E23E3A00291672 /* TimelineItemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18DF7C2927E23E3A00291672 /* TimelineItemProtocol.swift */; };
|
||||||
|
18DF7C2C27E23EC000291672 /* TimelineViewFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18DF7C2B27E23EC000291672 /* TimelineViewFactory.swift */; };
|
||||||
18F2BADA27D25B4000DD1988 /* RoomTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */; };
|
18F2BADA27D25B4000DD1988 /* RoomTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */; };
|
||||||
18F2BADB27D25B4000DD1988 /* AuthenticationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7927D25B4000DD1988 /* AuthenticationCoordinator.swift */; };
|
18F2BADB27D25B4000DD1988 /* AuthenticationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7927D25B4000DD1988 /* AuthenticationCoordinator.swift */; };
|
||||||
18F2BADC27D25B4000DD1988 /* UserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7A27D25B4000DD1988 /* UserSession.swift */; };
|
18F2BADC27D25B4000DD1988 /* UserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18F2BA7A27D25B4000DD1988 /* UserSession.swift */; };
|
||||||
@ -132,6 +134,8 @@
|
|||||||
18C5745327E1D88E00D70937 /* TextRoomMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextRoomMessage.swift; sourceTree = "<group>"; };
|
18C5745327E1D88E00D70937 /* TextRoomMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextRoomMessage.swift; sourceTree = "<group>"; };
|
||||||
18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMessageFactory.swift; sourceTree = "<group>"; };
|
18C5745527E1DCA800D70937 /* RoomMessageFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMessageFactory.swift; sourceTree = "<group>"; };
|
||||||
18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemFactory.swift; sourceTree = "<group>"; };
|
18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemFactory.swift; sourceTree = "<group>"; };
|
||||||
|
18DF7C2927E23E3A00291672 /* TimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemProtocol.swift; sourceTree = "<group>"; };
|
||||||
|
18DF7C2B27E23EC000291672 /* TimelineViewFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineViewFactory.swift; sourceTree = "<group>"; };
|
||||||
18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomTimelineProvider.swift; sourceTree = "<group>"; };
|
18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomTimelineProvider.swift; sourceTree = "<group>"; };
|
||||||
18F2BA7927D25B4000DD1988 /* AuthenticationCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationCoordinator.swift; sourceTree = "<group>"; };
|
18F2BA7927D25B4000DD1988 /* AuthenticationCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationCoordinator.swift; sourceTree = "<group>"; };
|
||||||
18F2BA7A27D25B4000DD1988 /* UserSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserSession.swift; sourceTree = "<group>"; };
|
18F2BA7A27D25B4000DD1988 /* UserSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserSession.swift; sourceTree = "<group>"; };
|
||||||
@ -303,6 +307,8 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */,
|
18C5745727E1EB6E00D70937 /* TimelineItemFactory.swift */,
|
||||||
|
18DF7C2927E23E3A00291672 /* TimelineItemProtocol.swift */,
|
||||||
|
18DF7C2B27E23EC000291672 /* TimelineViewFactory.swift */,
|
||||||
18A318DB27DA42C9000867CD /* RoomTimelineViewProvider.swift */,
|
18A318DB27DA42C9000867CD /* RoomTimelineViewProvider.swift */,
|
||||||
18F9889727DB7473002F48B4 /* ImageRoomTimelineItem.swift */,
|
18F9889727DB7473002F48B4 /* ImageRoomTimelineItem.swift */,
|
||||||
18F9889D27DB752B002F48B4 /* ImageRoomTimelineView.swift */,
|
18F9889D27DB752B002F48B4 /* ImageRoomTimelineView.swift */,
|
||||||
@ -798,6 +804,7 @@
|
|||||||
18F2BB1527D25B4000DD1988 /* LoginScreenViewModelProtocol.swift in Sources */,
|
18F2BB1527D25B4000DD1988 /* LoginScreenViewModelProtocol.swift in Sources */,
|
||||||
18F2BAEB27D25B4000DD1988 /* LabelledActivityIndicatorView.swift in Sources */,
|
18F2BAEB27D25B4000DD1988 /* LabelledActivityIndicatorView.swift in Sources */,
|
||||||
18F2BAE427D25B4000DD1988 /* Presentable.swift in Sources */,
|
18F2BAE427D25B4000DD1988 /* Presentable.swift in Sources */,
|
||||||
|
18DF7C2A27E23E3A00291672 /* TimelineItemProtocol.swift in Sources */,
|
||||||
18F2BAF927D25B4000DD1988 /* SplashViewController.swift in Sources */,
|
18F2BAF927D25B4000DD1988 /* SplashViewController.swift in Sources */,
|
||||||
18F2BAE327D25B4000DD1988 /* RootRouter.swift in Sources */,
|
18F2BAE327D25B4000DD1988 /* RootRouter.swift in Sources */,
|
||||||
18F2BAE527D25B4000DD1988 /* NavigationModule.swift in Sources */,
|
18F2BAE527D25B4000DD1988 /* NavigationModule.swift in Sources */,
|
||||||
@ -853,6 +860,7 @@
|
|||||||
18C5744E27E1D84000D70937 /* MockRoomProxy.swift in Sources */,
|
18C5744E27E1D84000D70937 /* MockRoomProxy.swift in Sources */,
|
||||||
18F2BADC27D25B4000DD1988 /* UserSession.swift in Sources */,
|
18F2BADC27D25B4000DD1988 /* UserSession.swift in Sources */,
|
||||||
18F2BAEF27D25B4000DD1988 /* ActivityRequest.swift in Sources */,
|
18F2BAEF27D25B4000DD1988 /* ActivityRequest.swift in Sources */,
|
||||||
|
18DF7C2C27E23EC000291672 /* TimelineViewFactory.swift in Sources */,
|
||||||
18C5745827E1EB6E00D70937 /* TimelineItemFactory.swift in Sources */,
|
18C5745827E1EB6E00D70937 /* TimelineItemFactory.swift in Sources */,
|
||||||
18F2BAEE27D25B4000DD1988 /* Activity.swift in Sources */,
|
18F2BAEE27D25B4000DD1988 /* Activity.swift in Sources */,
|
||||||
18F2BAEC27D25B4000DD1988 /* ToastActivityPresenter.swift in Sources */,
|
18F2BAEC27D25B4000DD1988 /* ToastActivityPresenter.swift in Sources */,
|
||||||
|
@ -117,10 +117,6 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator {
|
|||||||
let parameters = RoomScreenCoordinatorParameters(roomProxy: roomProxy)
|
let parameters = RoomScreenCoordinatorParameters(roomProxy: roomProxy)
|
||||||
let coordinator = RoomScreenCoordinator(parameters: parameters)
|
let coordinator = RoomScreenCoordinator(parameters: parameters)
|
||||||
|
|
||||||
coordinator.completion = { _ in
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
self.add(childCoordinator: coordinator)
|
self.add(childCoordinator: coordinator)
|
||||||
self.navigationRouter.push(coordinator) { [weak self] in
|
self.navigationRouter.push(coordinator) { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
|
@ -34,7 +34,6 @@ final class RoomScreenCoordinator: Coordinator, Presentable {
|
|||||||
|
|
||||||
// Must be used only internally
|
// Must be used only internally
|
||||||
var childCoordinators: [Coordinator] = []
|
var childCoordinators: [Coordinator] = []
|
||||||
var completion: ((RoomScreenViewModelResult) -> Void)?
|
|
||||||
|
|
||||||
// MARK: - Setup
|
// MARK: - Setup
|
||||||
|
|
||||||
@ -43,7 +42,9 @@ final class RoomScreenCoordinator: Coordinator, Presentable {
|
|||||||
self.parameters = parameters
|
self.parameters = parameters
|
||||||
|
|
||||||
let timelineProvider = RoomTimelineProvider(roomProxy: parameters.roomProxy)
|
let timelineProvider = RoomTimelineProvider(roomProxy: parameters.roomProxy)
|
||||||
let timelineController = RoomTimelineController(timelineProvider: timelineProvider)
|
let timelineController = RoomTimelineController(timelineProvider: timelineProvider,
|
||||||
|
timelineItemFactory: TimelineItemFactory(),
|
||||||
|
timelineViewFactory: TimelineViewFactory())
|
||||||
|
|
||||||
let viewModel = RoomScreenViewModel(roomProxy: parameters.roomProxy, timelineController: timelineController)
|
let viewModel = RoomScreenViewModel(roomProxy: parameters.roomProxy, timelineController: timelineController)
|
||||||
let view = RoomScreen(context: viewModel.context)
|
let view = RoomScreen(context: viewModel.context)
|
||||||
@ -53,12 +54,7 @@ final class RoomScreenCoordinator: Coordinator, Presentable {
|
|||||||
|
|
||||||
// MARK: - Public
|
// MARK: - Public
|
||||||
func start() {
|
func start() {
|
||||||
MXLog.debug("[RoomScreenCoordinator] did start.")
|
|
||||||
roomScreenViewModel.completion = { [weak self] result in
|
|
||||||
MXLog.debug("[RoomScreenCoordinator] RoomScreenViewModel did complete with result: \(result).")
|
|
||||||
guard let self = self else { return }
|
|
||||||
self.completion?(result)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func toPresentable() -> UIViewController {
|
func toPresentable() -> UIViewController {
|
||||||
|
@ -30,8 +30,6 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
|
|||||||
private let roomProxy: RoomProxyProtocol
|
private let roomProxy: RoomProxyProtocol
|
||||||
private let timelineController: RoomTimelineControllerProtocol
|
private let timelineController: RoomTimelineControllerProtocol
|
||||||
|
|
||||||
var completion: ((RoomScreenViewModelResult) -> Void)?
|
|
||||||
|
|
||||||
// MARK: - Setup
|
// MARK: - Setup
|
||||||
|
|
||||||
init(roomProxy: RoomProxyProtocol, timelineController: RoomTimelineControllerProtocol) {
|
init(roomProxy: RoomProxyProtocol, timelineController: RoomTimelineControllerProtocol) {
|
||||||
|
@ -17,8 +17,5 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
protocol RoomScreenViewModelProtocol {
|
protocol RoomScreenViewModelProtocol {
|
||||||
|
|
||||||
var completion: ((RoomScreenViewModelResult) -> Void)? { get set }
|
|
||||||
@available(iOS 14, *)
|
|
||||||
var context: RoomScreenViewModelType.Context { get }
|
var context: RoomScreenViewModelType.Context { get }
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,20 @@ import MatrixRustSDK
|
|||||||
|
|
||||||
class RoomTimelineController: RoomTimelineControllerProtocol {
|
class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||||
private let timelineProvider: RoomTimelineProvider
|
private let timelineProvider: RoomTimelineProvider
|
||||||
|
private let timelineItemFactory: TimelineItemFactory
|
||||||
|
private let timelineViewFactory: TimelineViewFactory
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
let callbacks = PassthroughSubject<RoomTimelineControllerCallback, Never>()
|
let callbacks = PassthroughSubject<RoomTimelineControllerCallback, Never>()
|
||||||
|
|
||||||
private(set) var timelineItems = [RoomTimelineViewProvider]()
|
private(set) var timelineItems = [RoomTimelineViewProvider]()
|
||||||
|
|
||||||
init(timelineProvider: RoomTimelineProvider) {
|
init(timelineProvider: RoomTimelineProvider,
|
||||||
|
timelineItemFactory: TimelineItemFactory,
|
||||||
|
timelineViewFactory: TimelineViewFactory) {
|
||||||
self.timelineProvider = timelineProvider
|
self.timelineProvider = timelineProvider
|
||||||
|
self.timelineItemFactory = timelineItemFactory
|
||||||
|
self.timelineViewFactory = timelineViewFactory
|
||||||
|
|
||||||
self.timelineProvider.callbacks.sink { [weak self] callback in
|
self.timelineProvider.callbacks.sink { [weak self] callback in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
@ -63,13 +69,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
|||||||
let areMessagesFromTheSameSender = (previousMessage?.sender == message.sender)
|
let areMessagesFromTheSameSender = (previousMessage?.sender == message.sender)
|
||||||
let shouldShowSenderDetails = !areMessagesFromTheSameSender || !areMessagesFromTheSameDay
|
let shouldShowSenderDetails = !areMessagesFromTheSameSender || !areMessagesFromTheSameDay
|
||||||
|
|
||||||
let item = TextRoomTimelineItem(id: message.id,
|
let timelineItem = timelineItemFactory.buildTimelineItemFor(message, showSenderDetails: shouldShowSenderDetails)
|
||||||
senderDisplayName: message.sender,
|
newTimelineItems.append(timelineViewFactory.buildTimelineViewFor(timelineItem))
|
||||||
text: message.content,
|
|
||||||
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
|
|
||||||
shouldShowSenderDetails: shouldShowSenderDetails)
|
|
||||||
|
|
||||||
newTimelineItems.append(RoomTimelineViewProvider.text(item))
|
|
||||||
|
|
||||||
previousMessage = message
|
previousMessage = message
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,10 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct ImageRoomTimelineItem: Identifiable, Equatable {
|
struct ImageRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
|
||||||
let id: String
|
let id: String
|
||||||
|
let senderDisplayName: String
|
||||||
let text: String
|
let text: String
|
||||||
|
let timestamp: String
|
||||||
|
let shouldShowSenderDetails: Bool
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,10 @@ struct ImageRoomTimelineView: View {
|
|||||||
if let loadedImage = loadedImage {
|
if let loadedImage = loadedImage {
|
||||||
Image(uiImage: loadedImage)
|
Image(uiImage: loadedImage)
|
||||||
} else {
|
} else {
|
||||||
ProgressView()
|
VStack {
|
||||||
|
Image(systemName: "photo")
|
||||||
|
ProgressView()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct SeparatorRoomTimelineItem: Identifiable, Equatable {
|
struct SeparatorRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
|
||||||
let id: String
|
let id: String
|
||||||
let text: String
|
let text: String
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct TextRoomTimelineItem: Identifiable, Equatable {
|
struct TextRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
|
||||||
let id: String
|
let id: String
|
||||||
let senderDisplayName: String
|
let senderDisplayName: String
|
||||||
let text: String
|
let text: String
|
||||||
|
@ -9,7 +9,22 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct TimelineItemFactory {
|
struct TimelineItemFactory {
|
||||||
func buildTimelineItemFor(_ message: RoomMessageProtocol) {
|
func buildTimelineItemFor(_ roomMessage: RoomMessageProtocol, showSenderDetails: Bool) -> TimelineItemProtocol {
|
||||||
|
switch roomMessage {
|
||||||
|
case let message as TextRoomMessage:
|
||||||
|
return TextRoomTimelineItem(id: message.id,
|
||||||
|
senderDisplayName: message.sender,
|
||||||
|
text: message.content,
|
||||||
|
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
|
||||||
|
shouldShowSenderDetails: showSenderDetails)
|
||||||
|
case let message as ImageRoomMessage:
|
||||||
|
return ImageRoomTimelineItem(id: message.id,
|
||||||
|
senderDisplayName: message.sender,
|
||||||
|
text: message.content,
|
||||||
|
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
|
||||||
|
shouldShowSenderDetails: showSenderDetails)
|
||||||
|
default:
|
||||||
|
fatalError("Unknown room message.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// TimelineItemProtocol.swift
|
||||||
|
// ElementX
|
||||||
|
//
|
||||||
|
// Created by Stefan Ceriu on 16/03/2022.
|
||||||
|
// Copyright © 2022 Element. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
protocol TimelineItemProtocol {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// TimelineViewFactory.swift
|
||||||
|
// ElementX
|
||||||
|
//
|
||||||
|
// Created by Stefan Ceriu on 16/03/2022.
|
||||||
|
// Copyright © 2022 Element. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct TimelineViewFactory {
|
||||||
|
func buildTimelineViewFor(_ timelineItem: TimelineItemProtocol) -> RoomTimelineViewProvider {
|
||||||
|
switch timelineItem {
|
||||||
|
case let textItem as TextRoomTimelineItem:
|
||||||
|
return .text(textItem)
|
||||||
|
case let imageItem as ImageRoomTimelineItem:
|
||||||
|
return .image(imageItem)
|
||||||
|
default:
|
||||||
|
fatalError("Unknown timeline item")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user