Lazy Loading & Pagination, Alpha Channel -> White Conversion, Add Height & Width to DB & API
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:imagini/core/imagini_application.dart';
|
||||
import 'package:imagini/api/imagini_api_repository.dart';
|
||||
import 'package:imagini/graphql/imagini_graphql.dart';
|
||||
@@ -10,36 +9,53 @@ class HomeBloc{
|
||||
final ImaginiApplication _application;
|
||||
ImaginiAPIRepository _imaginiAPI;
|
||||
|
||||
final _mediaItemsController = StreamController<MediaItems$Query>.broadcast();
|
||||
Stream<MediaItems$Query> get mediaItemsResult => _mediaItemsController.stream;
|
||||
|
||||
final _loginController = StreamController<bool>.broadcast();
|
||||
Stream<bool> get loginResult => _loginController.stream;
|
||||
|
||||
final _authenticatedController = StreamController<bool>.broadcast();
|
||||
Stream<bool> get authenticatedResult => _authenticatedController.stream;
|
||||
|
||||
Map<int, List<MediaItems$Query$MediaItemResponse$MediaItem>> _pagedMediaItemListCache =
|
||||
Map<int, List<MediaItems$Query$MediaItemResponse$MediaItem>>();
|
||||
|
||||
int totalMediaItems;
|
||||
int _pageSize = 50;
|
||||
|
||||
HomeBloc(this._application){
|
||||
_init();
|
||||
}
|
||||
|
||||
void _init(){
|
||||
_imaginiAPI = _application.imaginiAPI;
|
||||
getMediaItems();
|
||||
}
|
||||
|
||||
void dispose(){
|
||||
_loginController.close();
|
||||
_authenticatedController.close();
|
||||
_mediaItemsController.close();
|
||||
}
|
||||
|
||||
Future<CachedNetworkImage> getImage(String fileName, int derivedContentWidth){
|
||||
return _imaginiAPI.getImage(fileName, derivedContentWidth);
|
||||
Future<CachedNetworkImage> getMedia(int index, derivedContentWidth) async {
|
||||
MediaItems$Query$MediaItemResponse$MediaItem mediaDetails = await getMediaDetails(index);
|
||||
if (mediaDetails == null)
|
||||
return null;
|
||||
int derivedContentHeight = (mediaDetails.height / mediaDetails.width * derivedContentWidth).ceil();
|
||||
return _imaginiAPI.getImage(mediaDetails.fileName, derivedContentWidth, derivedContentHeight);
|
||||
}
|
||||
|
||||
getMediaItems(){
|
||||
_mediaItemsController.addStream(_imaginiAPI.mediaItems());
|
||||
Future<MediaItems$Query$MediaItemResponse$MediaItem> getMediaDetails(int index) async {
|
||||
int itemPage = (index / _pageSize).ceil();
|
||||
int indexOnPage = index % _pageSize;
|
||||
|
||||
if (!_pagedMediaItemListCache.containsKey(itemPage))
|
||||
await _cachePage(itemPage);
|
||||
|
||||
return _pagedMediaItemListCache[itemPage][indexOnPage];
|
||||
}
|
||||
|
||||
_cachePage(int itemPage) async {
|
||||
MediaItems$Query newItems = await _imaginiAPI.mediaItems(Page(page: itemPage));
|
||||
totalMediaItems = newItems.mediaItems.page.total;
|
||||
_pagedMediaItemListCache[itemPage] = newItems.mediaItems.data;
|
||||
}
|
||||
|
||||
checkAuthentication(){
|
||||
|
||||
Reference in New Issue
Block a user