addParticipant method
Implementation
void addParticipant(List<ParticipantTrack> participants) {
// Clear the existing list
_participantTracks.clear();
// Create a map to store unique participants by identity
final Map<String, ParticipantTrack> uniqueParticipants = {};
for (var participantTrack in participants) {
final identity = participantTrack.participant.identity;
if (participantTrack.type == ParticipantTrackType.kScreenShare) {
// If it's a screen share, update or add the entry
uniqueParticipants[identity] = ParticipantTrack(
participant: participantTrack.participant,
type: ParticipantTrackType.kScreenShare,
);
} else {
// If it's a user media track, add it only if no screen share exists for the participant
uniqueParticipants.putIfAbsent(identity, () => participantTrack);
}
}
// Sort participants to ensure local participant comes first
ParticipantTrack? localParticipant =
uniqueParticipants.values.firstWhereOrNull(
(participantTrack) =>
participantTrack.participant.identity ==
room.localParticipant?.identity,
);
// Add local participant first if it exists
if (localParticipant != null) {
_participantTracks.add(localParticipant);
}
// Add the remaining participants excluding the local participant
_participantTracks.addAll(
uniqueParticipants.values.where(
(participantTrack) =>
participantTrack.participant.identity !=
room.localParticipant?.identity,
),
);
updateIdentityToNameMap();
requestForTranscriptionState();
// Notify listeners of the update
notifyListeners();
}