import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/data/services/services.dart'; import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/vo/privilege.dart'; import 'package:fcs/helpers/firebase_helper.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; import '../../../pagination/paginator_listener.dart'; class StaffModel extends BaseModel { final log = Logger('StaffModel'); PaginatorListener? getStaffs; StreamSubscription? privilegeListener; List privileges = []; @override void privilegeChanged() { super.privilegeChanged(); _loadPrivileges(); } @override logout() async { getStaffs?.close(); if (privilegeListener != null) privilegeListener!.cancel(); privileges = []; } loadPaginationStaffs() { if (user == null || !user!.hasStaffs()) return; String path = "/$user_collection"; Query col = FirebaseFirestore.instance .collection(path) .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false); Query pageQuery = FirebaseFirestore.instance .collection(path) .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) .orderBy("update_time", descending: true); getStaffs?.close(); getStaffs = PaginatorListener( col, pageQuery, (data, id) => User.fromMap(data, id), rowPerLoad: 30); } Future _loadPrivileges() async { try { privilegeListener = FirebaseFirestore.instance .collection("/$privilege_collection") .snapshots() .listen((QuerySnapshot snapshot) { privileges.clear(); privileges = snapshot.docs.map((documentSnapshot) { var privilege = Privilege.fromMap( documentSnapshot.data() as Map, documentSnapshot.id); return privilege; }).toList(); notifyListeners(); }); } catch (e) { log.warning("Error!! $e"); } } Future updatePrivileges(String userID, List privileges) async { await request("/employee/privileges", "PUT", payload: {"id": userID, "privileges": privileges}, token: await getToken()); } Future updatePin( {required String userID, required bool enablePin, required int? pin}) async { // await request("/employee/pin", "PUT", // payload: { // "id": userID, // "enable_pin_login": enablePin, // "new_pin": pin // }, // token: await getToken()); } Future findUser(String phoneNumber) { return Services.instance.userService.findUser(phoneNumber); } Future> getPickupEmployees() async { if (user == null || !user!.hasShipment()) return []; return _getUsers(privilege_shipment); } Future> _getUsers(String privilege) async { List users = []; try { var snaps = await FirebaseFirestore.instance .collection("/$user_collection") .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) .where("privileges", arrayContains: privilege) .get(const GetOptions(source: Source.server)); users = snaps.docs.map((documentSnapshot) { var user = User.fromMap( documentSnapshot.data as Map, documentSnapshot.id); return user; }).toList(); } catch (e) { log.warning("Error!! $e"); } return users; } Future getUser(String userID) async { if (userID == "") return null; String path = "/$user_collection"; try { var snap = await FirebaseFirestore.instance .collection(path) .doc(userID) .get(const GetOptions(source: Source.server)); if (snap.data() == null) return null; Map? data = snap.data() as Map; if (data['delete_time'] == 0) { User user = User.fromMap(data, snap.id); return user; } else { return null; } } catch (e) { log.warning("Error!! $e"); } return null; } }