2020-10-12 03:34:05 +06:30
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
2020-10-15 19:40:03 +06:30
|
|
|
import 'package:fcs/pages/widgets/callbacks.dart';
|
2020-10-12 03:34:05 +06:30
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
|
|
2020-10-15 19:40:03 +06:30
|
|
|
typedef ToObj = Function(Map<String, dynamic> data, String id);
|
|
|
|
|
|
2020-10-12 03:34:05 +06:30
|
|
|
/*
|
|
|
|
|
* Pagination load data in page
|
|
|
|
|
*/
|
2020-10-15 19:40:03 +06:30
|
|
|
class Paginator<T> {
|
|
|
|
|
final log = Logger('Paginator');
|
2020-10-12 03:34:05 +06:30
|
|
|
|
|
|
|
|
final int rowPerLoad;
|
|
|
|
|
DocumentSnapshot prev;
|
|
|
|
|
bool ended = false;
|
2020-10-15 19:40:03 +06:30
|
|
|
bool isLoading = false;
|
|
|
|
|
List<T> values = [];
|
|
|
|
|
ToObj toObj;
|
2020-10-12 03:34:05 +06:30
|
|
|
|
|
|
|
|
Query pageQuery;
|
|
|
|
|
|
2020-10-15 19:40:03 +06:30
|
|
|
Paginator(this.pageQuery, {this.rowPerLoad = 20, this.toObj}) {
|
2020-10-12 03:34:05 +06:30
|
|
|
_clearState();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _clearState() {
|
|
|
|
|
prev = null;
|
|
|
|
|
ended = false;
|
2020-10-15 19:40:03 +06:30
|
|
|
isLoading = false;
|
|
|
|
|
values = [];
|
2020-10-12 03:34:05 +06:30
|
|
|
}
|
|
|
|
|
|
2020-10-15 19:40:03 +06:30
|
|
|
void close() {
|
|
|
|
|
_clearState();
|
2020-10-12 03:34:05 +06:30
|
|
|
}
|
|
|
|
|
|
2020-10-15 19:40:03 +06:30
|
|
|
Future<void> refresh({CallBack onFinished}) async {
|
2020-10-12 03:34:05 +06:30
|
|
|
_clearState();
|
2020-10-15 19:40:03 +06:30
|
|
|
await load();
|
|
|
|
|
if (onFinished != null) onFinished();
|
2020-10-12 03:34:05 +06:30
|
|
|
}
|
|
|
|
|
|
2020-10-15 19:40:03 +06:30
|
|
|
Future<bool> load({CallBack onFinished}) async {
|
|
|
|
|
if (ended) return null;
|
|
|
|
|
isLoading = true;
|
2020-10-12 03:34:05 +06:30
|
|
|
Query _query =
|
|
|
|
|
prev != null ? pageQuery.startAfterDocument(prev) : pageQuery;
|
|
|
|
|
try {
|
|
|
|
|
await _query
|
|
|
|
|
.limit(rowPerLoad)
|
|
|
|
|
.getDocuments(source: Source.server)
|
|
|
|
|
.then((QuerySnapshot snapshot) {
|
|
|
|
|
int count = snapshot.documents.length;
|
|
|
|
|
ended = count < rowPerLoad;
|
|
|
|
|
prev = count > 0 ? snapshot.documents[count - 1] : prev;
|
|
|
|
|
snapshot.documents.forEach((e) {
|
2020-10-15 19:40:03 +06:30
|
|
|
values.add(toObj(e.data, e.documentID));
|
2020-10-12 03:34:05 +06:30
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log.warning("Error!! $e");
|
2020-10-15 19:40:03 +06:30
|
|
|
} finally {
|
|
|
|
|
isLoading = false;
|
|
|
|
|
if (onFinished != null) onFinished();
|
2020-10-12 03:34:05 +06:30
|
|
|
}
|
|
|
|
|
return ended;
|
|
|
|
|
}
|
|
|
|
|
}
|