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/discount.dart'; import 'package:fcs/helpers/paginator.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; class DiscountModel extends BaseModel { final log = Logger('DiscountModel'); StreamSubscription? listener; List _discounts = []; List get discounts => _selectedIndex == 1 ? _discounts : List.from(_used?.values ?? []); Paginator? _used; bool isLoading = false; int _selectedIndex = 1; set selectedIndex(int index) { _selectedIndex = index; notifyListeners(); } int get selectedIndex => _selectedIndex; initData() { _selectedIndex = 1; _load(); if (_getUsed() != null) _used = _getUsed(); _used?.load(); } void initUser(user) { super.initUser(user); _load(); } _load() { if (listener != null) listener!.cancel(); try { listener = FirebaseFirestore.instance .collection("/$discounts_collection") .orderBy("code", descending: false) .snapshots() .listen((snaps) { _discounts.clear(); snaps.docs.forEach((d) { _discounts.add(Discount.fromMap(d.data(), d.id)); }); notifyListeners(); }); } catch (e) { log.warning("error:$e"); } } Paginator _getUsed() { if (user == null || !user!.hasFcsShipments()) throw "No Privilege"; var pageQuery = FirebaseFirestore.instance .collection("/$discounts_collection") .where("status", isEqualTo: fcs_shipment_shipped_status) .orderBy("code", descending: false); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { return Discount.fromMap(data, id); }); return paginator; } Future?> getDiscount(String userID) async { String path = "/$discounts_collection"; try { var q = FirebaseFirestore.instance .collection("$path") .where("customer_id", isEqualTo: userID) .where("status", isEqualTo: "available"); var snaps = await q.get(const GetOptions(source: Source.server)); var discounts = snaps.docs.map((snap) { if (snap.exists) { var s = Discount.fromMap(snap.data as Map, snap.id); return s; } }).toList(); return discounts; } catch (e) { log.warning("Error!! $e"); } return null; } Future loadMore() async { if (_used!.ended || _selectedIndex == 1) return; isLoading = true; notifyListeners(); await _used!.load(onFinished: () { isLoading = false; notifyListeners(); }); } Future refresh() async { if (_selectedIndex == 1) return; await _used!.refresh(onFinished: () { notifyListeners(); }); } @override logout() async { if (listener != null) await listener!.cancel(); if (_used != null) _used!.close(); _discounts = []; } Future addDiscount(Discount discount) async { return Services.instance.commonService.createDiscount(discount); } Future updateDiscount(Discount discount) async { return Services.instance.commonService.updateDiscount(discount); } Future deleteDiscount(Discount discount) async { return Services.instance.commonService.deleteDiscount(discount.id!); } }