import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:logging/logging.dart'; import '../../../constants.dart'; import '../../../domain/entities/package.dart'; import '../../main/model/base_model.dart'; class PackageSelectionModel extends BaseModel { final log = Logger("PackageSelectionModel"); String query = ""; List packages = []; List selectedPackages = []; bool isLoading = false; DocumentSnapshot? _lastDocument; bool ended = false; Timer? t; search(String term, {bool imm = false, required String shipmentId, required String senderId, required String consigneeId}) async { query = term; packages.clear(); _lastDocument = null; ended = false; t?.cancel(); t = Timer(Duration(milliseconds: imm ? 0 : 800), () async { await refresh( term: term, shipmentId: shipmentId, consigneeId: consigneeId, senderId: senderId); }); } Future refresh( {required String shipmentId, required String senderId, required String consigneeId, String term = ""}) async { packages.clear(); _lastDocument = null; ended = false; await loadMoreData( shipmentId: shipmentId, senderId: senderId, consigneeId: consigneeId, term: term); notifyListeners(); } Future loadMoreData( {required String shipmentId, required String senderId, required String consigneeId, String term = ""}) async { int rowPerPage = 20; try { isLoading = true; String path = "/$packages_collection"; Query query = FirebaseFirestore.instance .collection(path) .where("status", whereIn: [package_processed_status, package_packed_status]) .where("sender_id", isEqualTo: senderId) .where("user_id", isEqualTo: consigneeId) .where("is_deleted", isEqualTo: false); if (term != "") { query = query.where("tracking_id", isEqualTo: term); } query = query.orderBy("created_date", descending: true); if (_lastDocument != null) { query = query.startAfterDocument(_lastDocument!); } QuerySnapshot querySnap = await query.limit(rowPerPage).get(); if (querySnap.docs.isEmpty) return; _lastDocument = querySnap.docs[querySnap.docs.length - 1]; List list = querySnap.docs.map((documentSnapshot) { var p = Package.fromMap(documentSnapshot.data() as Map, documentSnapshot.id); return p; }).toList(); for (var p in list) { selectedPackages.contains(p) ? p.isChecked = true : p.isChecked = false; } packages.addAll(list); if (list.length < rowPerPage) ended = true; notifyListeners(); } catch (e) { log.warning("error:$e"); } finally { isLoading = false; } } selectPackage(Package a) { if (a.isChecked) { selectedPackages.add(a); } else { selectedPackages.remove(a); } } addSelectedPackage(List list) { selectedPackages = list; } clearSelection() { selectedPackages.clear(); packages.clear(); query = ""; } Future> getPackagesBySenderAndConsigneeId( {required String senderId, required String consigneeId}) async { List list = []; try { String path = "/$packages_collection"; var snaps = await FirebaseFirestore.instance .collection(path) .where("sender_id", isEqualTo: senderId) .where("user_id", isEqualTo: consigneeId) .where("is_deleted", isEqualTo: false) .get(const GetOptions(source: Source.server)); list = snaps.docs .map((documentSnapshot) => Package.fromMap(documentSnapshot.data(), documentSnapshot.id)) .toList(); } catch (e) { log.warning("Error!! $e"); list = []; } return list; } }