uploadMedia method

  1. @override
ProgressTracker<Uri> uploadMedia(
  1. dynamic file,
  2. MediaContentType<Object> contentType, {
  3. dynamic mediaType,
  4. String? mediaId,
  5. ProgressTracker<Uri>? progress,
  6. bool isDebug = false,
})
override

Implementation

@override
ProgressTracker<Uri> uploadMedia(
    final dynamic file, MediaContentType contentType,
    {mediaType,
    String? mediaId,
    ProgressTracker<Uri>? progress,
    bool isDebug = false}) {
  var pfile = PFile.of(file);

  final _progress = progress ?? ProgressTracker<Uri>.ratio();

  // Check to see if file already exists first.
  uploads
      .findMedia(
    mediaType: contentType.name,
    filePath: pfile!.name!,
    fileSize: pfile.size,
  )
      .catchError((err) {
    print("No existing media found for ${pfile.name}");
    return null;
  }).then((existing) {
    if (existing != null) {
      var parsedExisting = Uri.tryParse(existing);
      if (parsedExisting != null) {
        print("Found existing media${pfile.name}");
        _progress.complete(parsedExisting);
        return;
      }
    }
    Supervisor.create(UploadLargeFile(), isProduction: isDebug != true)
        .then((supervisor) async {
      final keyName =
          (await getMediaPath(contentType, mediaId!, mediaType: mediaType))
              .substring(1);
      final mediaUrl =
          await getMediaUri(contentType, mediaId, mediaType: mediaType);
      String? freshToken;
      if (this.authTokenGenerator != null) {
        freshToken = await this.authTokenGenerator!();
      }

      try {
        await supervisor.start(
            timeout: 20.seconds,
            params: UploadFileParams.ofPFile(
              file: pfile,
              keyName: keyName,
              apiBasePath: baseUrl,
              mediaType: contentType.fileType,
              mediaUrl: mediaUrl.toString(),
              apiToken: freshToken,
            ));
      } on TimeoutException {
        _progress.completeError(
            "Main thread timed out waiting for supervisor to start");

        supervisor.close().timeout(20.seconds);

        return;
      } catch (error, stack) {
        log.severe(
            "Main thread error getting start signal: $error", error, stack);
        rethrow;
      }
      StreamSubscription? _sub;
      _sub = supervisor.onStatus.listen((event) async {
        log.info(
            "STATUS CHANGE: ${event.phase} ${event.percentComplete}% complete");
        switch (event.phase) {
          case WorkPhase.error:
            _progress.completeError(event.error);
            _sub?.cancel();
            break;
          case WorkPhase.stopped:
            _progress.complete(await getMediaUri(contentType, mediaId,
                mediaType: mediaType));
            _sub?.cancel();
            break;
          default:
            _progress.update(event.percentComplete ?? 0, total: 100.0);
        }
      }, cancelOnError: false);
    });
  });

  return _progress;
}