multipartRequest static method

Future<ApiCallResponse> multipartRequest(
  1. ApiCallType? type,
  2. String apiUrl,
  3. Map<String, dynamic> headers,
  4. Map<String, dynamic> params,
  5. bool returnBody,
  6. bool decodeUtf8,
)

Implementation

static Future<ApiCallResponse> multipartRequest(
  ApiCallType? type,
  String apiUrl,
  Map<String, dynamic> headers,
  Map<String, dynamic> params,
  bool returnBody,
  bool decodeUtf8,
) async {
  assert(
    {ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type),
    'Invalid ApiCallType $type for request with body',
  );
  bool Function(dynamic) _isFile = (e) =>
      e is FFUploadedFile ||
      e is List<FFUploadedFile> ||
      (e is List && e.firstOrNull is FFUploadedFile);

  final nonFileParams = toStringMap(
      Map.fromEntries(params.entries.where((e) => !_isFile(e.value))));

  List<http.MultipartFile> files = [];
  params.entries.where((e) => _isFile(e.value)).forEach((e) {
    final param = e.value;
    final uploadedFiles = param is List
        ? param as List<FFUploadedFile>
        : [param as FFUploadedFile];
    uploadedFiles.forEach((uploadedFile) => files.add(
          http.MultipartFile.fromBytes(
            e.key,
            uploadedFile.bytes ?? Uint8List.fromList([]),
            filename: uploadedFile.name,
            contentType: _getMediaType(uploadedFile.name),
          ),
        ));
  });

  final request = http.MultipartRequest(
      type.toString().split('.').last, Uri.parse(apiUrl))
    ..headers.addAll(toStringMap(headers))
    ..files.addAll(files);
  nonFileParams.forEach((key, value) => request.fields[key] = value);

  final response = await http.Response.fromStream(await request.send());
  return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
}