Use dynamicMembers for StoreState for single source of truth. Fix bubble grouping and add send message function.

This commit is contained in:
David Langley
2021-09-16 22:09:32 +01:00
parent 62c528ecc0
commit cb7b591ff6
28 changed files with 285 additions and 180 deletions
@@ -18,32 +18,30 @@ import UIKit
struct TemplateRoomChatBubble {
var id: String
var senderAvatar: AvatarInputProtocol
var senderDisplayName: String?
let id: String
let sender: TemplateRoomChatMember
var items: [TemplateRoomChatBubbleItem]
}
extension TemplateRoomChatBubble: Identifiable { }
enum TemplateRoomChatBubbleItem {
var id: Self { self }
case message(TemplateRoomChatBubbleMessageItem)
case image(TemplateRoomChatBubbleImageItem)
struct TemplateRoomChatBubbleItem {
let id: String
var timestamp: Date
var content: TemplateRoomChatBubbleItemContent
}
extension TemplateRoomChatBubbleItem: Hashable, Identifiable {}
extension TemplateRoomChatBubbleItem: Identifiable { }
struct TemplateRoomChatBubbleMessageItem {
var id: String
enum TemplateRoomChatBubbleItemContent {
case message(TemplateRoomChatBubbleMessageContent)
case image(TemplateRoomChatBubbleImageContent)
}
struct TemplateRoomChatBubbleMessageContent {
var body: String
}
extension TemplateRoomChatBubbleMessageItem: Hashable {}
struct TemplateRoomChatBubbleImageItem {
var id: String
struct TemplateRoomChatBubbleImageContent {
var image: UIImage
}
extension TemplateRoomChatBubbleImageItem: Hashable {}
@@ -20,6 +20,7 @@ struct TemplateRoomChatMessage {
let id: String
let body: String
let sender: TemplateRoomChatMember
let timestamp: Date
}
extension TemplateRoomChatMessage: Identifiable {}
@@ -17,5 +17,6 @@
import Foundation
enum TemplateRoomChatStateAction {
case clearMessageInput
case updateBubbles([TemplateRoomChatBubble])
}
@@ -17,6 +17,7 @@
import Foundation
enum TemplateRoomChatViewAction {
case sendMessage
case cancel
case done
}
@@ -17,6 +17,14 @@
import Foundation
struct TemplateRoomChatViewState: BindableState {
let roomName: String?
var bubbles: [TemplateRoomChatBubble]
var bindings: TemplateRoomChatViewModelBindings
}
extension TemplateRoomChatViewState {
var sendButtonEnabled: Bool {
!bindings.messageInput.isEmpty
}
}