toggleAllAttachments method

Future<void> toggleAllAttachments()

Implementation

Future<void> toggleAllAttachments() async {
  final List<bool> previousSelected =
      attachments.map((Attachment a) => a.selected).toList();

  allAttachmentsDisabled.value = !allAttachmentsDisabled.value;
  final bool newSelected = !allAttachmentsDisabled.value;
  for (Attachment attachment in attachments) {
    attachment.selected = newSelected;
  }
  attachments.refresh();
  update();

  final List<Future<bool>> futures = <Future<bool>>[];
  for (int i = 0; i < attachments.length; i++) {
    final bool prevSelected = previousSelected[i];
    if (prevSelected == newSelected) continue;

    final Attachment attachment = attachments[i];
    final int index = i;

    futures.add(() async {
      const int maxRetries = 3;
      for (int attempt = 0; attempt < maxRetries; attempt++) {
        try {
          final Attachment? result = await AttachmentService
              .patchAttachmentSelected(attachment.id, newSelected);
          if (result != null) return true;
        } catch (_) {}
      }
      if (index < attachments.length) {
        attachments[index].selected = prevSelected;
      }
      return false;
    }());
  }

  await Future.wait(futures);
  attachments.refresh();
  allAttachmentsDisabled.value =
      !attachments.any((Attachment a) => a.selected);
  update();
}