syncGallery method
Future<void>
syncGallery(
- UFilePickerController photos, {
- required List<
UMediaResponse> existing, - String? hotelId,
- String? hotelRoomId,
- String? dormId,
- String? dormRoomId,
- 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);
}