syncGallery method

Future<void> syncGallery(
  1. UFilePickerController photos, {
  2. required List<UMediaResponse> existing,
  3. String? hotelId,
  4. String? hotelRoomId,
  5. String? dormId,
  6. String? dormRoomId,
  7. String? dormBedId,
})

Saves a UFilePicker.gallery: deletes removed photos, uploads new ones (category = first tag) and moves the cover mark.

Implementation

Future<void> syncGallery(
  UFilePickerController photos, {
  required List<UMediaResponse> existing,
  String? hotelId,
  String? hotelRoomId,
  String? dormId,
  String? dormRoomId,
  String? dormBedId,
}) async {
  if (!photos.hasChanges) return;
  void ignore(_) {}

  final Set<String> deletedIds = photos.removedFiles.map((UFileData f) => f.id!).toSet();
  for (final String id in deletedIds) {
    await delete(p: UIdParams(id: id), onOk: ignore, onError: ignore, onException: ignore);
  }

  final List<UFileData> newFiles = photos.files;
  final UFileData? cover = photos.coverChanged ? photos.cover : null;
  final int coverNewIndex = cover != null && cover.id == null ? newFiles.indexOf(cover) : -1;
  final List<String?> uploadedIds = <String?>[];
  for (int i = 0; i < newFiles.length; i++) {
    final (UResponse<String>? ok, _, _) = await create(
      p: UMediaCreateParams(
        file: newFiles[i],
        tag1: TagMedia.image.number,
        tag2: newFiles[i].tags?.firstOrNull,
        tag3: coverNewIndex == i ? TagMedia.cover.number : null,
        hotelId: hotelId,
        hotelRoomId: hotelRoomId,
        dormId: dormId,
        dormRoomId: dormRoomId,
        dormBedId: dormBedId,
      ),
      onOk: ignore,
      onError: ignore,
      onException: ignore,
    );
    uploadedIds.add(ok?.result);
  }

  // The cover mark lives on exactly one photo.
  final String? newCoverId = cover?.id ?? (coverNewIndex < 0 ? null : uploadedIds[coverNewIndex]);
  if (newCoverId == null) return;
  for (final UMediaResponse m in existing.where((UMediaResponse m) => m.tags.contains(TagMedia.cover.number) && m.id != newCoverId && !deletedIds.contains(m.id))) {
    await update(p: UMediaUpdateParams(id: m.id, removeTags: <int>[TagMedia.cover.number]), onOk: ignore, onError: ignore, onException: ignore);
  }
  if (cover?.id != null) await update(p: UMediaUpdateParams(id: newCoverId, addTags: <int>[TagMedia.cover.number]), onOk: ignore, onError: ignore, onException: ignore);
}