uploadTicketWithMultipleDocuments method
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()};
}
}