import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:logging/logging.dart'; import '../../../domain/constants.dart'; import '../../../domain/entities/user.dart'; import '../../main/model/base_model.dart'; class SenderSelectionModel extends BaseModel { final log = Logger("SenderSelectionModel"); // for search String query = ""; int offset = 0; bool reachEnd = false; List _senders = []; List get getSenders { var users = new List.from(_senders); return users..insert(0, User(id: all, name: "All")); } bool isLoading = false; // for default user DocumentSnapshot? _lastDocument; bool ended = false; Timer? t; search(String term, {bool imm = false}) async { query = term; _senders.clear(); offset = 0; reachEnd = false; t?.cancel(); t = Timer(Duration(milliseconds: imm ? 0 : 800), () async { await loadMoreSearch(term: term); }); } Future loadMoreSearch({required String term}) async { if (term == "") { await _refresh(); return; } // var bytes = utf8.encode(term); // var base64Str = base64.encode(bytes); // HtmlEscape htmlEscape = const HtmlEscape(); // String escapeSender = htmlEscape.convert(base64Str); // int rowPerPage = 20; // List list = []; // var result = await requestAPI( // "/api/fts/$user_collection/$escapeSender/$rowPerPage", "GET", // url: Config.instance.reportURL, token: await getToken()); // if (result != null) { // for (var row in result) { // var item = User.fromJson(row); // list.add(item); // } // } // _senders.addAll(list); // offset += rowPerPage; // if (list.length < rowPerPage) { // reachEnd = true; // } // notifyListeners(); } addDefaultSenders() async { _senders.clear(); await _refresh(); } Future _refresh() async { _senders.clear(); _lastDocument = null; ended = false; await loadMoreData(); notifyListeners(); } Future loadMoreData() async { int rowPerPage = 20; try { isLoading = true; String path = "/$user_collection"; Query query = FirebaseFirestore.instance .collection(path) .where("is_sys_admin", isEqualTo: false) .where("is_deleted", isEqualTo: false) .orderBy("message_time", 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 = User.fromMap(documentSnapshot.data() as Map, documentSnapshot.id); return p; }).toList(); _senders.addAll(list); if (list.length < rowPerPage) ended = true; notifyListeners(); } catch (e) { log.warning("error:$e"); } finally { isLoading = false; } } clear() { _senders.clear(); query = ""; } }