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 =
      FirebaseStorage.instance.ref().child(getMediaRefUri(mediaId, mediaType));

  final pfile = PFile.of(file);
  var tuple =
      setupTask(storageReference, pfile!, "image/${file.extension ?? '*'}");
  final _progress = progress ?? ProgressTracker<Uri>.ratio();
  tuple.then((t) {
    StreamSubscription? sub;
    final _ = t.first;
    _.whenComplete(() async {
      final url = await storageReference.getDownloadURL();
      final uri = url.toString().toUri();
      _progress.complete(uri);
      _progress.dispose();
    });
    sub = _.snapshotEvents.listen((event) {
      switch (event.state) {
        case TaskState.paused:
          _log.info("Paused upload for $mediaId");
          break;
        case TaskState.running:
          _progress.update(event.bytesTransferred.toDouble() *
              100 /
              event.totalBytes.toDouble());
          break;
        case TaskState.success:
          sub?.cancel();
          break;
        case TaskState.canceled:
          sub?.cancel();
          break;
        case TaskState.error:
          sub?.cancel();
          _progress.completeError();
          break;
      }
    });
  });

  return _progress;
}