mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-30 21:26:57 +02:00
Cleanup, documentation and ui tests.
This commit is contained in:
+13
-17
@@ -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))
|
||||
)
|
||||
|
||||
+14
-5
@@ -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))
|
||||
}
|
||||
|
||||
+12
-7
@@ -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)
|
||||
}
|
||||
|
||||
+2
-1
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user