uploadTicketWithAudio method

Future<Map<String, dynamic>> uploadTicketWithAudio({
  1. required String mutation,
  2. required Map<String, dynamic> variables,
  3. required String audioFilePath,
  4. required String audioFieldID,
})

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