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/role.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/firebase_helper.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; class StaffModel extends BaseModel { final log = Logger('StaffModel'); StreamSubscription listener; StreamSubscription privilegeListener; List employees = []; List privileges = []; @override void privilegeChanged() { super.privilegeChanged(); _loadPrivileges(); _loadEmployees(); } @override logout() async { if (listener != null) listener.cancel(); if (privilegeListener != null) privilegeListener.cancel(); employees = []; privileges = []; } Future _loadEmployees() async { if (user == null || !user.hasStaffs()) return; try { if (listener != null) listener.cancel(); listener = Firestore.instance .collection("/$user_collection") .where("is_employee", isEqualTo: true) .where("is_sys_admin", isEqualTo: false) .snapshots() .listen((QuerySnapshot snapshot) { employees.clear(); employees = snapshot.documents.map((documentSnapshot) { var user = User.fromMap(documentSnapshot.data, documentSnapshot.documentID); return user; }).toList(); notifyListeners(); }); } catch (e) { log.warning("Error!! $e"); } } Future _loadPrivileges() async { if (user == null || !user.hasStaffs()) return; try { privilegeListener = Firestore.instance .collection("/$privilege_collection") .snapshots() .listen((QuerySnapshot snapshot) { privileges.clear(); privileges = snapshot.documents.map((documentSnapshot) { var privilege = Privilege.fromMap( documentSnapshot.data, documentSnapshot.documentID); 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 findUser(String phoneNumber) { return Services.instance.userService.findUser(phoneNumber); } }