setBreakoutRooms function

Future<HeadlessActionResult> setBreakoutRooms(
  1. MediasfuParameters parameters,
  2. List<List<BreakoutParticipant>> rooms, {
  3. String newParticipantAction = 'autoAssignNewRoom',
})

Implementation

Future<HeadlessActionResult> setBreakoutRooms(
  MediasfuParameters parameters,
  List<List<BreakoutParticipant>> rooms, {
  String newParticipantAction = 'autoAssignNewRoom',
}) async {
  if (parameters.islevel != '2') {
    return const HeadlessActionResult.failure(
        'Only the host can change breakout rooms.');
  }
  if (parameters.socket == null || parameters.roomName.isEmpty) {
    return const HeadlessActionResult.failure(
        'The room connection is not ready.');
  }
  try {
    final running =
        parameters.breakOutRoomStarted && !parameters.breakOutRoomEnded;
    final normalized = rooms
        .asMap()
        .entries
        .map((room) => room.value
            .map((person) => BreakoutParticipant(
                  name: person.name,
                  breakRoom: room.key,
                ))
            .toList(growable: false))
        .toList(growable: false);
    final response = await _emitAck(
      parameters,
      running ? 'updateBreakout' : 'startBreakout',
      {
        'breakoutRooms': normalized
            .map((room) => room.map((person) => person.toMap()).toList())
            .toList(),
        'newParticipantAction': newParticipantAction,
        'roomName': parameters.roomName,
      },
    );
    if (response['success'] != true) {
      return HeadlessActionResult.failure(response['reason']?.toString() ??
          'The breakout rooms could not be updated.');
    }
    parameters.updateBreakoutRooms(normalized);
    parameters.updateBreakOutRoomStarted(true);
    parameters.updateBreakOutRoomEnded(false);
    return const HeadlessActionResult.success();
  } catch (error) {
    return HeadlessActionResult.failure(
        'The breakout rooms could not be updated: $error');
  }
}