live WEB search

This commit is contained in:
Mehul Ahal 2022-12-23 11:20:46 +01:00 committed by Mguy13
parent 47945dbec7
commit 4ade7f1682
19 changed files with 503 additions and 59 deletions

View file

@ -1,8 +1,12 @@
import 'package:mc_gallery/features/core/services/logging_service.dart';
import 'package:mc_gallery/features/home/data/models/image_model.dart';
import 'package:mc_gallery/locator.dart';
import 'dart:async';
import '/features/core/data/extensions/iterable_extensions.dart';
import '/features/core/services/logging_service.dart';
import '/features/core/utils/mutex.dart';
import '/features/home/data/models/image_model.dart';
import '/locator.dart';
import '../abstracts/images_api.dart';
import '../data/enums/search_option.dart';
/// Handles fetching and storing of Images.
///
@ -21,7 +25,14 @@ class ImagesService {
final LoggingService _loggingService;
late final Iterable<ImageModel> _imageModels;
Iterable<ImageModel> get imageModels => _imageModels;
Iterable<ImageModel> get imageModels => _imageModels.deepCopy;
final Mutex _searchMutex = Mutex();
/// Manual initialization triggering
///
/// Since this service not critical to app-start-up [Locator]'s `signalsReady=true` is not used.
final Completer _initAwaiter = Completer();
Future get initAwaiter => _initAwaiter.future;
Future<void> _init() async {
_loggingService.info('Fetching and creating image models...');
@ -31,7 +42,7 @@ class ImagesService {
? _loggingService.good("Created ${_imageModels.length} images' models")
: _loggingService.warning('No images found');
Locator.instance().signalReady(this);
_initAwaiter.complete();
}
int get firstAvailableImageIndex => 0;
@ -40,5 +51,28 @@ class ImagesService {
ImageModel imageModelAt({required int index}) => _imageModels.elementAt(index);
Future<void> get lastQueryIsCompleted => _searchMutex.lastOperationCompletionAwaiter;
Future<List<ImageModel>> searchImages({
required SearchOption searchOption,
required String imageNamePart,
}) async {
return await _searchMutex.lockAndRun(run: (final unlock) async {
try {
switch (searchOption) {
case SearchOption.local:
return [];
case SearchOption.web:
return await _imagesApi.searchImages(
searchStr: imageNamePart,
token: '',
);
}
} finally {
unlock();
}
});
}
static ImagesService get locate => Locator.locate();
}