I'm using MessageKit here:
struct MessagesView: UIViewControllerRepresentable {
@Binding var messages: [MockMessage]
func makeUIViewController(context: Context) -> MessagesViewController {
let messagesViewController = MessagesViewController()
messagesViewController.messagesCollectionView.messagesDataSource = context.coordinator
messagesViewController.messagesCollectionView.messagesLayoutDelegate = context.coordinator
messagesViewController.messagesCollectionView.messagesDisplayDelegate = context.coordinator
messagesViewController.messagesCollectionView.messageCellDelegate = context.coordinator
return messagesViewController
}
func updateUIViewController(_ uiViewController: MessagesViewController, context: Context) {
context.coordinator.messages = messages
uiViewController.messagesCollectionView.reloadData()
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
struct Sender: SenderType {
var senderId: String
var displayName: String
}
class Coordinator: NSObject, MessagesDataSource, MessagesLayoutDelegate, MessagesDisplayDelegate, MessageCellDelegate {
var currentSender: SenderType = Sender(senderId: "123", displayName: "John Doe")
var parent: MessagesView
var messages: [MockMessage] = []
init(_ parent: MessagesView) {
self.parent = parent
}
func messageStyle(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageStyle {
let tail: MessageStyle.TailCorner = (message.sender.senderId == currentSender.senderId) ? .bottomRight : .bottomLeft
return .bubbleTail(tail, .curved)
}
func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {
return message.sender.senderId == currentSender.senderId ? .systemBlue : .lightGray
}
func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
return messages[indexPath.section]
}
func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
return messages.count
}
func avatarView(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> AvatarView {
let avatarView = AvatarView()
avatarView.backgroundColor = .red // Set a visible color to test
avatarView.frame = CGRect(x: 0, y: 0, width: 30, height: 30) // Set a frame to test
return avatarView
}
func avatarSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return CGSize(width: 30, height: 30) // Return a non-zero size to test
}
}
}
struct Sender: SenderType {
var senderId: String
var displayName: String
}
struct MockMessage: MessageType {
var messageId: String
var sender: SenderType
var sentDate: Date
var kind: MessageKind
var requiresLoadingIndicator: Bool {
// Add your logic here to determine if the message should show a loading indicator
return false // Example: return true if the message is being sent
}
init(text: String, sender: SenderType, messageId: String, date: Date, image: UIImage? = nil) {
self.messageId = messageId
self.sender = sender
self.sentDate = date
if let image = image {
let mediaItem = MockMediaItem(image: image)
self.kind = .photo(mediaItem)
} else {
self.kind = .text(text)
}
}
}
struct MockMediaItem: MediaItem {
var url: URL?
var image: UIImage?
var placeholderImage: UIImage
var size: CGSize
init(image: UIImage) {
self.image = image
self.placeholderImage = UIImage() // Use a proper placeholder image
self.size = CGSize(width: 240, height: 240)
}
}
I use the MessageKit view here:
var body: some View {
MessagesView(messages: $messageManager.messages)
.onAppear {
messageManager.initializeMockMessages()
DispatchQueue.main.asyncAfter(deadline: .now() + 8) {
if let photoMessage = messageManager.createImageMessage(image: "Corn") {
self.messageManager.messages.append(photoMessage)
self.handleAudioForImageMessage(photoMessage)
}
}
}
}
The avatarView and avatarSize functions are not being called for some reason