Styling functions in MessageKit not being called

27 Views Asked by At

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

0

There are 0 best solutions below