import 'dart:developer'; import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/const_texts.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/models/order_model.dart'; import 'package:customer/models/product_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; import '../models/rating_model.dart'; import '../models/review_attribute_model.dart'; import '../service/fire_store_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; import 'package:image_picker/image_picker.dart'; import '../themes/show_toast_dialog.dart'; class RateProductController extends GetxController { RxBool isLoading = true.obs; @override void onInit() { // TODO: implement onInit getArgument(); super.onInit(); } Rx commentController = TextEditingController().obs; Rx orderModel = OrderModel().obs; RxString productId = "".obs; Rx ratingModel = RatingModel().obs; Rx productModel = ProductModel().obs; Rx vendorModel = VendorModel().obs; Rx vendorCategoryModel = VendorCategoryModel().obs; RxList reviewAttributeList = [].obs; RxDouble ratings = 0.0.obs; RxMap reviewAttribute = {}.obs; RxMap reviewProductAttributes = {}.obs; RxDouble vendorReviewSum = 0.0.obs; RxDouble vendorReviewCount = 0.0.obs; RxDouble productReviewSum = 0.0.obs; RxDouble productReviewCount = 0.0.obs; Future getArgument() async { dynamic argumentData = Get.arguments; if (argumentData != null) { orderModel.value = argumentData['orderModel']; productId.value = argumentData['productId']; await FireStoreUtils.getOrderReviewsByID( orderModel.value.id.toString(), productId.value, ).then((value) { if (value != null) { ratingModel.value = value; ratings.value = value.rating ?? 0.0; commentController.value.text = value.comment.toString(); reviewAttribute.value = value.reviewAttributes!; images.addAll(value.photos ?? []); } }); await FireStoreUtils.getProductById( productId.value.split('~').first, ).then((value) { if (value != null) { productModel.value = value; if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { productReviewCount.value = value.reviewsCount! - 1; productReviewSum.value = value.reviewsSum! - ratings.value; if (value.reviewAttributes != null) { value.reviewAttributes!.forEach((key, value) { ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson(value); reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! - 1; reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! - reviewAttribute[key]; reviewProductAttributes.addEntries([ MapEntry(key, reviewsAttributeModel.toJson()), ]); }); } } else { productReviewCount.value = double.parse( value.reviewsCount.toString(), ); productReviewSum.value = double.parse(value.reviewsSum.toString()); if (value.reviewAttributes != null) { reviewProductAttributes.value = value.reviewAttributes!; } } } }); await FireStoreUtils.getVendorById( productModel.value.vendorID.toString(), ).then((value) { if (value != null) { vendorModel.value = value; if (ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty) { vendorReviewCount.value = value.reviewsCount! - 1; vendorReviewSum.value = value.reviewsSum! - ratings.value; } else { vendorReviewCount.value = double.parse( value.reviewsCount.toString(), ); vendorReviewSum.value = double.parse(value.reviewsSum.toString()); } } }); await FireStoreUtils.getVendorCategoryByCategoryId( productModel.value.categoryID.toString(), ).then((value) async { if (value != null) { vendorCategoryModel.value = value; for (var element in vendorCategoryModel.value.reviewAttributes!) { await FireStoreUtils.getVendorReviewAttribute(element).then(( value, ) { reviewAttributeList.add(value!); }); } } }); } isLoading.value = false; } Future saveRating() async { if (ratings.value != 0.0) { ShowToastDialog.showLoader(ConstTexts.pleaseWait.tr); productModel.value.reviewsCount = productReviewCount.value + 1; productModel.value.reviewsSum = productReviewSum.value + ratings.value; productModel.value.reviewAttributes = reviewProductAttributes; vendorModel.value.reviewsCount = vendorReviewCount.value + 1; vendorModel.value.reviewsSum = vendorReviewSum.value + ratings.value; if (reviewProductAttributes.isEmpty) { reviewAttribute.forEach((key, value) { ReviewsAttribute reviewsAttributeModel = ReviewsAttribute( reviewsCount: 1, reviewsSum: value, ); reviewProductAttributes.addEntries([ MapEntry(key, reviewsAttributeModel.toJson()), ]); }); } else { reviewProductAttributes.forEach((key, value) { ReviewsAttribute reviewsAttributeModel = ReviewsAttribute.fromJson( value, ); reviewsAttributeModel.reviewsCount = reviewsAttributeModel.reviewsCount! + 1; reviewsAttributeModel.reviewsSum = reviewsAttributeModel.reviewsSum! + reviewAttribute[key]; reviewProductAttributes.addEntries([ MapEntry(key, reviewsAttributeModel.toJson()), ]); }); } for (int i = 0; i < images.length; i++) { if (images[i].runtimeType == XFile) { String url = await Constant.uploadUserImageToFireStorage( File(images[i].path), "profileImage/${FireStoreUtils.getCurrentUid()}", File(images[i].path).path.split('/').last, ); images.removeAt(i); images.insert(i, url); } } RatingModel ratingProduct = RatingModel( productId: productId.value, comment: commentController.value.text, photos: images, rating: ratings.value, customerId: FireStoreUtils.getCurrentUid(), id: ratingModel.value.id != null && ratingModel.value.id!.isNotEmpty ? ratingModel.value.id : Constant.getUuid(), orderId: orderModel.value.id, vendorId: productModel.value.vendorID, createdAt: Timestamp.now(), uname: Constant.userModel!.fullName(), profile: Constant.userModel!.profilePictureURL, reviewAttributes: reviewAttribute, ); print("vendor model"); log(vendorModel.value.toJson().toString()); await FireStoreUtils.updateReviewById(ratingProduct); print("Rating Saved"); print(ratingProduct.toJson()); await FireStoreUtils.updateVendor(vendorModel.value); await FireStoreUtils.setProduct(productModel.value); ShowToastDialog.closeLoader(); ShowToastDialog.showToast("Rating saved successfully.".tr); Get.back(); } else { ShowToastDialog.showToast("Please add rate for food item.".tr); } } final ImagePicker _imagePicker = ImagePicker(); RxList images = [].obs; Future pickFile({required ImageSource source}) async { try { XFile? image = await _imagePicker.pickImage(source: source); if (image == null) return; images.add(image); Get.back(); } on PlatformException catch (e) { ShowToastDialog.showToast("Failed to Pick : \n $e"); } } }