markMessagesAsReadByPredicate function

Future<void> markMessagesAsReadByPredicate(
  1. String agentName,
  2. bool predicate(
    1. TeammateMessage
    ), {
  3. String? teamName,
})

Mark messages matching predicate as read, leaving others unread.

Implementation

Future<void> markMessagesAsReadByPredicate(
  String agentName,
  bool Function(TeammateMessage) predicate, {
  String? teamName,
}) async {
  final inboxPath = getInboxPath(agentName, teamName: teamName);
  final lockFilePath = '$inboxPath.lock';
  final lock = File(lockFilePath);

  try {
    await _acquireLock(lock);

    final messages = await readMailbox(agentName, teamName: teamName);
    if (messages.isEmpty) return;

    final updated = messages.map((m) {
      if (!m.read && predicate(m)) return m.copyWith(read: true);
      return m;
    }).toList();

    final encoder = const JsonEncoder.withIndent('  ');
    await File(
      inboxPath,
    ).writeAsString(encoder.convert(updated.map((m) => m.toJson()).toList()));
  } on PathNotFoundException {
    return;
  } catch (_) {
  } finally {
    await _releaseLock(lock);
  }
}