This section explains how to implement a complete calling workflow with ringing functionality, including incoming/outgoing call UI, call acceptance, rejection, and cancellation. Previously known as Default Calling.
After the call is accepted, you need to start the call session. See the Call Session guide for details on starting and managing the actual call.
Call Flow:
Caller initiates a call using initiateCall()
Receiver gets notified via onIncomingCallReceived() callback
Receiver can either:
Accept the call using acceptCall()
Reject the call using rejectCall() with status CALL_STATUS_REJECTED
Caller can cancel the call using rejectCall() with status CALL_STATUS_CANCELLED
Once accepted, both participants generate a call token and render the CometChatCalls.Component to join the call
CometChat.RECEIVER_TYPE.USER or CometChat.RECEIVER_TYPE.GROUP
callType
CometChat.CALL_TYPE.AUDIO or CometChat.CALL_TYPE.VIDEO
On success, a Call object is returned containing the call details including a unique sessionId required for starting the call session.By default, an unanswered call automatically cancels after 45 seconds. You can customize this duration by passing an optional timeout parameter (in seconds) as the second argument to initiateCall().
User Call (JavaScript)
Group Call (JavaScript)
User Call (TypeScript)
Group Call (TypeScript)
const receiverID = "UID";const callType = CometChat.CALL_TYPE.VIDEO;const receiverType = CometChat.RECEIVER_TYPE.USER;const call = new CometChat.Call(receiverID, callType, receiverType);// Set a custom timeout of 60 secondsCometChat.initiateCall(call, 60).then( (outgoingCall) => { console.log("Call initiated with 60s timeout:", outgoingCall); }, (error) => { console.log("Call initiation failed:", error); });
const receiverID = "GUID";const callType = CometChat.CALL_TYPE.VIDEO;const receiverType = CometChat.RECEIVER_TYPE.GROUP;const call = new CometChat.Call(receiverID, callType, receiverType);// Set a custom timeout of 60 secondsCometChat.initiateCall(call, 60).then( (outgoingCall) => { console.log("Call initiated with 60s timeout:", outgoingCall); }, (error) => { console.log("Call initiation failed:", error); });
const receiverID: string = "UID";const callType: string = CometChat.CALL_TYPE.VIDEO;const receiverType: string = CometChat.RECEIVER_TYPE.USER;const call: CometChat.Call = new CometChat.Call(receiverID, callType, receiverType);// Set a custom timeout of 60 secondsCometChat.initiateCall(call, 60).then( (outgoingCall: CometChat.Call) => { console.log("Call initiated with 60s timeout:", outgoingCall); }, (error: CometChat.CometChatException) => { console.log("Call initiation failed:", error); });
const receiverID: string = "GUID";const callType: string = CometChat.CALL_TYPE.VIDEO;const receiverType: string = CometChat.RECEIVER_TYPE.GROUP;const call: CometChat.Call = new CometChat.Call(receiverID, callType, receiverType);// Set a custom timeout of 60 secondsCometChat.initiateCall(call, 60).then( (outgoingCall: CometChat.Call) => { console.log("Call initiated with 60s timeout:", outgoingCall); }, (error: CometChat.CometChatException) => { console.log("Call initiation failed:", error); });
Parameter
Type
Description
call
Call
The call object created with receiver ID, call type, and receiver type.
timeout
number
Optional. The ringing duration in seconds before an unanswered call is automatically cancelled. Default: 45.
Register the CallListener to receive real-time call events. Each listener requires a unique listenerId string to prevent duplicate registrations and enable targeted removal.
Always remove call listeners when the component unmounts using CometChat.removeCallListener(listenerId). Failing to do so can cause memory leaks and duplicate event handling.
To end an active call in the ringing flow, call CometChat.endCall() in the onCallEndButtonPressed() callback, then call CometChat.clearActiveCall() and CometChatCalls.endSession().
Always remove call listeners on component unmount to prevent memory leaks and duplicate events
Store the sessionId from initiateCall() or onIncomingCallReceived() — you’ll need it for accept, reject, cancel, and starting the session
Handle the CALL_STATUS_BUSY case when the receiver is already on another call
Call CometChat.clearActiveCall() and CometChatCalls.endSession() together when a call ends to properly release all resources
Request camera and microphone permissions before initiating or accepting a call
Troubleshooting
onIncomingCallReceived not firing: Ensure CometChat.addCallListener() is registered before the call is initiated and that the listener ID is unique
Call accepted but no audio/video: After acceptCall(), you must start the call session by generating a token and rendering CometChatCalls.Component — see the Call Session guide
Duplicate call events: You may have registered the same listener multiple times — always call CometChat.removeCallListener(listenerId) on unmount
initiateCall fails with error: Verify the receiver UID/GUID exists and that the logged-in user has an active session