Events (2)
Last updated Oct 19, 2026
This page provides an overview of the events emitted by meeting.participants and related participant maps, which you can use to keep your UI in sync with changes such as participants joining or leaving, pinning updates, active speaker changes, and grid view mode or page changes.
Prerequisites
This page assumes you have already initialized the SDK and understand the meeting object structure. Refer to Initialize SDK and Meeting Object Explained if needed.
WebMobile
ReactWeb ComponentsAngular
Grid events
These events allow you to monitor changes to the grid.
View mode change
Triggered when the view mode changes between ACTIVE_GRID and PAGINATED.
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);
Triggered when the view mode changes between ACTIVE_GRID and PAGINATED.
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);
Or use event listener:
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);
This event is not available on this platform.
Triggered when the view mode changes between ACTIVE_GRID and PAGINATED.
const viewMode = useRealtimeKitSelector((m) => m.participants.viewMode);
Or use event listener:
meeting.participants.on(
"viewModeChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("view mode changed", viewMode);
},
);
Page change
Triggered when the page changes in paginated mode.
meeting.participants.on(
"pageChanged",
({ viewMode, currentPage, pageCount }) => {
console.log("page changed", currentPage);
},
);
Triggered when the page changes in paginated mode.
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);
This event is not available on this platform.
Triggered when the page changes in paginated mode.
const currentPage = useRealtimeKitSelector((m) => m.participants.currentPage);
const pageCount = useRealtimeKitSelector((m) => m.participants.pageCount);
Active speaker
Triggered when a participant starts speaking.
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});
const activeSpeaker = useRealtimeKitSelector(
(m) => m.participants.lastActiveSpeaker,
);
Or use event listener:
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onActiveSpeakerChanged(participant: RtkRemoteParticipant?) {
participant?.let {
println("${it.id} is currently speaking")
}
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onActiveSpeakerChanged(participant: RtkRemoteParticipant?) {
if let participant = participant {
print("\(participant.id) is currently speaking")
}
}
}
meeting.addParticipantsEventListener(self)
const activeSpeaker = useRealtimeKitSelector(
(m) => m.participants.lastActiveSpeaker,
);
Or use event listener:
meeting.participants.on("activeSpeaker", (participant) => {
console.log(`${participant.id} is currently speaking`);
});
Participant map events
These events allow you to monitor changes to remote participant maps. Use them to get notified when a participant joins or leaves the meeting, is pinned, or moves out of the grid.
Participant joined
Triggered when any participant joins the meeting.
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});
const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);
Or use event listener:
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantJoin(participant: RtkRemoteParticipant) {
println("A participant with id ${participant.id} has joined")
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantJoin(participant: RtkRemoteParticipant) {
print("A participant with id \(participant.id) has joined")
}
}
meeting.addParticipantsEventListener(self)
const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);
Or use event listener:
meeting.participants.joined.on("participantJoined", (participant) => {
console.log(`A participant with id "${participant.id}" has joined`);
});
Participant left
Triggered when any participant leaves the meeting.
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});
const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);
Or use event listener:
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantLeave(participant: RtkRemoteParticipant) {
println("A participant with id ${participant.id} has left the meeting")
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantLeave(participant: RtkRemoteParticipant) {
print("A participant with id \(participant.id) has left the meeting")
}
}
meeting.addParticipantsEventListener(self)
const joinedParticipants = useRealtimeKitSelector((m) => m.participants.joined);
Or use event listener:
meeting.participants.joined.on("participantLeft", (participant) => {
console.log(`A participant with id "${participant.id}" has left the meeting`);
});
Active participants changed
Each participant map emits participantJoined and participantLeft events:
// Listen for when a participant gets pinned
meeting.participants.pinned.on("participantJoined", (participant) => {
console.log(`Participant ${participant.name} got pinned`);
});
// Listen for when a participant gets unpinned
meeting.participants.pinned.on("participantLeft", (participant) => {
console.log(`Participant ${participant.name} got unpinned`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onActiveParticipantsChanged(active: List<RtkRemoteParticipant>) {
// Called when active participants change
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onActiveParticipantsChanged(active: [RtkRemoteParticipant]) {
// Called when active participants change
}
}
meeting.addParticipantsEventListener(self)
Participant pinned
Triggered when a participant is pinned.
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});
const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);
Or use event listener:
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantPinned(participant: RtkRemoteParticipant) {
println("Participant with id ${participant.id} was pinned")
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantPinned(participant: RtkRemoteParticipant) {
print("Participant with id \(participant.id) was pinned")
}
}
meeting.addParticipantsEventListener(self)
const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);
Or use event listener:
meeting.participants.joined.on("pinned", (participant) => {
console.log(`Participant with id "${participant.id}" was pinned`);
});
Participant unpinned
Triggered when a participant is unpinned.
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});
const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);
Or use event listener:
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});
meeting.addParticipantsEventListener(object : RtkParticipantsEventListener {
override fun onParticipantUnpinned(participant: RtkRemoteParticipant) {
println("Participant with id ${participant.id} was unpinned")
}
})
extension MeetingViewModel: RtkParticipantsEventListener {
func onParticipantUnpinned(participant: RtkRemoteParticipant) {
print("Participant with id \(participant.id) was unpinned")
}
}
meeting.addParticipantsEventListener(self)
const pinnedParticipants = useRealtimeKitSelector((m) => m.participants.pinned);
Or use event listener:
meeting.participants.joined.on("unpinned", (participant) => {
console.log(`Participant with id "${participant.id}" was unpinned`);
});
Participant events
You can monitor changes to a specific participant using the following events.
Video update
Triggered when any participant starts or stops video.
meeting.participants.joined.on("videoUpdate", (participant) => {
console.log(
`A participant with id "${participant.id}" updated their video track`,
);
if (participant.videoEnabled) {
// Use participant.videoTrack
} else {
// Handle stop video
}
});
// Check for one participant
const videoEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.videoEnabled,
);
// All video enabled participants
const videoEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.videoEnabled),
);
meeting.addParticipantEventListener(object : RtkParticipantEventListener {
override fun onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Boolean) {
println("Participant ${participant.id} video is now ${if (isEnabled) "enabled" else "disabled"}")
}
})
extension MeetingViewModel: RtkParticipantEventListener {
func onVideoUpdate(participant: RtkRemoteParticipant, isEnabled: Bool) {
print("Participant \(participant.id) video is now \(isEnabled ? "enabled" : "disabled")")
}
}
meeting.addParticipantEventListener(self)
// Check for one participant
const videoEnabled = useRealtimeKitSelector(
(m) => m.participants.joined.get(participantId)?.videoEnabled,
);
// All video enabled participants
const videoEnabledParticipants = useRealtimeKitSelector((m) =>
m.participants.joined.toArray().filter((p) => p.videoEnabled),
);
