diff --git a/Examples/xx-messenger/Sources/ChatFeature/ChatFeature.swift b/Examples/xx-messenger/Sources/ChatFeature/ChatFeature.swift index 46cfdbfa7103029615bd525abd78d8f54dfa3a10..f2b7cdb111f146799726c55cb36ab5db8520ce49 100644 --- a/Examples/xx-messenger/Sources/ChatFeature/ChatFeature.swift +++ b/Examples/xx-messenger/Sources/ChatFeature/ChatFeature.swift @@ -18,13 +18,15 @@ public struct ChatState: Equatable, Identifiable { date: Date, senderId: Data, text: String, - status: XXModels.Message.Status + status: XXModels.Message.Status, + fileTransfer: XXModels.FileTransfer? = nil ) { self.id = id self.date = date self.senderId = senderId self.text = text self.status = status + self.fileTransfer = fileTransfer } public var id: Int64 @@ -32,6 +34,7 @@ public struct ChatState: Equatable, Identifiable { public var senderId: Data public var text: String public var status: XXModels.Message.Status + public var fileTransfer: XXModels.FileTransfer? } public init( diff --git a/Examples/xx-messenger/Sources/ChatFeature/ChatView.swift b/Examples/xx-messenger/Sources/ChatFeature/ChatView.swift index 23596dc1ceecc06d65cc6342318278f84313f03a..7c6c51f8ef4235d7d0777830cc8a4ac223ba1bf1 100644 --- a/Examples/xx-messenger/Sources/ChatFeature/ChatView.swift +++ b/Examples/xx-messenger/Sources/ChatFeature/ChatView.swift @@ -112,6 +112,10 @@ public struct ChatView: View { message.senderId == myContactId ? .trailing : .leading } + var paddingEdge: Edge.Set { + message.senderId == myContactId ? .leading : .trailing + } + var textColor: Color? { message.senderId == myContactId ? Color.white : nil } @@ -123,20 +127,38 @@ public struct ChatView: View { .font(.footnote) .frame(maxWidth: .infinity, alignment: alignment) - Text(message.text) - .foregroundColor(textColor) - .padding(.horizontal, 16) - .padding(.vertical, 8) - .background { - if message.senderId == myContactId { - RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(Color.blue) - } else { - RoundedRectangle(cornerRadius: 16, style: .continuous) - .fill(Material.ultraThick) + VStack(alignment: .leading) { + if let fileTransfer = message.fileTransfer { + Text("\(fileTransfer.name) (\(fileTransfer.type))") + if fileTransfer.progress < 1 { + ProgressView(value: fileTransfer.progress) + } + if fileTransfer.type == "image", + let data = fileTransfer.data, + let image = UIImage(data: data) { + Image(uiImage: image) + .resizable() + .scaledToFit() + .padding(.bottom, 8) } + } else { + Text(message.text) } - .frame(maxWidth: .infinity, alignment: alignment) + } + .foregroundColor(textColor) + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background { + if message.senderId == myContactId { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(Color.blue) + } else { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(Material.ultraThick) + } + } + .frame(maxWidth: .infinity, alignment: alignment) + .padding(paddingEdge, 60) } .padding(.horizontal) } @@ -178,6 +200,47 @@ public struct ChatView_Previews: PreviewProvider { text: "Hi!", status: .sent ), + .init( + id: 3, + date: Date(), + senderId: "contact-id".data(using: .utf8)!, + text: "", + status: .received, + fileTransfer: .init( + id: Data(), + contactId: Data(), + name: "received_file.jpeg", + type: "image", + progress: 0.75, + isIncoming: true + ) + ), + .init( + id: 4, + date: Date(), + senderId: "my-contact-id".data(using: .utf8)!, + text: "", + status: .sent, + fileTransfer: .init( + id: Data(), + contactId: Data(), + name: "sent_file.jpeg", + type: "image", + data: { + let bounds = CGRect(origin: .zero, size: .init(width: 4, height: 3)) + let format = UIGraphicsImageRendererFormat() + format.scale = 1 + let renderer = UIGraphicsImageRenderer(bounds: bounds, format: format) + let image = renderer.image { ctx in + UIColor.systemMint.setFill() + ctx.fill(bounds) + } + return image.jpegData(compressionQuality: 0.72) + }(), + progress: 1, + isIncoming: true + ) + ), ], failure: "Something went wrong when fetching messages from database.", sendFailure: "Something went wrong when sending message."