Skip to main content
The CometChat Calls SDK provides two ways to listen for call events: the OngoingCallListener class for legacy-style callbacks, and the addEventListener method for modern event subscriptions.

OngoingCallListener

The OngoingCallListener class provides callbacks for call events. Pass it to CallSettingsBuilder.setCallEventListener():
import { CometChatCalls } from '@cometchat/calls-sdk-react-native';

const callListener = new CometChatCalls.OngoingCallListener({
  onUserJoined: (user) => {
    console.log('User joined:', user);
  },
  onUserLeft: (user) => {
    console.log('User left:', user);
  },
  onUserListUpdated: (userList) => {
    console.log('User list updated:', userList);
  },
  onCallEnded: () => {
    console.log('Call ended');
  },
  onCallEndButtonPressed: () => {
    console.log('End call button pressed');
  },
  onSessionTimeout: () => {
    console.log('Session timed out');
  },
  onError: (error) => {
    console.error('Call error:', error);
  },
  onAudioModesUpdated: (audioModes) => {
    console.log('Audio modes updated:', audioModes);
  },
  onRecordingStarted: (data) => {
    console.log('Recording started:', data);
  },
  onRecordingStopped: (data) => {
    console.log('Recording stopped:', data);
  },
  onUserMuted: (user) => {
    console.log('User muted:', user);
  },
  onCallSwitchedToVideo: (data) => {
    console.log('Call switched to video:', data);
  },
});

const callSettings = new CometChatCalls.CallSettingsBuilder()
  .setCallEventListener(callListener)
  .build();

OngoingCallListener Events

EventPayloadDescription
onUserJoinedUser objectA user joined the call
onUserLeftUser objectA user left the call
onUserListUpdatedUser arrayThe participant list changed
onCallEnded-The call has ended
onCallEndButtonPressed-The end call button was pressed
onSessionTimeout-The session timed out due to inactivity
onErrorError objectAn error occurred
onAudioModesUpdatedAudio modes arrayAvailable audio modes changed
onRecordingStartedRecording dataRecording has started
onRecordingStoppedRecording dataRecording has stopped
onUserMutedUser objectA user was muted
onCallSwitchedToVideoSession dataAn audio call was switched to video

addEventListener

For more granular control, use CometChatCalls.addEventListener() to subscribe to specific events:
const unsubscribe = CometChatCalls.addEventListener('onParticipantJoined', (participant) => {
  console.log('Participant joined:', participant);
});

// Later, unsubscribe when no longer needed
unsubscribe();

Session Status Events

EventPayloadDescription
onSessionJoined-Successfully joined the session
onSessionLeft-Left the session
onConnectionLost-Connection to the session was lost
onConnectionRestored-Connection was restored
onConnectionClosed-Connection was closed
onSessionTimedOut-Session timed out due to inactivity
CometChatCalls.addEventListener('onSessionJoined', () => {
  console.log('Successfully joined the session');
});

CometChatCalls.addEventListener('onSessionLeft', () => {
  console.log('Left the session');
});

CometChatCalls.addEventListener('onConnectionLost', () => {
  console.log('Connection lost - attempting to reconnect');
});

CometChatCalls.addEventListener('onConnectionRestored', () => {
  console.log('Connection restored');
});

CometChatCalls.addEventListener('onSessionTimedOut', () => {
  console.log('Session timed out');
});

Media Events

EventPayloadDescription
onAudioMuted-Local audio was muted
onAudioUnMuted-Local audio was unmuted
onVideoPaused-Local video was paused
onVideoResumed-Local video was resumed
onRecordingStarted-Recording started
onRecordingStopped-Recording stopped
onScreenShareStarted-Screen sharing started
onScreenShareStopped-Screen sharing stopped
onAudioModeChangedAudio modeAudio output mode changed
onCameraFacingChangedCamera facingCamera switched (front/rear)
CometChatCalls.addEventListener('onAudioMuted', () => {
  console.log('Audio muted');
});

CometChatCalls.addEventListener('onAudioUnMuted', () => {
  console.log('Audio unmuted');
});

CometChatCalls.addEventListener('onVideoPaused', () => {
  console.log('Video paused');
});

CometChatCalls.addEventListener('onVideoResumed', () => {
  console.log('Video resumed');
});

CometChatCalls.addEventListener('onAudioModeChanged', (mode) => {
  console.log('Audio mode changed to:', mode);
});

CometChatCalls.addEventListener('onCameraFacingChanged', (facing) => {
  console.log('Camera facing:', facing); // 'FRONT' or 'REAR'
});

Participant Events

EventPayloadDescription
onParticipantJoinedParticipantA participant joined
onParticipantLeftParticipantA participant left
onParticipantAudioMutedParticipantA participant muted their audio
onParticipantAudioUnmutedParticipantA participant unmuted their audio
onParticipantVideoPausedParticipantA participant paused their video
onParticipantVideoResumedParticipantA participant resumed their video
onParticipantHandRaisedParticipantA participant raised their hand
onParticipantHandLoweredParticipantA participant lowered their hand
onParticipantStartedScreenShareParticipantA participant started screen sharing
onParticipantStoppedScreenShareParticipantA participant stopped screen sharing
onParticipantStartedRecordingParticipantA participant started recording
onParticipantStoppedRecordingParticipantA participant stopped recording
onDominantSpeakerChangedParticipantThe dominant speaker changed
onParticipantListChangedParticipant arrayThe participant list changed
CometChatCalls.addEventListener('onParticipantJoined', (participant) => {
  console.log('Participant joined:', participant.name);
});

CometChatCalls.addEventListener('onParticipantLeft', (participant) => {
  console.log('Participant left:', participant.name);
});

CometChatCalls.addEventListener('onParticipantListChanged', (participants) => {
  console.log('Total participants:', participants.length);
});

CometChatCalls.addEventListener('onParticipantHandRaised', (participant) => {
  console.log('Hand raised by:', participant.name);
});

CometChatCalls.addEventListener('onDominantSpeakerChanged', (participant) => {
  console.log('Dominant speaker:', participant.name);
});

Button Click Events

EventPayloadDescription
onLeaveSessionButtonClicked-Leave session button clicked
onRaiseHandButtonClicked-Raise hand button clicked
onShareInviteButtonClicked-Share invite button clicked
onChangeLayoutButtonClicked-Change layout button clicked
onParticipantListButtonClicked-Participant list button clicked
onToggleAudioButtonClicked-Toggle audio button clicked
onToggleVideoButtonClicked-Toggle video button clicked
onRecordingToggleButtonClicked-Recording toggle button clicked
onScreenShareButtonClicked-Screen share button clicked
onChatButtonClicked-Chat button clicked
onSwitchCameraButtonClicked-Switch camera button clicked
CometChatCalls.addEventListener('onLeaveSessionButtonClicked', () => {
  console.log('Leave button clicked');
  // Handle leave confirmation
});

CometChatCalls.addEventListener('onChatButtonClicked', () => {
  console.log('Chat button clicked');
  // Open chat interface
});

Layout Events

EventPayloadDescription
onCallLayoutChangedLayoutThe call layout changed
onParticipantListVisible-Participant list became visible
onParticipantListHidden-Participant list was hidden
onPictureInPictureLayoutEnabled-PiP mode was enabled
onPictureInPictureLayoutDisabled-PiP mode was disabled
CometChatCalls.addEventListener('onCallLayoutChanged', (layout) => {
  console.log('Layout changed to:', layout); // 'TILE', 'SIDEBAR', or 'SPOTLIGHT'
});

CometChatCalls.addEventListener('onPictureInPictureLayoutEnabled', () => {
  console.log('PiP enabled');
});

Participant Object

The participant object contains:
PropertyTypeDescription
pidstringParticipant ID
uidstringUser ID
namestringDisplay name
avatarstringAvatar URL (optional)

Complete Example

import React, { useEffect, useRef } from 'react';
import { CometChatCalls } from '@cometchat/calls-sdk-react-native';

function useCallEvents(onCallEnd: () => void) {
  const unsubscribersRef = useRef<Array<() => void>>([]);

  useEffect(() => {
    // Session events
    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onSessionJoined', () => {
        console.log('Joined session');
      })
    );

    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onSessionLeft', () => {
        console.log('Left session');
        onCallEnd();
      })
    );

    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onSessionTimedOut', () => {
        console.log('Session timed out');
        onCallEnd();
      })
    );

    // Participant events
    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onParticipantJoined', (participant) => {
        console.log(`${participant.name} joined`);
      })
    );

    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onParticipantLeft', (participant) => {
        console.log(`${participant.name} left`);
      })
    );

    // Media events
    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onAudioModeChanged', (mode) => {
        console.log('Audio mode:', mode);
      })
    );

    // Layout events
    unsubscribersRef.current.push(
      CometChatCalls.addEventListener('onCallLayoutChanged', (layout) => {
        console.log('Layout:', layout);
      })
    );

    // Cleanup
    return () => {
      unsubscribersRef.current.forEach((unsubscribe) => unsubscribe());
      unsubscribersRef.current = [];
    };
  }, [onCallEnd]);
}

export default useCallEvents;