import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/entities/carton.dart'; import 'package:logging/logging.dart'; import '../../../domain/constants.dart'; import '../../main/model/base_model.dart'; class CartonSelectionModel extends BaseModel { final log = Logger("CartonSelectionModel"); // for search String query = ""; int offset = 0; bool reachEnd = false; List cartons = []; // for default carton DocumentSnapshot? _lastDocument; bool ended = false; List selectedCartonList = []; Timer? t; search(String term, {bool imm = false, required String shipmentId}) async { query = term; cartons.clear(); offset = 0; reachEnd = false; t?.cancel(); t = Timer(Duration(milliseconds: imm ? 0 : 800), () async { await loadMoreSearch(term: term, shipmentId: shipmentId); }); } Future loadMoreSearch( {required String term, required String shipmentId}) async { if (term == "") { await _refresh(shipmentId); return; } // int rowPerPage = 21; // List list = []; // SearchPara searchPara = SearchPara(filters: [], term: term); // isLoading = true; // var path = // "/search/$cartons_collection/${searchPara.escapeTerm}/$rowPerPage/$offset/${searchPara.escapeFilters}"; // var result = await requestAPI(path, "GET", // token: await getToken(), url: Config.instance.searchURL); // if (result != null) { // for (var row in result) { // var item = ArtistExt.fromMapForSearch(row); // list.add(item); // } // } // for (var p in list) { // selectedArtistList.contains(p) // ? p.isSelected = true // : p.isSelected = false; // } // artists.addAll(list); // offset += rowPerPage; // if (list.length < rowPerPage) { // reachEnd = true; // } notifyListeners(); } addDefaultCartons(String shipmentId) async { cartons.clear(); await _refresh(shipmentId); } selectCarton(Carton a) { if (a.isSelected) { selectedCartonList.add(a); } else { selectedCartonList.remove(a); } } Future _refresh(String shipmentId) async { cartons.clear(); _lastDocument = null; ended = false; await loadMoreData(shipmentId); notifyListeners(); } Future loadMoreData(String shipmentId) async { int rowPerPage = 20; try { String path = "/$cartons_collection"; Query query = FirebaseFirestore.instance .collection(path) .where("fcs_shipment_id", isEqualTo: shipmentId) // .where("status", isEqualTo: carton_processing_status) // .where("carton_type", isEqualTo: carton_mix_box) .where("is_deleted", isEqualTo: false) .orderBy("created_at", 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 = Carton.fromMap(documentSnapshot.data() as Map, documentSnapshot.id); return p; }).toList(); for (var p in list) { selectedCartonList.contains(p) ? p.isSelected = true : p.isSelected = false; } cartons.addAll(list); if (list.length < rowPerPage) ended = true; notifyListeners(); } catch (e) { log.warning("error:$e"); } } clearSelection() { selectedCartonList.clear(); cartons.clear(); query = ""; } }