uploadTicketWithDocument method

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

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