import 'package:flutter/foundation.dart'; import 'package:result_monad/result_monad.dart'; import '../friendica_client/friendica_client.dart'; import '../friendica_client/paging_data.dart'; import '../globals.dart'; import '../models/exec_error.dart'; import '../models/gallery_data.dart'; import '../models/image_entry.dart'; import 'auth_service.dart'; class GalleryService extends ChangeNotifier { static const IMAGES_PER_PAGE = 50; final _galleries = {}; final _galleryPages = >{}; final _images = >{}; var _loaded = false; bool get loaded => _loaded; List getGalleries() { if (_galleries.isEmpty) { updateGalleries(); } return _galleries.values.toList(growable: false); } Result getGallery(String galleryName) { final gallery = _galleries[galleryName]; if (gallery == null) { return buildErrorResult( type: ErrorType.notFound, message: 'Gallery $galleryName not found', ); } return Result.ok(gallery); } FutureResult, ExecError> updateGalleries() async { final result = await GalleryClient(getIt().currentProfile) .getGalleryData(); if (result.isFailure) { return result.errorCast(); } for (final gallery in result.value) { _galleries[gallery.name] = gallery; } _loaded = true; notifyListeners(); return Result.ok(_galleries.values.toList(growable: false)); } Result, ExecError> getGalleryImageList(String galleryName) { if (!_galleries.containsKey(galleryName)) { return Result.error( ExecError( type: ErrorType.localError, message: 'Unknown Gallery: $galleryName', ), ); } if (!_images.containsKey(galleryName)) { updateGalleryImageList(galleryName: galleryName, withNextPage: true); return Result.ok([]); } else { return Result.ok(_images[galleryName]!.toList(growable: false)); } } //TODO Paging FutureResult, ExecError> updateGalleryImageList( {required String galleryName, required bool withNextPage, bool nextPageOnly = true}) async { final pages = _galleryPages.putIfAbsent(galleryName, () => []); if (pages.isEmpty) { pages.add(PagingData(offset: 0, limit: IMAGES_PER_PAGE)); } else if (withNextPage) { final offset = pages.last.offset! + 1; pages.add(PagingData(offset: offset, limit: IMAGES_PER_PAGE)); } final imageSet = _images.putIfAbsent(galleryName, () => {}); final pagesToUse = nextPageOnly ? [pages.last] : pages; for (final page in pagesToUse) { final result = await GalleryClient(getIt().currentProfile) .getGalleryImages(galleryName, page); if (result.isFailure) { return result.errorCast(); } imageSet.addAll(result.value); } notifyListeners(); return Result.ok(imageSet.toList(growable: false)); } }