preSignUploadFile method

  1. @override
Future<bool> preSignUploadFile(
  1. Uri url,
  2. dynamic file, {
  3. int timeout = 1800,
  4. void progressCallback(
    1. int loaded,
    2. int total
    )?,
})
override

Implementation

@override
Future<bool> preSignUploadFile(
  Uri url,
  dynamic file, {
  int timeout = 1800,
  void Function(int loaded, int total)? progressCallback,
}) async {
  final completer = Completer<bool>();
  final request = web.XMLHttpRequest();
  try {
    final webFile = file as web.File;
    request.timeout = timeout * 1000;
    request.onReadyStateChange.listen((event) {
      // if (request.readyState == web.XMLHttpRequest.DONE) {
      //   if (request.status == 200) {
      //   } else {}
      // }
    });
    request.onLoad.listen((event) {
      if (request.status == 200) {
        if (!completer.isCompleted) completer.complete(true);
      } else {
        if (!completer.isCompleted) completer.complete(false);
      }
    });
    request.onError.listen((event) {
      if (!completer.isCompleted) completer.complete(false);
    });
    web.EventStreamProviders.timeoutEvent.forTarget(request).listen((event) {
      if (!completer.isCompleted) completer.complete(false);
    });
    web.EventStreamProviders.progressEvent.forTarget(request.upload).listen((
      event,
    ) {
      if (event.lengthComputable && progressCallback != null) {
        // final percent = event.loaded / event.total * 100;
        progressCallback(event.loaded, event.total);
      }
    });
    request.open('PUT', url.toString(), true);
    request.setRequestHeader('Content-Type', webFile.type);
    request.setRequestHeader('Content-Length', webFile.size.toString());
    request.setRequestHeader('x-upsert', 'true');
    request.send(webFile);
  } catch (err) {
    logger.severe('Error at StorageUtilImpl.preSignUploadFile >>> $err');
    if (!completer.isCompleted) completer.complete(false);
  }
  return completer.future.timeout(Duration(seconds: timeout), onTimeout: () {
    request.abort();
    return false;
  });
}