Skip to content

Commit 22659ae

Browse files
committed
Added protocols for the timeline and memberDetails providers.
1 parent 2eae0f0 commit 22659ae

File tree

7 files changed

+62
-34
lines changed

7 files changed

+62
-34
lines changed

ElementX.xcodeproj/project.pbxproj

+9-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
/* Begin PBXBuildFile section */
1010
182BC48127C4EBBB00A30C33 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 182BC48027C4EBBB00A30C33 /* Kingfisher */; };
1111
183E023227E4A3CF00903BED /* PlaceholderAvatarImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183E023127E4A3CF00903BED /* PlaceholderAvatarImage.swift */; };
12+
183E023427E4A73C00903BED /* MemberDetailsProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183E023327E4A73C00903BED /* MemberDetailsProviderProtocol.swift */; };
13+
183E023627E4A79D00903BED /* RoomTimelineProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183E023527E4A79D00903BED /* RoomTimelineProviderProtocol.swift */; };
1214
184B31DF27D898960075A669 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 184B31DE27D898960075A669 /* Introspect */; };
1315
1850253F27B6918D002E6B18 /* ElementXTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1850253E27B6918D002E6B18 /* ElementXTests.swift */; };
1416
1850254927B6918D002E6B18 /* ElementXUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1850254827B6918D002E6B18 /* ElementXUITests.swift */; };
@@ -123,6 +125,8 @@
123125
/* Begin PBXFileReference section */
124126
181716DC27E11EF1002B8E3F /* matrix-rust-components-swift */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "matrix-rust-components-swift"; path = "../matrix-rust-components-swift"; sourceTree = "<group>"; };
125127
183E023127E4A3CF00903BED /* PlaceholderAvatarImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PlaceholderAvatarImage.swift; path = ../../../../../../../../Desktop/PlaceholderAvatarImage.swift; sourceTree = "<group>"; };
128+
183E023327E4A73C00903BED /* MemberDetailsProviderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberDetailsProviderProtocol.swift; sourceTree = "<group>"; };
129+
183E023527E4A79D00903BED /* RoomTimelineProviderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineProviderProtocol.swift; sourceTree = "<group>"; };
126130
1850252427B6918C002E6B18 /* ElementX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ElementX.app; sourceTree = BUILT_PRODUCTS_DIR; };
127131
1850253A27B6918D002E6B18 /* ElementXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ElementXTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
128132
1850253E27B6918D002E6B18 /* ElementXTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementXTests.swift; sourceTree = "<group>"; };
@@ -399,6 +403,7 @@
399403
18DF7C5127E4753A00291672 /* Members */ = {
400404
isa = PBXGroup;
401405
children = (
406+
183E023327E4A73C00903BED /* MemberDetailsProviderProtocol.swift */,
402407
18DF7C5227E4754500291672 /* MemberDetailsProvider.swift */,
403408
);
404409
path = Members;
@@ -418,10 +423,11 @@
418423
18F2BA7627D25B4000DD1988 /* Timeline */ = {
419424
isa = PBXGroup;
420425
children = (
426+
183E023527E4A79D00903BED /* RoomTimelineProviderProtocol.swift */,
427+
18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */,
421428
18F2BB2927D2648900DD1988 /* RoomTimelineControllerProtocol.swift */,
422429
18F2BB1927D25BE800DD1988 /* RoomTimelineController.swift */,
423430
18F2BB2727D2647A00DD1988 /* MockRoomTimelineController.swift */,
424-
18F2BA7727D25B4000DD1988 /* RoomTimelineProvider.swift */,
425431
18DF7C3427E4670600291672 /* TimelineItems */,
426432
);
427433
path = Timeline;
@@ -858,6 +864,7 @@
858864
18DF7C4127E4670600291672 /* RoomTimelineViewProvider.swift in Sources */,
859865
18F2BB0F27D25B4000DD1988 /* RoomScreen.swift in Sources */,
860866
18F2BAFF27D25B4000DD1988 /* HomeScreenModels.swift in Sources */,
867+
183E023427E4A73C00903BED /* MemberDetailsProviderProtocol.swift in Sources */,
861868
18DF7C4E27E4673E00291672 /* DecorationTimelineItemProtocol.swift in Sources */,
862869
18F2BB1527D25B4000DD1988 /* LoginScreenViewModelProtocol.swift in Sources */,
863870
18F2BAEB27D25B4000DD1988 /* LabelledActivityIndicatorView.swift in Sources */,
@@ -870,6 +877,7 @@
870877
18F2BB1227D25B4000DD1988 /* LoginScreenViewModel.swift in Sources */,
871878
18F2BAE727D25B4000DD1988 /* RoundedToastView.swift in Sources */,
872879
18F2BAF227D25B4000DD1988 /* WeakDictionaryKeyReference.swift in Sources */,
880+
183E023627E4A79D00903BED /* RoomTimelineProviderProtocol.swift in Sources */,
873881
18DF7C4727E4670600291672 /* TextRoomTimelineItem.swift in Sources */,
874882
18F2BAE027D25B4000DD1988 /* NavigationRouter.swift in Sources */,
875883
18F2BAF627D25B4000DD1988 /* Coordinator.swift in Sources */,

ElementX/Sources/Services/Room/Members/MemberDetailsProvider.swift

+1-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,7 @@
88

99
import Foundation
1010

11-
enum MemberDetailsProviderError: Error {
12-
case invalidRoomProxy
13-
case failedRetrievingUserAvatarURL
14-
}
15-
16-
class MemberDetailsProvider {
11+
class MemberDetailsProvider: MemberDetailsProviderProtocol {
1712
private let roomProxy: RoomProxyProtocol?
1813
private let processingQueue = DispatchQueue(label: "MemberDetailsProviderProcessingQueue")
1914
private var memberAvatars = [String: String]()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// MemberDetailsProviderProtocol.swift
3+
// ElementX
4+
//
5+
// Created by Stefan Ceriu on 18/03/2022.
6+
// Copyright © 2022 Element. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
enum MemberDetailsProviderError: Error {
12+
case invalidRoomProxy
13+
case failedRetrievingUserAvatarURL
14+
}
15+
16+
protocol MemberDetailsProviderProtocol {
17+
func avatarURLForUserId(_ userId: String) -> String?
18+
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void)
19+
}

ElementX/Sources/Services/Timeline/RoomTimelineController.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@ import Foundation
1010
import Combine
1111

1212
class RoomTimelineController: RoomTimelineControllerProtocol {
13-
private let timelineProvider: RoomTimelineProvider
13+
private let timelineProvider: RoomTimelineProviderProtocol
1414
private let timelineItemFactory: RoomTimelineItemFactory
1515
private let mediaProvider: MediaProviderProtocol
16-
private let memberDetailsProvider: MemberDetailsProvider
16+
private let memberDetailsProvider: MemberDetailsProviderProtocol
1717

1818
private var cancellables = Set<AnyCancellable>()
1919

2020
let callbacks = PassthroughSubject<RoomTimelineControllerCallback, Never>()
2121

2222
private(set) var timelineItems = [RoomTimelineItemProtocol]()
2323

24-
init(timelineProvider: RoomTimelineProvider,
24+
init(timelineProvider: RoomTimelineProviderProtocol,
2525
timelineItemFactory: RoomTimelineItemFactory,
2626
mediaProvider: MediaProviderProtocol,
27-
memberDetailsProvider: MemberDetailsProvider) {
27+
memberDetailsProvider: MemberDetailsProviderProtocol) {
2828
self.timelineProvider = timelineProvider
2929
self.timelineItemFactory = timelineItemFactory
3030
self.mediaProvider = mediaProvider

ElementX/Sources/Services/Timeline/RoomTimelineProvider.swift

+1-21
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,7 @@
99
import Foundation
1010
import Combine
1111

12-
enum RoomTimelineCallback {
13-
case addedMessage
14-
}
15-
16-
enum RoomTimelineError: Error {
17-
case generic
18-
}
19-
20-
class RoomTimelineProvider {
12+
class RoomTimelineProvider: RoomTimelineProviderProtocol {
2113
private let roomProxy: RoomProxyProtocol
2214
private var cancellables = Set<AnyCancellable>()
2315

@@ -51,16 +43,4 @@ class RoomTimelineProvider {
5143
}
5244
}
5345
}
54-
55-
// This is probably not the right place for this method. We need a RoomMemberProvider or something
56-
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, RoomTimelineError>) -> Void) {
57-
self.roomProxy.avatarURLForUserId(userId) { result in
58-
switch result {
59-
case .success(let avatarURL):
60-
completion(.success(avatarURL))
61-
case .failure:
62-
completion(.failure(.generic))
63-
}
64-
}
65-
}
6646
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// RoomTimelineProviderProtocol.swift
3+
// ElementX
4+
//
5+
// Created by Stefan Ceriu on 18/03/2022.
6+
// Copyright © 2022 Element. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import Combine
11+
12+
enum RoomTimelineCallback {
13+
case addedMessage
14+
}
15+
16+
enum RoomTimelineError: Error {
17+
case generic
18+
}
19+
20+
protocol RoomTimelineProviderProtocol {
21+
var callbacks: PassthroughSubject<RoomTimelineCallback, Never> { get }
22+
23+
var messages: [RoomMessageProtocol] { get }
24+
25+
func paginateBackwards(_ count: UInt, callback: ((Result<([RoomMessageProtocol]), RoomTimelineError>) -> Void)?)
26+
}

ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import UIKit
1111

1212
struct RoomTimelineItemFactory {
1313
private let mediaProvider: MediaProviderProtocol
14-
private let memberDetailsProvider: MemberDetailsProvider
14+
private let memberDetailsProvider: MemberDetailsProviderProtocol
1515

1616
init(mediaProvider: MediaProviderProtocol,
17-
memberDetailsProvider: MemberDetailsProvider) {
17+
memberDetailsProvider: MemberDetailsProviderProtocol) {
1818
self.mediaProvider = mediaProvider
1919
self.memberDetailsProvider = memberDetailsProvider
2020
}

0 commit comments

Comments
 (0)