Added logout option, room list on home screen, made various methods asynchronous,

This commit is contained in:
Stefan Ceriu
2022-02-22 09:18:46 +02:00
parent d90738e1e4
commit b53efb4869
12 changed files with 522 additions and 71 deletions
@@ -0,0 +1,29 @@
//
// MockRoomModel.swift
// ElementX
//
// Created by Stefan Ceriu on 17.02.2022.
//
import Foundation
import UIKit
struct MockRoomModel: RoomModelProtocol {
let identifier = UUID().uuidString
let name: String? = nil
let displayName: String
let topic: String? = nil
let lastMessage: String? = "Last message"
let avatarURL: URL? = nil
let isDirect = Bool.random()
let isSpace = Bool.random()
let isPublic = Bool.random()
let isEncrypted = Bool.random()
func getAvatar(_ completion: (Result<UIImage?, Error>) -> Void) {
completion(.success(UIImage(systemName: "wand.and.stars")))
}
}
@@ -7,7 +7,86 @@
import Foundation
import UIKit
import MatrixRustSDK
struct RoomModel {
let displayName: String
enum RoomModelError: Error {
case failedRetrievingAvatar
}
struct RoomModel: RoomModelProtocol {
private let room: Room
init(room: Room) {
self.room = room
}
var identifier: String {
return room.identifier()
}
var isDirect: Bool {
return room.isDirect()
}
var isPublic: Bool {
return room.isPublic()
}
var isSpace: Bool {
return room.isSpace()
}
var isEncrypted: Bool {
return room.isEncrypted()
}
var name: String? {
return room.name()
}
var displayName: String {
do {
return try room.displayName()
} catch {
MXLog.error("Failed retrieving room name with error: \(error)")
return "Error"
}
}
var topic: String? {
return room.topic()
}
var lastMessage: String? {
guard let lastMessage = try? room.messages().last else {
return "Last message unknown"
}
return "\(lastMessage.sender()): \(lastMessage.content())"
}
var avatarURL: URL? {
guard let urlString = room.avatarUrl() else {
return nil
}
return URL(string: urlString)
}
func getAvatar(_ completion: @escaping (Result<UIImage?, Error>) -> Void) {
DispatchQueue.global(qos: .background).async {
do {
let avatarData = try room.avatar()
DispatchQueue.main.async {
completion(.success(UIImage(data: Data(bytes: avatarData, count: avatarData.count))))
}
} catch {
DispatchQueue.main.async {
completion(.failure(RoomModelError.failedRetrievingAvatar))
}
}
}
}
}
@@ -0,0 +1,26 @@
//
// RoomModelProtocol.swift
// ElementX
//
// Created by Stefan Ceriu on 17.02.2022.
//
import UIKit
protocol RoomModelProtocol {
var identifier: String { get }
var isDirect: Bool { get }
var isPublic: Bool { get }
var isSpace: Bool { get }
var isEncrypted: Bool { get }
var displayName: String { get }
var name: String? { get }
var topic: String? { get }
var lastMessage: String? { get }
var avatarURL: URL? { get }
func getAvatar(_ completion: @escaping (Result<UIImage?, Error>) -> Void)
}