import 'dart:async'; import 'dart:convert' show HtmlEscape, base64, utf8; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:logging/logging.dart'; import 'package:fcs/config.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/vo/buyer.dart'; import 'package:fcs/vo/popup_menu.dart'; import 'base_model.dart'; import 'constants.dart'; import 'firebase_helper.dart'; class BuyerModel extends BaseModel { final log = Logger('BuyerModel'); StreamSubscription listener; List buyers = []; PopupMenu popupMenu = new PopupMenu(index: 0); PopupMenu sortMenu = new PopupMenu(); Buyer searchBuyer; void initUser(user) { super.initUser(user); _loadBuyers(); } Future _loadBuyers() async { if (!user.isOwnerAndAbove() && !user.hasBuyer()) { return; } listener = getQuerySnapshotByOrder( "/$biz_collection/${setting.okEnergyId}/$buyer_collection", 'user_name') .listen((snaps) async { buyers.clear(); snaps.documents.forEach((d) { buyers.add(Buyer.fromMap(d.data, d.documentID)); }); notifyListeners(); }); } @override logout() async { if (listener != null) await listener.cancel(); buyers = []; } Future getBuyer(String buyerID) async { var snap = await getDocSnap( "/$biz_collection/${setting.okEnergyId}/$buyer_collection", buyerID); return Buyer.fromMap(snap.data, snap.documentID); } Future loadBuyerProducts(Buyer buyer, {bool force = false}) async { if (!force && buyer.buyerProducts != null && buyer.buyerProducts.length > 0) return buyer; var snaps = await getSnapshot( "/$biz_collection/${setting.okEnergyId}/$buyer_collection/${buyer.id}/$product_collection"); buyer.buyerProducts = snaps.documents .map((s) => BuyerProduct.fromMap(s.data, s.documentID)) .toList(); return buyer; } Future delete(Buyer buyer) async { await request("/buyer/${buyer.id}", "DELETE", token: await getToken()); } Future approve(Buyer buyer) async { await request("/buyer/approve", "PUT", payload: buyer.toMap(), token: await getToken()); } Future reject(Buyer buyer) async { await request("/buyer/reject", "POST", payload: buyer.toMap(), token: await getToken()); } Future allocate(Buyer buyer) async { await request("/buyer/allocate", "POST", payload: buyer.toMap(), token: await getToken()); } void filterStatus(String status, int _selectedIndex, int _sleectedSortIndex) { this.sortMenu.index = _sleectedSortIndex; buyers.clear(); if (listener != null) { listener.cancel(); } this.popupMenu.index = _selectedIndex; String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection"; listener = getFilterStatusSnapshot(path, status, 'user_name') .listen((snaps) async { buyers.clear(); snaps.documents.forEach((d) { buyers.add(Buyer.fromMap(d.data, d.documentID)); }); notifyListeners(); }); notifyListeners(); } Future> search(String searchBuyer) async { if (searchBuyer == null || searchBuyer == '') return List(); var bytes = utf8.encode(searchBuyer); var base64Str = base64.encode(bytes); HtmlEscape htmlEscape = const HtmlEscape(); String escapeBuyer = htmlEscape.convert(base64Str); int limit = 20; List _buyers = []; try { var data = await request( "/api/fts/$buyer_collection/$escapeBuyer/$limit", "GET", token: await getToken(), url: Config.instance.reportURL); if (data == null) return List(); data.forEach((buyer) { var _buyer = Buyer.fromJson(buyer); _buyers.add(_buyer); }); } catch (e) { // permission error log.warning("buyer error:" + e.toString()); return null; } return _buyers; } void filterSorting(int _sleectedSortIndex, int _selectedIndex) { this.popupMenu.index = _selectedIndex; buyers.clear(); if (listener != null) { listener.cancel(); } String _fieldName; bool descending = false; if (_sleectedSortIndex == 0) { _fieldName = 'user_name'; descending = false; } if (_sleectedSortIndex == 1) { _fieldName = 'user_name'; descending = true; } if (_sleectedSortIndex == 2) { _fieldName = 'phone_number'; descending = false; } if (_sleectedSortIndex == 3) { _fieldName = 'phone_number'; descending = true; } this.sortMenu.index = _sleectedSortIndex; String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection"; listener = getFilterSnapshot(path, descending, _fieldName).listen((snaps) async { buyers.clear(); snaps.documents.forEach((d) { buyers.add(Buyer.fromMap(d.data, d.documentID)); notifyListeners(); }); notifyListeners(); }); notifyListeners(); } }