uploadTicketWithMultipleDocuments method

Future<Map<String, dynamic>> uploadTicketWithMultipleDocuments({
  1. required String mutation,
  2. required Map<String, dynamic> variables,
  3. required List<String> filePaths,
  4. required String fieldID,
})

Upload multiple driving license documents with ticket update

Implementation

Future<Map<String, dynamic>> uploadTicketWithMultipleDocuments({
  required String mutation,
  required Map<String, dynamic> variables,
  required List<String> filePaths,
  required String fieldID,
}) async {
  try {
    // Verify all files exist
    for (final path in filePaths) {
      final file = File(path);
      if (!await file.exists()) {
        return {'success': false, 'message': 'Document file not found: $path'};
      }
    }

    print('Uploading ${filePaths.length} documents:');

    // Build the file map for multiple files
    final map = <String, List<String>>{};
    final files = <MultipartFile>[];

    for (int i = 0; i < filePaths.length; i++) {
      final file = File(filePaths[i]);
      final bytes = await file.readAsBytes();
      final fileName = filePaths[i].split('/').last;

      print('   [$i] $fileName (${(bytes.length / 1024).toStringAsFixed(1)} KB)');

      files.add(MultipartFile.fromBytes(
        bytes,
        filename: fileName,
        contentType: MediaType.parse(_getMimeType(fileName)),
      ));

      // Map each file to its position in customFiles array
      map["$i"] = ["variables.input.customFiles.$i.file"];
    }

    final formData = FormData();

    // 1. Add GraphQL operation
    formData.fields.add(MapEntry(
      "operations",
      jsonEncode({
        "query": mutation,
        "variables": variables,
      }),
    ));

    // 2. Add file map
    formData.fields.add(MapEntry(
      "map",
      jsonEncode(map),
    ));

    // 3. Add all files
    for (int i = 0; i < files.length; i++) {
      formData.files.add(MapEntry("$i", files[i]));
    }

    final response = await _dio.post(
      '/graphql',
      data: formData,
      options: Options(
        contentType: 'multipart/form-data',
        followRedirects: true,
      ),
    );

    final json = response.data as Map<String, dynamic>;

    if (json['errors'] != null) {
      final errorMsg = json['errors'][0]['message'];
      print(" GraphQL Error: $errorMsg");
      return {'success': false, 'message': errorMsg};
    }

    print('All ${filePaths.length} documents uploaded successfully');
    return json['data'] ?? {'success': false, 'message': 'No data returned'};
  } catch (e) {
    print("Multiple documents upload failed: $e");
    return {'success': false, 'message': e.toString()};
  }
}