uploadTicketWithDocument method
Upload a single driving license document with ticket update
Implementation
Future<Map<String, dynamic>> uploadTicketWithDocument({
required String mutation,
required Map<String, dynamic> variables,
required String filePath,
required String fieldID,
}) async {
try {
final file = File(filePath);
if (!await file.exists()) {
return {'success': false, 'message': 'Document file not found: $filePath'};
}
final bytes = await file.readAsBytes();
final fileName = filePath.split('/').last;
print(' Uploading document: $fileName (${(bytes.length / 1024).toStringAsFixed(1)} KB)');
// Map telling server where to inject the uploaded file
final map = <String, List<String>>{
"0": ["variables.input.customFiles.0.file"]
};
final multipartFile = MultipartFile.fromBytes(
bytes,
filename: fileName,
contentType: MediaType.parse(_getMimeType(fileName)),
);
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 the file
formData.files.add(MapEntry("0", multipartFile));
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(' Document uploaded successfully');
return json['data'] ?? {'success': false, 'message': 'No data returned'};
} catch (e) {
print(" Document upload failed: $e");
return {'success': false, 'message': e.toString()};
}
}