doUploadMedia function

ProgressTracker<Uri> doUploadMedia(
  1. dynamic file,
  2. MediaContentType<Object> contentType, {
  3. dynamic mediaType,
  4. required String mediaId,
  5. ProgressTracker<Uri>? progress,
})

Implementation

ProgressTracker<Uri> doUploadMedia(
    final dynamic file, MediaContentType contentType,
    {mediaType, required String mediaId, ProgressTracker<Uri>? progress}) {
  initializeGStorageFileLoaders();
  var storageReference = _ref.child(getMediaRefUri(mediaId, mediaType));

  var pfile = PFile.of(file);
  var tup = setupTask(storageReference, pfile!, "image/jpeg");

  final _progress = progress ?? ProgressTracker<Uri>.ratio();
  tup.then((t) {
    StreamSubscription? sub;
    var uploadTask = t.first;
    sub = uploadTask.onStateChanged.listen((event) {
      switch (event.state) {
        case fb.TaskState.PAUSED:
          _log.info("Paused upload for $mediaId");
          break;
        case fb.TaskState.RUNNING:
          _progress.update(event.bytesTransferred.toDouble() *
              100 /
              event.totalBytes.toDouble());
          break;
        case fb.TaskState.SUCCESS:
          sub?.cancel();
          break;
        case fb.TaskState.CANCELED:
          sub?.cancel();
          break;
        case fb.TaskState.ERROR:
          sub?.cancel();
          _progress.completeError();
          break;
      }
    });
    uploadTask.future.then((_) async {
      final url = await storageReference.getDownloadURL();
      final uri = url.toString().toUri();
      _progress.complete(uri);
      _progress.dispose();
    });
  });

  return _progress;
}