vector-im/element-x-ios/issues/53 - Various tweaks following code review

This commit is contained in:
Stefan Ceriu
2022-05-25 16:51:48 +03:00
committed by Stefan Ceriu
parent 73f507045b
commit 8fec97217f
23 changed files with 172 additions and 126 deletions
@@ -12,7 +12,7 @@ import UIKit
class RoomTimelineController: RoomTimelineControllerProtocol {
private let timelineProvider: RoomTimelineProviderProtocol
private let timelineItemFactory: RoomTimelineItemFactory
private let timelineItemFactory: RoomTimelineItemFactoryProtocol
private let mediaProvider: MediaProviderProtocol
private let memberDetailProvider: MemberDetailProviderProtocol
@@ -23,7 +23,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
private(set) var timelineItems = [RoomTimelineItemProtocol]()
init(timelineProvider: RoomTimelineProviderProtocol,
timelineItemFactory: RoomTimelineItemFactory,
timelineItemFactory: RoomTimelineItemFactoryProtocol,
mediaProvider: MediaProviderProtocol,
memberDetailProvider: MemberDetailProviderProtocol) {
self.timelineProvider = timelineProvider
@@ -35,13 +35,13 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
.callbacks
.receive(on: DispatchQueue.main)
.sink { [weak self] callback in
guard let self = self else { return }
switch callback {
case .updatedMessages:
self.updateTimelineItems()
}
}.store(in: &cancellables)
guard let self = self else { return }
switch callback {
case .updatedMessages:
self.updateTimelineItems()
}
}.store(in: &cancellables)
updateTimelineItems()
@@ -59,7 +59,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
}
func processItemAppearance(_ itemId: String) async {
guard let timelineItem = self.timelineItems.filter({ $0.id == itemId}).first else {
guard let timelineItem = timelineItems.first(where: { $0.id == itemId }) else {
return
}
@@ -98,8 +98,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
var newTimelineItems = [RoomTimelineItemProtocol]()
var previousMessage: RoomMessageProtocol?
for message in self.timelineProvider.messages {
let areMessagesFromTheSameDay = self.haveSameDay(lhs: previousMessage, rhs: message)
for message in timelineProvider.messages {
let areMessagesFromTheSameDay = haveSameDay(lhs: previousMessage, rhs: message)
let shouldAddSectionHeader = !areMessagesFromTheSameDay
if shouldAddSectionHeader {
@@ -110,14 +110,14 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
let areMessagesFromTheSameSender = (previousMessage?.sender == message.sender)
let shouldShowSenderDetails = !areMessagesFromTheSameSender || !areMessagesFromTheSameDay
newTimelineItems.append(timelineItemFactory.buildTimelineItemFor(message, showSenderDetails: shouldShowSenderDetails))
newTimelineItems.append(timelineItemFactory.buildTimelineItemFor(message: message, showSenderDetails: shouldShowSenderDetails))
previousMessage = message
}
self.timelineItems = newTimelineItems
timelineItems = newTimelineItems
self.callbacks.send(.updatedTimelineItems)
callbacks.send(.updatedTimelineItems)
}
private func haveSameDay(lhs: RoomMessageProtocol?, rhs: RoomMessageProtocol?) -> Bool {
@@ -1,5 +1,5 @@
//
// TimelineItemFactory.swift
// RoomTimelineItemFactory.swift
// ElementX
//
// Created by Stefan Ceriu on 16/03/2022.
@@ -9,8 +9,7 @@
import Foundation
import UIKit
@MainActor
struct RoomTimelineItemFactory {
struct RoomTimelineItemFactory: RoomTimelineItemFactoryProtocol {
private let mediaProvider: MediaProviderProtocol
private let memberDetailProvider: MemberDetailProviderProtocol
private let attributedStringBuilder: AttributedStringBuilderProtocol
@@ -23,12 +22,12 @@ struct RoomTimelineItemFactory {
self.attributedStringBuilder = attributedStringBuilder
}
func buildTimelineItemFor(_ roomMessage: RoomMessageProtocol, showSenderDetails: Bool) -> RoomTimelineItemProtocol {
let displayName = memberDetailProvider.displayNameForUserId(roomMessage.sender)
let avatarURL = memberDetailProvider.avatarURLForUserId(roomMessage.sender)
func buildTimelineItemFor(message: RoomMessageProtocol, showSenderDetails: Bool) -> RoomTimelineItemProtocol {
let displayName = memberDetailProvider.displayNameForUserId(message.sender)
let avatarURL = memberDetailProvider.avatarURLForUserId(message.sender)
let avatarImage = mediaProvider.imageFromURL(avatarURL)
switch roomMessage {
switch message {
case let message as TextRoomMessage:
return buildTextTimelineItemFromMessage(message, showSenderDetails, displayName, avatarImage)
case let message as ImageRoomMessage:
@@ -0,0 +1,14 @@
//
// RoomTimelineItemFactoryProtocol.swift
// ElementX
//
// Created by Stefan Ceriu on 26/05/2022.
// Copyright © 2022 element.io. All rights reserved.
//
import Foundation
@MainActor
protocol RoomTimelineItemFactoryProtocol {
func buildTimelineItemFor(message: RoomMessageProtocol, showSenderDetails: Bool) -> RoomTimelineItemProtocol
}
@@ -1,5 +1,5 @@
//
// TimelineViewFactory.swift
// RoomTimelineViewFactory.swift
// ElementX
//
// Created by Stefan Ceriu on 16/03/2022.
@@ -8,9 +8,8 @@
import Foundation
@MainActor
struct RoomTimelineViewFactory {
func buildTimelineViewFor(_ timelineItem: RoomTimelineItemProtocol) -> RoomTimelineViewProvider {
struct RoomTimelineViewFactory: RoomTimelineViewFactoryProtocol {
func buildTimelineViewFor(timelineItem: RoomTimelineItemProtocol) -> RoomTimelineViewProvider {
switch timelineItem {
case let item as TextRoomTimelineItem:
return .text(item)
@@ -0,0 +1,14 @@
//
// RoomTimelineViewFactoryProtocol.swift
// ElementX
//
// Created by Stefan Ceriu on 26/05/2022.
// Copyright © 2022 element.io. All rights reserved.
//
import Foundation
@MainActor
protocol RoomTimelineViewFactoryProtocol {
func buildTimelineViewFor(timelineItem: RoomTimelineItemProtocol) -> RoomTimelineViewProvider
}