import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:logging/logging.dart'; import 'package:fcs/vo/product.dart'; import 'package:fcs/vo/setting.dart'; import 'base_model.dart'; import 'constants.dart'; import 'firebase_helper.dart'; class ProductModel extends BaseModel { final log = Logger('ProductModel'); List products = []; List tempProducts = []; List get getPrices { List productPrices = []; this.products.forEach((p) => productPrices.addAll(p.getPrices)); productPrices.sort((p1, p2) => p1.compareTo(p2)); return productPrices; } String getProductName(String productID) { return products.firstWhere((p) => p.id == productID).name; } Product getProduct(String productID) { return products.firstWhere((p) => p.id == productID); } List get productsToEdit { // clone products tempProducts = products.map((p) => Product.clone(p)).toList(); tempProducts.sort((p1, p2) => p1.displayOrder.compareTo(p2.displayOrder)); // set old price with price tempProducts.forEach((p) { p.oldPirce = p.price; p.action = "update"; }); return tempProducts; } void saveProduct(Product product, String name, price, displayOrder, int color, bool isDisable) { if (product == null) { tempProducts.add(Product( action: "create", name: name, price: int.parse(price), color: color, displayOrder: int.parse(displayOrder), isDisable: isDisable)); } else { Product _product = product; _product.name = name; _product.price = int.parse(price); _product.color = color; _product.displayOrder = int.parse(displayOrder); _product.isDisable = isDisable; if (_product.id == null) { _product.action = "create"; } else { _product.action = "update"; } } notifyListeners(); } void deleteProduct(Product product) { if (product == null) { return; } if (product.id == null) { tempProducts.remove(product); } else { Product _product = tempProducts.firstWhere((p) => p.id == product.id); _product.action = "delete"; } notifyListeners(); } @override void initSetting(Setting setting) { super.initSetting(setting); try { getQuerySnapshot( "/$biz_collection/${setting.okEnergyId}/$product_collection") .listen((QuerySnapshot snapshot) { products.clear(); products = snapshot.documents.map((documentSnapshot) { var data = Product.fromMap( documentSnapshot.data, documentSnapshot.documentID); return data; }).toList(); products.sort((p1, p2) => p1.displayOrder.compareTo(p2.displayOrder)); notifyListeners(); }).onError((e) { log.warning("Error! $e"); }); } catch (e) { log.warning("Error!! $e"); } } @override logout() async { tempProducts = []; } updateProducts(List products) async { var items = []; products.forEach((p) { if (p.action != null) items.add(p.toMap()); }); await request("/products", "PUT", payload: items, token: await getToken()); } }