Cleanup, documentation and ui tests.

This commit is contained in:
David Langley
2021-09-20 08:47:28 +01:00
parent 39409f49b4
commit 205bc35285
46 changed files with 414 additions and 194 deletions
@@ -17,13 +17,6 @@
import Foundation
import Combine
enum TemplateRoomChatRoomIntializationStatus{
case notInitialized
case initialized
case failedToInitialize
}
@available(iOS 14.0, *)
class TemplateRoomChatService: TemplateRoomChatServiceProtocol {
@@ -38,7 +31,7 @@ class TemplateRoomChatService: TemplateRoomChatServiceProtocol {
// MARK: Public
private(set) var chatMessagesSubject: CurrentValueSubject<[TemplateRoomChatMessage], Never>
private(set) var roomInitialized: CurrentValueSubject<TemplateRoomChatRoomIntializationStatus, Never>
private(set) var roomInitializationStatus: CurrentValueSubject<TemplateRoomChatRoomInitializationStatus, Never>
var roomName: String? {
self.room.summary.displayname
@@ -49,9 +42,9 @@ class TemplateRoomChatService: TemplateRoomChatServiceProtocol {
self.room = room
self.eventFormatter = EventFormatter(matrixSession: room.mxSession)
self.chatMessagesSubject = CurrentValueSubject([])
self.roomInitialized = CurrentValueSubject(.notInitialized)
self.roomInitializationStatus = CurrentValueSubject(.notInitialized)
initalizeRoom()
initializeRoom()
}
deinit {
@@ -60,23 +53,23 @@ class TemplateRoomChatService: TemplateRoomChatServiceProtocol {
}
// MARK: Public
func send(message: String) {
func send(textMessage: String) {
var localEcho: MXEvent? = nil
room.sendTextMessage(message, localEcho: &localEcho, completion: { _ in })
room.sendTextMessage(textMessage, localEcho: &localEcho, completion: { _ in })
}
// MARK: Private
private func initalizeRoom(){
private func initializeRoom(){
room.state { [weak self] roomState in
guard let self = self else { return }
if let roomState = roomState {
self.roomState = roomState
self.roomInitialized.value = .initialized
self.roomInitializationStatus.value = .initialized
self.loadInitialMessages()
self.startListeningToRoomEvents()
} else {
self.roomInitialized.value = .failedToInitialize
self.roomInitializationStatus.value = .failedToInitialize
}
}
}
@@ -106,16 +99,19 @@ class TemplateRoomChatService: TemplateRoomChatServiceProtocol {
.filter({ event in
event.type == kMXEventTypeStringRoomMessage
&& event.content["msgtype"] as? String == kMXMessageTypeText
// TODO: New to our SwiftUI Template? Why not implement another message type like image?
})
.compactMap({ event -> TemplateRoomChatMessage? in
guard let eventId = event.eventId,
let eventBody = event.content["body"] as? String,
let body = event.content["body"] as? String,
let sender = senderForMessage(event: event)
else { return nil }
return TemplateRoomChatMessage(
id: eventId,
body: eventBody,
content: .text(TemplateRoomChatMessageTextContent(body: body)),
sender: sender,
timestamp: Date(timeIntervalSince1970: TimeInterval(event.originServerTs / 1000))
)
@@ -25,8 +25,10 @@ enum MockTemplateRoomChatScreenState: MockScreenState, CaseIterable {
// A case for each state you want to represent
// with specific, minimal associated data that will allow you
// mock that screen.
case noRooms
case rooms
case initializingRoom
case failedToInitializeRoom
case noMessages
case messages
/// The associated screen
var screenType: Any.Type {
@@ -37,15 +39,22 @@ enum MockTemplateRoomChatScreenState: MockScreenState, CaseIterable {
var screenView: AnyView {
let service: MockTemplateRoomChatService
switch self {
case .noRooms:
case .noMessages:
service = MockTemplateRoomChatService(messages: [])
case .rooms:
service.simulateUpdate(initializationStatus: .initialized)
case .messages:
service = MockTemplateRoomChatService()
service.simulateUpdate(initializationStatus: .initialized)
case .initializingRoom:
service = MockTemplateRoomChatService()
case .failedToInitializeRoom:
service = MockTemplateRoomChatService()
service.simulateUpdate(initializationStatus: .failedToInitialize)
}
let viewModel = TemplateRoomChatViewModel(templateRoomChatService: service)
// can simulate service and viewModel actions here if needs be.
return AnyView(TemplateRoomChat(viewModel: viewModel.context)
.addDependency(MockAvatarService.example))
}
@@ -25,22 +25,27 @@ class MockTemplateRoomChatService: TemplateRoomChatServiceProtocol {
static let amadine = TemplateRoomChatMember(id: "@amadine:matrix.org", avatarUrl: "!aaabaa:matrix.org", displayName: "Amadine")
static let mathew = TemplateRoomChatMember(id: "@mathew:matrix.org", avatarUrl: "!bbabb:matrix.org", displayName: "Mathew")
static let mockMessages = [
TemplateRoomChatMessage(id: "!0:matrix.org", body: "Shall I put it live?", sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -3)),
TemplateRoomChatMessage(id: "!1:matrix.org", body: "Yea go for it! ...and then let's head to the pub", sender: mathew, timestamp: Date(timeIntervalSinceNow: 60)),
TemplateRoomChatMessage(id: "!2:matrix.org", body: "Deal.", sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -2)),
TemplateRoomChatMessage(id: "!3:matrix.org", body: "Ok, Done. 🍻", sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -1)),
TemplateRoomChatMessage(id: "!0:matrix.org", content: .text(TemplateRoomChatMessageTextContent(body: "Shall I put it live?")) , sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -3)),
TemplateRoomChatMessage(id: "!1:matrix.org", content: .text(TemplateRoomChatMessageTextContent(body: "Yea go for it! ...and then let's head to the pub")), sender: mathew, timestamp: Date(timeIntervalSinceNow: 60)),
TemplateRoomChatMessage(id: "!2:matrix.org", content: .text(TemplateRoomChatMessageTextContent(body: "Deal.")), sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -2)),
TemplateRoomChatMessage(id: "!3:matrix.org", content: .text(TemplateRoomChatMessageTextContent(body: "Ok, Done. 🍻")), sender: amadine, timestamp: Date(timeIntervalSinceNow: 60 * -1)),
]
var roomInitializationStatus: CurrentValueSubject<TemplateRoomChatRoomInitializationStatus, Never>
var chatMessagesSubject: CurrentValueSubject<[TemplateRoomChatMessage], Never>
init(messages: [TemplateRoomChatMessage] = mockMessages) {
chatMessagesSubject = CurrentValueSubject(messages)
self.roomInitializationStatus = CurrentValueSubject(.notInitialized)
self.chatMessagesSubject = CurrentValueSubject(messages)
}
func send(message: String) {
let newMessage = TemplateRoomChatMessage(id: "!\(chatMessagesSubject.value.count):matrix.org", body: message, sender: Self.amadine, timestamp: Date())
func send(textMessage: String) {
let newMessage = TemplateRoomChatMessage(id: "!\(chatMessagesSubject.value.count):matrix.org", content: .text(TemplateRoomChatMessageTextContent(body: textMessage)), sender: Self.amadine, timestamp: Date())
self.chatMessagesSubject.value += [newMessage]
}
func simulateUpdate(initializationStatus: TemplateRoomChatRoomInitializationStatus) {
self.roomInitializationStatus.value = initializationStatus
}
func simulateUpdate(messages: [TemplateRoomChatMessage]) {
self.chatMessagesSubject.send(messages)
}
@@ -19,7 +19,8 @@ import Combine
@available(iOS 14.0, *)
protocol TemplateRoomChatServiceProtocol {
var roomInitializationStatus: CurrentValueSubject<TemplateRoomChatRoomInitializationStatus, Never> { get }
var chatMessagesSubject: CurrentValueSubject<[TemplateRoomChatMessage], Never> { get }
var roomName: String? { get }
func send(message: String)
func send(textMessage: String)
}