Skip to main content
Enable users to start a private one-on-one chat with a group member directly from a group chat screen using CometChat’s UIKit for iOS.

Overview

The Message Privately feature allows users to long-press a message in a group chat and select Message Privately to transition into a private conversation with the original sender. This streamlines side discussions and follow-ups without requiring manual user searches.

Prerequisites

Before implementing this feature, ensure you have:
  • Completed Getting Started setup
  • CometChat UIKit v5+ installed via CocoaPods or Swift Package Manager
  • Valid CometChat App ID, Region, and Auth Key
  • Functional group chat via CometChatMessageList
  • A one-on-one chat screen (CometChatMessages or custom) and navigation flow configured

Components

ComponentDescription
CometChatMessageListDisplays group messages and handles long-press to show options
CometChatMessageOptionDefines the Message Privately option in the context menu
MessageDataSourceSupplies the messagePrivatelyOption in the options array
CometChatMessageListViewModelManages UI state, including hideMessagePrivatelyOption
CometChatMessagesEntry point for rendering or pushing the private chat interface
CometChatUIKit.getUser(uid:)Retrieves the User object for the selected message sender
CometChatUIKit.getConversationWith(user:)Creates or fetches the 1-on-1 conversation instance
UIViewController (Navigation)Pushes or presents the private chat screen (CometChatMessages)

Integration Steps

Step 1: Control Option Visibility via ViewModel

Dynamically show or hide Message Privately based on app context:
import CometChatUIKitSwift

// Control visibility of the Message Privately option
public var hideMessagePrivatelyOption: Bool = false {
    didSet {
        // Sync with view model
        viewModel.hideMessagePrivatelyOption = hideMessagePrivatelyOption
    }
}
This ensures the option only appears when appropriate (e.g., based on user permissions). File reference: CometChatMessageList.swift

Step 2: Handle Private Chat Navigation

Retrieve the sender and initiate a private 1-on-1 chat:
import UIKit
import CometChatSDK
import CometChatUIKitSwift

func startPrivateChat(with selectedMessage: BaseMessage) {
    // Get the sender's UID from the selected message
    if let uid = selectedMessage.sender?.uid {
        
        // Fetch the user object
        CometChatUIKit.getUser(uid: uid) { user in
            
            // Get or create the conversation
            CometChatUIKit.getConversationWith(user: user) { conversation in
                
                // Navigate to the private chat screen
                let messagesVC = CometChatMessages(conversation: conversation)
                navigationController?.pushViewController(messagesVC, animated: true)
            }
        }
    }
}
This automates the transition from group context to private conversation. File reference: CometChatMessageList.swift

Implementation Flow

StepAction
1Long-press a group message in CometChatMessageList
2Options menu appears with Message Privately
3User taps Message Privately
4App fetches User via CometChatUIKit.getUser(uid:)
5Retrieves or creates conversation via CometChatUIKit.getConversationWith(user:)
6Pushes CometChatMessages onto the navigation stack

Customization Options

Styling

Override CometChatMessageOption UI elements:
// Customize the message option appearance
let privateOption = CometChatMessageOption(
    id: "message-privately",
    title: "Message Privately",
    icon: UIImage(systemName: "person.fill"),
    backgroundColor: .systemBlue
)

Availability

Control visibility via the view model:
// Hide the option for specific scenarios
viewModel.hideMessagePrivatelyOption = true

Extend Options

Add additional actions in MessageDataSource.getMessageOptions(for:):
func getMessageOptions(for message: BaseMessage) -> [CometChatMessageOption] {
    var options = [CometChatMessageOption]()
    
    // Add message privately option
    if !hideMessagePrivatelyOption {
        options.append(messagePrivatelyOption)
    }
    
    // Add custom options
    options.append(customOption)
    
    return options
}

Edge Cases

ScenarioHandling
Blocked usersHide option if the sender is in block list
Existing conversationsReuse existing thread via getConversationWith
Unavailable usersSkip option or show disabled state if user data is missing

Error Handling

Error TypeSolution
Block stateCatch errors from getUser/getConversationWith and alert user
Network failuresPresent retry or toast on navigation errors
Invalid dataDisable option if sender.uid is nil

Additional Notes

  • This feature is only available in group chat screens (CometChatMessageList)
  • The option is hidden automatically in direct/private chat views

Feature Matrix

FeatureComponent / MethodFile(s)
Show options menugetMessageOptions(for:)MessageDataSource.swift
Toggle Message PrivatelyviewModel.hideMessagePrivatelyOptionCometChatMessageList.swift, MessageListViewModel.swift