pickImages method

  1. @override
Future<List<AdaptiveFile>> pickImages(
  1. PickerOptions options
)
override

Picks one or more images from the device gallery/photo picker.

Implementation

@override
Future<List<AdaptiveFile>> pickImages(PickerOptions options) async {
  final completer = Completer<List<AdaptiveFile>>();

  final input = web.document.createElement('input') as web.HTMLInputElement;
  input.type = 'file';
  input.style.display = 'none';

  switch (options.mediaType) {
    case MediaType.image:
      input.accept = 'image/*';
      break;
    case MediaType.video:
      input.accept = 'video/*';
      break;
    case MediaType.all:
      input.accept = 'image/*,video/*';
      break;
  }

  if (options.isMultiple) {
    input.multiple = true;
  }

  input.onchange = ((web.Event event) {
    final fileList = input.files;
    if (fileList == null || fileList.length == 0) {
      if (!completer.isCompleted) completer.complete([]);
      input.remove();
      return;
    }

    final List<Future<AdaptiveFile>> fileFutures = [];
    for (int i = 0; i < fileList.length; i++) {
      final web.File? file = fileList.item(i);
      if (file != null) {
        fileFutures.add(_readWebFile(file));
      }
    }

    Future.wait(fileFutures).then((files) {
      if (!completer.isCompleted) completer.complete(files);
    }).catchError((err) {
      if (!completer.isCompleted) completer.completeError(err);
    }).whenComplete(() {
      input.remove();
    });
  }).toJS;

  // Handle cancel / window focus back
  web.window.addEventListener(
    'focus',
    ((web.Event event) {
      Future.delayed(const Duration(milliseconds: 800), () {
        if (!completer.isCompleted && (input.files == null || input.files?.length == 0)) {
          completer.complete([]);
          input.remove();
        }
      });
    }).toJS,
    true.toJS,
  );

  web.document.body?.appendChild(input);
  input.click();

  return completer.future;
}