addParticipant method

void addParticipant(
  1. List<ParticipantTrack> participants
)

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();
}