Files
Fondex/lib/controllers/restaurant_details_controller.dart

301 lines
11 KiB
Dart

import 'dart:async';
import 'dart:developer';
import 'package:customer/constant/constant.dart';
import 'package:customer/models/brands_model.dart';
import 'package:customer/models/cart_product_model.dart';
import 'package:customer/models/coupon_model.dart';
import 'package:customer/models/favourite_item_model.dart';
import 'package:customer/models/favourite_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/attributes_model.dart';
import '../service/cart_provider.dart';
import '../service/fire_store_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
class RestaurantDetailsController extends GetxController {
Rx<TextEditingController> searchEditingController = TextEditingController().obs;
RxBool isLoading = true.obs;
Rx<PageController> pageController = PageController().obs;
RxInt currentPage = 0.obs;
RxBool isVag = false.obs;
RxBool isNonVag = false.obs;
RxBool isMenuOpen = false.obs;
RxList<FavouriteModel> favouriteList = <FavouriteModel>[].obs;
RxList<FavouriteItemModel> favouriteItemList = <FavouriteItemModel>[].obs;
RxList<ProductModel> allProductList = <ProductModel>[].obs;
RxList<ProductModel> productList = <ProductModel>[].obs;
RxList<VendorCategoryModel> vendorCategoryList = <VendorCategoryModel>[].obs;
RxList<CouponModel> couponList = <CouponModel>[].obs;
@override
void onInit() {
// TODO: implement onInit
getArgument();
super.onInit();
}
void animateSlider() {
if (vendorModel.value.photos != null && vendorModel.value.photos!.isNotEmpty) {
Timer.periodic(const Duration(seconds: 2), (Timer timer) {
if (currentPage < vendorModel.value.photos!.length - 1) {
currentPage++;
} else {
currentPage.value = 0;
}
if (pageController.value.hasClients) {
pageController.value.animateToPage(currentPage.value, duration: const Duration(milliseconds: 300), curve: Curves.easeIn);
}
});
}
}
Rx<VendorModel> vendorModel = VendorModel().obs;
final CartProvider cartProvider = CartProvider();
Future<void> getArgument() async {
cartProvider.cartStream.listen((event) async {
cartItem.clear();
cartItem.addAll(event);
});
dynamic argumentData = Get.arguments;
if (argumentData != null) {
vendorModel.value = argumentData['vendorModel'];
}
animateSlider();
statusCheck();
await getProduct();
isLoading.value = false;
await getFavouriteList();
update();
}
RxList<BrandsModel> brandList = <BrandsModel>[].obs;
Future<void> getProduct() async {
await FireStoreUtils.getProductByVendorId(vendorModel.value.id.toString()).then((value) {
if ((Constant.isSubscriptionModelApplied == true || vendorModel.value.adminCommission?.isEnabled == true) && vendorModel.value.subscriptionPlan != null) {
if (vendorModel.value.subscriptionPlan?.itemLimit == '-1') {
allProductList.value = value;
productList.value = value;
} else {
int selectedProduct =
value.length < int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0') ? (value.isEmpty ? 0 : (value.length)) : int.parse(vendorModel.value.subscriptionPlan?.itemLimit ?? '0');
allProductList.value = value.sublist(0, selectedProduct);
productList.value = value.sublist(0, selectedProduct);
}
} else {
allProductList.value = value;
productList.value = value;
}
});
for (var element in productList) {
await FireStoreUtils.getVendorCategoryById(element.categoryID.toString()).then((value) {
if (value != null) {
vendorCategoryList.add(value);
}
});
}
await FireStoreUtils.getBrandList().then((value) {
brandList.value = value;
});
var seen = <String>{};
vendorCategoryList.value = vendorCategoryList.where((element) => seen.add(element.id.toString())).toList();
}
void searchProduct(String name) {
if (name.isEmpty) {
productList.clear();
productList.addAll(allProductList);
} else {
isVag.value = false;
isNonVag.value = false;
productList.value = allProductList.where((p0) => p0.name!.toLowerCase().contains(name.toLowerCase())).toList();
}
update();
}
void filterRecord() {
if (isVag.value == true && isNonVag.value == true) {
productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList();
} else if (isVag.value == true && isNonVag.value == false) {
productList.value = allProductList.where((p0) => p0.nonveg == false).toList();
} else if (isVag.value == false && isNonVag.value == true) {
productList.value = allProductList.where((p0) => p0.nonveg == true).toList();
} else if (isVag.value == false && isNonVag.value == false) {
productList.value = allProductList.where((p0) => p0.nonveg == true || p0.nonveg == false).toList();
}
}
Future<List<ProductModel>> getProductByCategory(VendorCategoryModel vendorCategoryModel) async {
return productList.where((p0) => p0.categoryID == vendorCategoryModel.id).toList();
}
Future<void> getFavouriteList() async {
if (Constant.userModel != null) {
await FireStoreUtils.getFavouriteRestaurant().then((value) {
favouriteList.value = value;
});
await FireStoreUtils.getFavouriteItem().then((value) {
favouriteItemList.value = value;
});
await FireStoreUtils.getOfferByVendorId(vendorModel.value.id.toString()).then((value) {
couponList.value = value;
});
}
await getAttributeData();
update();
}
RxBool isOpen = false.obs;
void statusCheck() {
final now = DateTime.now();
var day = DateFormat('EEEE', 'en_US').format(now);
var date = DateFormat('dd-MM-yyyy').format(now);
for (var element in vendorModel.value.workingHours ?? []) {
if (day == element.day.toString()) {
if (element.timeslot!.isNotEmpty) {
for (var element in element.timeslot!) {
var start = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.from}");
var end = DateFormat("dd-MM-yyyy HH:mm").parse("$date ${element.to}");
if (isCurrentDateInRange(start, end)) {
isOpen.value = true;
}
}
}
}
}
}
String getBrandName(String brandId) {
String brandName = '';
for (var element in brandList) {
if (element.id == brandId) {
brandName = element.title ?? '';
}
}
return brandName;
}
bool isCurrentDateInRange(DateTime startDate, DateTime endDate) {
print(startDate);
print(endDate);
final currentDate = DateTime.now();
print(currentDate);
return currentDate.isAfter(startDate) && currentDate.isBefore(endDate);
}
RxList<AttributesModel> attributesList = <AttributesModel>[].obs;
RxList selectedVariants = [].obs;
RxList selectedIndexVariants = [].obs;
RxList selectedIndexArray = [].obs;
RxList selectedAddOns = [].obs;
RxInt quantity = 1.obs;
String calculatePrice(ProductModel productModel) {
String mainPrice = "0";
String variantPrice = "0";
String adOnsPrice = "0";
if (productModel.itemAttribute != null) {
if (productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).isNotEmpty) {
variantPrice = Constant.productCommissionPrice(
vendorModel.value,
productModel.itemAttribute!.variants!.where((element) => element.variantSku == selectedVariants.join('-')).first.variantPrice ?? '0',
);
}
} else {
String price = Constant.productCommissionPrice(vendorModel.value, productModel.price.toString());
String disPrice = double.parse(productModel.disPrice.toString()) <= 0 ? "0" : Constant.productCommissionPrice(vendorModel.value, productModel.disPrice.toString());
if (double.parse(disPrice) <= 0) {
variantPrice = price;
} else {
variantPrice = disPrice;
}
}
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true) {
adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString();
}
}
adOnsPrice = (quantity.value * double.parse(adOnsPrice)).toString();
mainPrice = ((double.parse(variantPrice.toString()) * double.parse(quantity.value.toString())) + double.parse(adOnsPrice.toString())).toString();
return mainPrice;
}
Future<void> getAttributeData() async {
await FireStoreUtils.getAttributes().then((value) {
if (value != null) {
attributesList.value = value;
}
});
}
Future<void> addToCart({required ProductModel productModel, required String price, required String discountPrice, required bool isIncrement, required int quantity, VariantInfo? variantInfo}) async {
CartProductModel cartProductModel = CartProductModel();
String adOnsPrice = "0";
for (int i = 0; i < productModel.addOnsPrice!.length; i++) {
if (selectedAddOns.contains(productModel.addOnsTitle![i]) == true && productModel.addOnsPrice![i] != '0') {
adOnsPrice = (double.parse(adOnsPrice.toString()) + double.parse(Constant.productCommissionPrice(vendorModel.value, productModel.addOnsPrice![i].toString()))).toString();
}
}
if (variantInfo != null) {
cartProductModel.id = "${productModel.id!}~${variantInfo.variantId.toString()}";
cartProductModel.name = productModel.name!;
cartProductModel.photo = productModel.photo!;
cartProductModel.categoryId = productModel.categoryID!;
cartProductModel.price = price;
cartProductModel.discountPrice = discountPrice;
cartProductModel.vendorID = vendorModel.value.id;
cartProductModel.quantity = quantity;
cartProductModel.variantInfo = variantInfo;
cartProductModel.extrasPrice = adOnsPrice;
cartProductModel.extras = selectedAddOns.isEmpty ? [] : selectedAddOns;
} else {
cartProductModel.id = productModel.id!;
cartProductModel.name = productModel.name!;
cartProductModel.photo = productModel.photo!;
cartProductModel.categoryId = productModel.categoryID!;
cartProductModel.price = price;
cartProductModel.discountPrice = discountPrice;
cartProductModel.vendorID = vendorModel.value.id;
cartProductModel.quantity = quantity;
cartProductModel.variantInfo = VariantInfo();
cartProductModel.extrasPrice = adOnsPrice;
cartProductModel.extras = selectedAddOns.isEmpty ? [] : selectedAddOns;
}
if (isIncrement) {
await cartProvider.addToCart(Get.context!, cartProductModel, quantity);
} else {
await cartProvider.removeFromCart(cartProductModel, quantity);
}
log("===> new ${cartItem.length}");
update();
}
}