pickMedia method

Future<List<PickedFile>> pickMedia({
  1. required CloudMediaType type,
  2. required int maxCount,
})

Implementation

Future<List<PickedFile>> pickMedia({
  required CloudMediaType type,
  required int maxCount,
}) async {
  if (maxCount > FileConstants.hardMaxSelection) {
    throw CloudMediaSelectionLimitExceededException(
        'Requested $maxCount exceeds hard limit of ${FileConstants.hardMaxSelection}.');
  }

  List<PickedFile> pickedFiles = [];

  switch (type) {
    case CloudMediaType.image:
      final files = await _imagePicker.pickMultiImage(
        limit: maxCount,
        imageQuality: 100,
      );
      pickedFiles = files.map((f) => PickedFile(f.path)).toList();
      break;

    case CloudMediaType.video:
      // image_picker only supports single video selection.
      // maxCount > 1 is silently treated as 1 for video — this is a known
      // platform limitation. Use CloudMediaType.file for multi-video picking.
      if (maxCount > 1) {
        CloudLogger.warning(
            'Video picking supports maxCount=1 only (platform limitation). '
            'Requested $maxCount — picking 1.');
      }
      final file = await _imagePicker.pickVideo(source: ImageSource.gallery);
      if (file != null) {
        pickedFiles = [PickedFile(file.path)];
      }
      break;

    case CloudMediaType.audio:
      // file_picker 12.x: fully static, use pickFile for single, pickFiles for multiple
      if (maxCount == 1) {
        final result = await FilePicker.pickFile(type: FileType.audio);
        if (result != null) pickedFiles = [PickedFile(result.path!)];
      } else {
        final result = await FilePicker.pickFiles(type: FileType.audio);
        if (result != null) {
          pickedFiles = result.paths.whereType<String>().map(PickedFile.new).toList();
        }
      }
      break;

    case CloudMediaType.file:
      if (maxCount == 1) {
        final result = await FilePicker.pickFile(
          type: FileType.custom,
          allowedExtensions: ['pdf'],
        );
        if (result != null) pickedFiles = [PickedFile(result.path!)];
      } else {
        final result = await FilePicker.pickFiles(
          type: FileType.custom,
          allowedExtensions: ['pdf'],
        );
        if (result != null) {
          pickedFiles = result.paths.whereType<String>().map(PickedFile.new).toList();
        }
      }
      break;
  }

  for (final file in pickedFiles) {
    Validators.validateFileType(file.name);
    final size = await file.length();
    Validators.validateFileSize(size, type);
  }

  CloudLogger.info('Picked ${pickedFiles.length} ${type.displayName}(s)');
  return pickedFiles;
}