Skip to main content

Overview

CometChat UI Kit provides pre-built components that you can use to quickly build a chat experience. Components are organized into three types based on complexity.

Component Types

Base Components

Simple UI elements with no business logic. They display data you pass to them.
ComponentPurpose
CometChatAvatarUser/group profile images
CometChatBadgeNotification counts
CometChatStatusIndicatorOnline/offline status
CometChatDateFormatted timestamps
CometChatReceiptMessage delivery status
import CometChatUIKitSwift

// Avatar - displays user image
let avatar = CometChatAvatar()
avatar.setAvatar(avatarUrl: user.avatar, with: user.name)

// Badge - shows unread count
let badge = CometChatBadge()
badge.set(count: 5)

// Status indicator - shows online status
let status = CometChatStatusIndicator()
status.set(status: .online)

Components

UI elements with built-in business logic. They fetch data, handle actions, and emit events.
ComponentPurpose
CometChatUsersList of users
CometChatGroupsList of groups
CometChatConversationsRecent chats list
CometChatMessageListChat messages
CometChatMessageComposerMessage input
CometChatMessageHeaderChat header
CometChatCallLogsCall history
import CometChatUIKitSwift

// Users list - fetches and displays users automatically
let users = CometChatUsers()
users.set(onItemClick: { user, indexPath in
    print("Selected: \(user.name ?? "")")
})

// Conversations - shows recent chats
let conversations = CometChatConversations()
conversations.set(onItemClick: { conversation, indexPath in
    // Open chat
})

// Message list - displays messages for a user/group
let messageList = CometChatMessageList()
messageList.set(user: user)

Composite Components

Combine multiple components into complete features.
ComponentContains
CometChatMessagesMessageHeader + MessageList + MessageComposer
CometChatUsersWithMessagesUsers + Messages
CometChatGroupsWithMessagesGroups + Messages
CometChatConversationsWithMessagesConversations + Messages
import CometChatUIKitSwift

// Complete chat experience in one component
let conversationsWithMessages = CometChatConversationsWithMessages()
navigationController?.pushViewController(conversationsWithMessages, animated: true)

// Or just the messages view
let messages = CometChatMessages()
messages.user = user  // or messages.group = group
navigationController?.pushViewController(messages, animated: true)

Actions

Actions define how components respond to user interactions.

Predefined Actions

Built-in behaviors that work automatically:
// CometChatConversations has predefined actions:
// - Tap conversation → Opens messages
// - Long press → Shows options
// - Swipe → Delete conversation

let conversations = CometChatConversations()
// These work automatically!

Custom Actions

Override default behavior with your own logic:
import CometChatUIKitSwift
import CometChatSDK

let conversations = CometChatConversations()

// Override tap action
conversations.set(onItemClick: { conversation, indexPath in
    // Your custom logic
    print("Tapped: \(conversation.conversationWith?.name ?? "")")
    
    // Navigate to custom screen instead of default
    let customChatVC = MyChatViewController()
    customChatVC.conversation = conversation
    self.navigationController?.pushViewController(customChatVC, animated: true)
})

// Override long press
conversations.set(onItemLongClick: { conversation, indexPath in
    // Show custom options
    self.showCustomOptions(for: conversation)
})

// Handle errors
conversations.set(onError: { error in
    print("Error: \(error.localizedDescription)")
})

// Handle empty state
conversations.set(onEmpty: {
    print("No conversations")
})

Events

Events allow components to communicate without direct references. Subscribe to events from anywhere in your app.

Available Events

EventTriggered When
ccMessageSentMessage is sent
ccMessageEditedMessage is edited
ccMessageDeletedMessage is deleted
ccMessageReadMessage is read
ccUserBlockedUser is blocked
ccUserUnblockedUser is unblocked
ccGroupCreatedGroup is created
ccGroupDeletedGroup is deleted
ccGroupMemberAddedMember added to group
ccGroupMemberRemovedMember removed from group

Subscribe to Events

import CometChatUIKitSwift
import Combine

class ChatManager {
    
    private var cancellables = Set<AnyCancellable>()
    
    func subscribeToEvents() {
        // Message sent event
        CometChatMessageEvents.ccMessageSent
            .sink { message in
                print("Message sent: \(message.text ?? "")")
                // Update UI, analytics, etc.
            }
            .store(in: &cancellables)
        
        // Message deleted event
        CometChatMessageEvents.ccMessageDeleted
            .sink { message in
                print("Message deleted: \(message.id)")
            }
            .store(in: &cancellables)
        
        // User blocked event
        CometChatUserEvents.ccUserBlocked
            .sink { user in
                print("Blocked: \(user.name ?? "")")
            }
            .store(in: &cancellables)
        
        // Group member added
        CometChatGroupEvents.ccGroupMemberAdded
            .sink { (action, addedBy, addedUser, group) in
                print("\(addedUser.name ?? "") added to \(group.name ?? "")")
            }
            .store(in: &cancellables)
    }
    
    func unsubscribe() {
        cancellables.removeAll()
    }
}

Configurations

Customize nested components within composite components:
import CometChatUIKitSwift

// CometChatMessages contains: MessageHeader, MessageList, MessageComposer
// You can configure each one:

let messages = CometChatMessages()
messages.user = user

// Configure MessageHeader
let headerConfig = MessageHeaderConfiguration()
headerConfig.hideBackButton = false
headerConfig.set(subtitleView: { user, group in
    let label = UILabel()
    label.text = user?.status == .online ? "Online" : "Offline"
    label.textColor = user?.status == .online ? .systemGreen : .gray
    return label
})
messages.set(messageHeaderConfiguration: headerConfig)

// Configure MessageList
let listConfig = MessageListConfiguration()
listConfig.set(emptyStateText: "No messages yet")
listConfig.set(errorStateText: "Failed to load messages")
messages.set(messageListConfiguration: listConfig)

// Configure MessageComposer
let composerConfig = MessageComposerConfiguration()
composerConfig.set(placeholderText: "Type a message...")
composerConfig.hideLiveReaction = true
messages.set(messageComposerConfiguration: composerConfig)

Component Hierarchy

CometChatConversationsWithMessages
├── CometChatConversations
│   ├── CometChatListItem
│   │   ├── CometChatAvatar
│   │   ├── CometChatBadge
│   │   ├── CometChatStatusIndicator
│   │   └── CometChatDate
│   └── CometChatListBase
└── CometChatMessages
    ├── CometChatMessageHeader
    │   ├── CometChatAvatar
    │   └── CometChatStatusIndicator
    ├── CometChatMessageList
    │   ├── CometChatMessageBubble
    │   ├── CometChatReceipt
    │   └── CometChatDate
    └── CometChatMessageComposer
        ├── CometChatMediaRecorder
        └── CometChatStickerKeyboard

Quick Reference

When to Use Each Type

NeedUse
Display user avatarCometChatAvatar (Base)
Show list of usersCometChatUsers (Component)
Complete chat with user selectionCometChatUsersWithMessages (Composite)
Custom chat UIIndividual Components
Quick integrationComposite Components

Common Patterns

// Pattern 1: Quick integration with composite
let chat = CometChatConversationsWithMessages()
navigationController?.pushViewController(chat, animated: true)

// Pattern 2: Custom flow with components
let users = CometChatUsers()
users.set(onItemClick: { user, _ in
    let messages = CometChatMessages()
    messages.user = user
    self.navigationController?.pushViewController(messages, animated: true)
})

// Pattern 3: Fully custom with base components
let customCell = UITableViewCell()
let avatar = CometChatAvatar()
avatar.setAvatar(avatarUrl: user.avatar, with: user.name)
customCell.contentView.addSubview(avatar)