Files
fcs/lib/pages/carton/model/sender_selection_model.dart
2024-10-01 18:15:53 +06:30

129 lines
3.1 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:logging/logging.dart';
import '../../../config.dart';
import '../../../constants.dart';
import '../../../domain/entities/user.dart';
import '../../../helpers/api_helper.dart';
import '../../../helpers/firebase_helper.dart';
import '../../main/model/base_model.dart';
class SenderSelectionModel extends BaseModel {
final log = Logger("SenderSelectionModel");
// for search
String query = "";
List<User> _senders = [];
List<User> get getSenders {
var users = new List<User>.from(_senders);
if (query == "") {
return users..insert(0, User(id: all, name: "All"));
}
return users;
}
bool isLoading = false;
// for default user
DocumentSnapshot? _lastDocument;
bool ended = false;
Timer? t;
search(String term, {bool imm = false}) async {
query = term;
_senders.clear();
t?.cancel();
t = Timer(Duration(milliseconds: imm ? 0 : 800), () async {
await loadMoreSearch(term: term);
});
}
Future<void> 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<User> 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 = List.from(list);
notifyListeners();
}
addDefaultSenders() async {
_senders.clear();
await _refresh();
}
Future<void> _refresh() async {
_senders.clear();
_lastDocument = null;
ended = false;
await loadMoreData();
notifyListeners();
}
Future<void> 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("delete_time", isEqualTo: 0)
.orderBy("update_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<User> list = querySnap.docs.map((documentSnapshot) {
var p = User.fromMap(documentSnapshot.data() as Map<String, dynamic>,
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 = "";
}
}