createGroup method

Future<ChatResult<String>> createGroup({
  1. required String name,
  2. required List<String> memberIds,
  3. Uint8List? avatarBytes,
  4. String? avatarMimeType,
  5. String? subject,
  6. bool allowInvitations = false,
  7. RoomAudience audience = RoomAudience.contacts,
  8. Map<String, dynamic>? custom,
})

Creates a new group room.

Implementation

Future<ChatResult<String>> createGroup({
  required String name,
  required List<String> memberIds,
  Uint8List? avatarBytes,
  String? avatarMimeType,
  String? subject,
  bool allowInvitations = false,
  RoomAudience audience = RoomAudience.contacts,
  Map<String, dynamic>? custom,
}) async {
  String? avatarUrl;
  if (avatarBytes != null && avatarMimeType != null) {
    final uploadRes = await _a.uploadAvatar(
      avatarBytes,
      avatarMimeType,
      AvatarKind.room,
    );
    if (uploadRes.isFailure) {
      return _a._emitFailure(
        uploadRes.castFailure<String>(),
        OperationKind.createGroupRoom,
      );
    }
    avatarUrl = uploadRes.dataOrNull;
  }
  final createRes = await _a.client.rooms.create(
    audience: audience,
    allowInvitations: allowInvitations,
    members: memberIds,
    name: name,
    subject: subject,
    avatarUrl: avatarUrl,
    custom: custom,
  );
  if (createRes.isFailure) {
    return _a._emitFailure(
      createRes.castFailure<String>(),
      OperationKind.createGroupRoom,
    );
  }
  final room = createRes.dataOrNull;
  if (room == null || room.id.isEmpty) {
    return _a._emitFailure(
      const ChatFailureResult<String>(
        UnexpectedFailure('create room returned empty id'),
      ),
      OperationKind.createGroupRoom,
    );
  }
  // Refresh the room list so the new entry surfaces immediately rather
  // than waiting for the `room_created` WS echo.
  unawaited(load());
  return ChatSuccess(room.id);
}