uploadTicketWithAudio method
Upload Ticket with Audio File
Implementation
Future<Map<String, dynamic>> uploadTicketWithAudio({
required String mutation,
required Map<String, dynamic> variables,
required String audioFilePath,
required String audioFieldID,
}) async {
try {
final file = File(audioFilePath);
if (!await file.exists()) {
return {'success': false, 'message': 'Audio file not found'};
}
final bytes = await file.readAsBytes();
final fileName = audioFilePath.split('/').last;
final map = <String, List<String>>{
"0": ["variables.input.customFiles.0.file"]
};
final multipartFile = MultipartFile.fromBytes(
bytes,
filename: fileName,
contentType: MediaType.parse(_getAudioMimeType(fileName)),
);
final formData = FormData();
// 1. First add operations
formData.fields.add(MapEntry(
"operations",
jsonEncode({
"query": mutation,
"variables": variables,
}),
));
// 2. Then add map
formData.fields.add(MapEntry(
"map",
jsonEncode(map),
));
// 3.Finally add file
formData.files.add(MapEntry("0", multipartFile));
print("Uploading audio: $fileName (${bytes.length} bytes)");
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};
}
return json['data'] ?? {'success': false, 'message': 'No data returned'};
} catch (e) {
print("Audio upload failed: $e");
return {'success': false, 'message': e.toString()};
}
}