submit method

  1. @override
Future<void> submit(
  1. FeedbackEntry entry
)
override

Sends entry to the backend.

Throw any Exception on failure. QueuedBackend intercepts backend exceptions and enqueues the entry for retry.

Implementation

@override
Future<void> submit(FeedbackEntry entry) async {
  assert(kDebugMode, 'LocalFeedbackBackend must only be used in debug mode');

  await directory.create(recursive: true);

  // e.g. 2026-03-31T14-30-00-000_bug
  final ts = entry.createdAt
      .toIso8601String()
      .replaceAll(':', '-')
      .replaceAll('.', '-');
  final id = '${ts}_${entry.category}';

  // Save each screenshot as a PNG file
  final screenshotFileNames = <String>[];
  for (var i = 0; i < entry.screenshots.length; i++) {
    final name = '${id}_ss${i + 1}.png';
    await File('${directory.path}/$name')
        .writeAsBytes(base64Decode(entry.screenshots[i]));
    screenshotFileNames.add(name);
  }

  // Save JSON (filenames, not base64 blobs)
  final json = <String, dynamic>{
    'category': entry.category,
    'message': entry.message,
    'platform': entry.platform,
    'appVersion': entry.appVersion,
    'createdAt': entry.createdAt.toIso8601String(),
    'screenshots': screenshotFileNames,
  };
  await File('${directory.path}/$id.json')
      .writeAsString(const JsonEncoder.withIndent('  ').convert(json));

  debugPrint(
    '[FeedbackKit] 📋 $id.json | '
    '${entry.category} | '
    '${entry.screenshots.length} screenshot(s)',
  );
}