import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/custom_duty.dart'; import 'package:fcs/domain/entities/discount_by_weight.dart'; import 'package:fcs/domain/entities/rate.dart'; import 'package:fcs/helpers/api_helper.dart'; import 'package:fcs/helpers/firebase_helper.dart'; import 'package:logging/logging.dart'; class RateDataProvider { final log = Logger('RateDataProvider'); static final RateDataProvider instance = RateDataProvider._(); RateDataProvider._(); late StreamController controller; static Rate _rate = Rate(); Stream _rateStream() async* { Stream snapshot = FirebaseFirestore.instance .collection(config_collection) .doc(rate_doc_id) .snapshots(); await for (var snap in snapshot) { print(snap.data()); Rate rate = Rate.fromMap(snap.data() as Map); yield rate; } } Stream> _cargoTypeStream() async* { List cargoTypes = []; Stream snapshots = FirebaseFirestore.instance .collection(config_collection) .doc(rate_doc_id) .collection(cargo_types_collection) .where("custom_duty", isEqualTo: false) .snapshots(); await for (var snaps in snapshots) { cargoTypes = []; cargoTypes = snaps.docs.map((snap) { return CargoType.fromMap(snap.data() as Map, snap.id); }).toList(); yield cargoTypes; } } Stream> _customDutiesStream() async* { List customDuries = []; Stream snapshots = FirebaseFirestore.instance .collection(config_collection) .doc(rate_doc_id) .collection(cargo_types_collection) .where("custom_duty", isEqualTo: true) .snapshots(); await for (var snaps in snapshots) { customDuries = []; customDuries = snaps.docs.map((snap) { return CargoType.fromMap(snap.data() as Map, snap.id); }).toList(); yield customDuries; } } Stream> _discountByWeightStream() async* { List discountByWeight = []; Stream snapshots = FirebaseFirestore.instance .collection(config_collection) .doc(rate_doc_id) .collection(discounts_by_weights_collection) .snapshots(); await for (var snaps in snapshots) { discountByWeight = []; discountByWeight = snaps.docs.map((snap) { return DiscountByWeight.fromMap( snap.data() as Map, snap.id); }).toList(); yield discountByWeight; } } late StreamSubscription rateListener; late StreamSubscription> cargoListener; late StreamSubscription> customListener; late StreamSubscription> discountListener; Stream rate() { Future _start() async { rateListener = _rateStream().listen((rate) { _rate.deliveryFee = rate.deliveryFee; _rate.freeDeliveryWeight = rate.freeDeliveryWeight; _rate.volumetricRatio = rate.volumetricRatio; _rate.diffDiscountWeight = rate.diffDiscountWeight; _rate.diffWeightRate = rate.diffWeightRate; controller.add(_rate); }); cargoListener = _cargoTypeStream().listen((cargoTypes) { _rate.cargoTypes = cargoTypes; controller.add(_rate); }); customListener = _customDutiesStream().listen((customDuties) { _rate.customDuties = customDuties; controller.add(_rate); }); discountListener = _discountByWeightStream().listen((discountByWeights) { _rate.discountByWeights = discountByWeights; controller.add(_rate); }); } void _stop() { if (rateListener != null) { rateListener.cancel(); } if (cargoListener != null) { cargoListener.cancel(); } if (customListener != null) { customListener.cancel(); } if (discountListener != null) { discountListener.cancel(); } } controller = StreamController( onListen: _start, onPause: _stop, onResume: _start, onCancel: _stop); return controller.stream; } Future updateRates(Rate rate) async { return await requestAPI("/rates", "PUT", payload: rate.toMap(), token: await getToken()); } Future createCargoType(CargoType cargoType) async { return await requestAPI("/cargo_types", "POST", payload: cargoType.toMap(), token: await getToken()); } Future updateCargoType(CargoType cargoType) async { return await requestAPI("/cargo_types", "PUT", payload: cargoType.toMap(), token: await getToken()); } Future deleteCargoType(String id) async { return await requestAPI("/cargo_types", "DELETE", payload: {"id": id}, token: await getToken()); } Future createCustomDuty(CustomDuty customDuty) async { return await requestAPI("/custom_duties", "POST", payload: customDuty.toMap(), token: await getToken()); } Future updateCustomDuty(CustomDuty customDuty) async { return await requestAPI("/custom_duties", "PUT", payload: customDuty.toMap(), token: await getToken()); } Future deleteCustomDuty(String id) async { return await requestAPI("/custom_duties", "DELETE", payload: {"id": id}, token: await getToken()); } Future createDiscountByWeight(DiscountByWeight discountByWeight) async { return await requestAPI("/discounts_by_weight", "POST", payload: discountByWeight.toMap(), token: await getToken()); } Future updateDiscountByWeight(DiscountByWeight discountByWeight) async { return await requestAPI("/discounts_by_weight", "PUT", payload: discountByWeight.toMap(), token: await getToken()); } Future deleteDiscountByWeight(String id) async { return await requestAPI("/discounts_by_weight", "DELETE", payload: {"id": id}, token: await getToken()); } }