2024-02-07 17:26:29 +06:30
|
|
|
import 'dart:async';
|
2024-03-05 16:32:54 +06:30
|
|
|
import 'dart:convert';
|
2024-02-07 17:26:29 +06:30
|
|
|
|
|
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
|
|
2024-09-22 16:49:59 +06:30
|
|
|
import '../../../constants.dart';
|
2024-10-07 20:42:45 +06:30
|
|
|
import '../../../data/services/services.dart';
|
2024-02-07 17:26:29 +06:30
|
|
|
import '../../../domain/entities/user.dart';
|
2024-03-05 16:32:54 +06:30
|
|
|
import '../../../helpers/api_helper.dart';
|
|
|
|
|
import '../../../helpers/firebase_helper.dart';
|
2024-02-07 17:26:29 +06:30
|
|
|
import '../../main/model/base_model.dart';
|
|
|
|
|
|
|
|
|
|
class ConsigneeSelectionModel extends BaseModel {
|
|
|
|
|
final log = Logger("ConsigneeSearchModel");
|
|
|
|
|
// for search
|
|
|
|
|
String query = "";
|
|
|
|
|
List<User> _consignees = [];
|
|
|
|
|
|
|
|
|
|
List<User> get getConsginees {
|
|
|
|
|
var users = new List<User>.from(_consignees);
|
2024-03-05 16:32:54 +06:30
|
|
|
if (query == "") {
|
|
|
|
|
return users..insert(0, User(id: all, name: "All"));
|
|
|
|
|
}
|
|
|
|
|
return users;
|
2024-02-07 17:26:29 +06:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool isLoading = false;
|
|
|
|
|
|
|
|
|
|
// for default user
|
|
|
|
|
DocumentSnapshot? _lastDocument;
|
|
|
|
|
bool ended = false;
|
|
|
|
|
|
|
|
|
|
Timer? t;
|
|
|
|
|
search(String term, {bool imm = false}) async {
|
|
|
|
|
query = term;
|
|
|
|
|
_consignees.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;
|
|
|
|
|
}
|
2024-03-05 16:32:54 +06:30
|
|
|
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",
|
2024-10-07 20:42:45 +06:30
|
|
|
url: Services.setting.reportURL, token: await getToken());
|
2024-03-05 16:32:54 +06:30
|
|
|
|
|
|
|
|
if (result != null) {
|
|
|
|
|
for (var row in result) {
|
|
|
|
|
var item = User.fromJson(row);
|
|
|
|
|
list.add(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_consignees = List.from(list);
|
2024-02-07 17:26:29 +06:30
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addDefaultConsginees() async {
|
|
|
|
|
_consignees.clear();
|
|
|
|
|
await _refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> _refresh() async {
|
|
|
|
|
_consignees.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)
|
2024-10-01 18:15:53 +06:30
|
|
|
.where("delete_time", isEqualTo: 0)
|
|
|
|
|
.orderBy("update_time", descending: true);
|
2024-02-07 17:26:29 +06:30
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
_consignees.addAll(list);
|
|
|
|
|
if (list.length < rowPerPage) ended = true;
|
|
|
|
|
notifyListeners();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log.warning("error:$e");
|
|
|
|
|
} finally {
|
|
|
|
|
isLoading = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clear() {
|
|
|
|
|
_consignees.clear();
|
|
|
|
|
query = "";
|
|
|
|
|
}
|
|
|
|
|
}
|