import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:customer/constant/constant.dart'; import 'package:customer/controllers/dash_board_controller.dart'; import 'package:customer/models/advertisement_model.dart'; import 'package:customer/models/coupon_model.dart'; import 'package:customer/models/favourite_model.dart'; import 'package:customer/models/vendor_category_model.dart'; import 'package:customer/models/vendor_model.dart'; import 'package:customer/utils/preferences.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import '../models/banner_model.dart'; import '../models/story_model.dart'; import '../service/cart_provider.dart'; import '../service/fire_store_utils.dart'; class FoodHomeController extends GetxController { DashBoardController dashBoardController = Get.find(); final CartProvider cartProvider = CartProvider(); Future getCartData() async { cartProvider.cartStream.listen((event) async { cartItem.clear(); cartItem.addAll(event); }); update(); } RxBool isLoading = true.obs; RxBool isListView = true.obs; RxBool isPopular = true.obs; RxString selectedOrderTypeValue = "Delivery".tr.obs; Rx pageController = PageController(viewportFraction: 0.877).obs; Rx pageBottomController = PageController(viewportFraction: 0.877).obs; RxInt currentPage = 0.obs; RxInt currentBottomPage = 0.obs; late TabController tabController; @override void onInit() async { await getData(); super.onInit(); } RxList vendorCategoryModel = [].obs; RxList allNearestRestaurant = [].obs; RxList newArrivalRestaurantList = [].obs; RxList advertisementList = [].obs; RxList popularRestaurantList = [].obs; RxList couponRestaurantList = [].obs; RxList couponList = [].obs; RxList storyList = [].obs; RxList bannerModel = [].obs; RxList bannerBottomModel = [].obs; RxList favouriteList = [].obs; Future getData() async { isLoading.value = true; getCartData(); selectedOrderTypeValue.value = Preferences.getString( Preferences.foodDeliveryType, defaultValue: "Delivery", ); await getZone(); FireStoreUtils.getAllNearestRestaurant().listen((event) async { popularRestaurantList.clear(); newArrivalRestaurantList.clear(); allNearestRestaurant.clear(); advertisementList.clear(); allNearestRestaurant.addAll(event); newArrivalRestaurantList.addAll(event); popularRestaurantList.addAll(event); Constant.restaurantList = allNearestRestaurant; popularRestaurantList.sort( (a, b) => Constant.calculateReview( reviewCount: b.reviewsCount.toString(), reviewSum: b.reviewsSum.toString(), ).compareTo( Constant.calculateReview( reviewCount: a.reviewsCount.toString(), reviewSum: a.reviewsSum.toString(), ), ), ); newArrivalRestaurantList.sort( (a, b) => (b.createdAt ?? Timestamp.now()).toDate().compareTo( (a.createdAt ?? Timestamp.now()).toDate(), ), ); await getVendorCategory(); await FireStoreUtils.getHomeCoupon().then((value) { couponRestaurantList.clear(); couponList.clear(); for (var element1 in value) { for (var element in allNearestRestaurant) { if (element1.vendorID == element.id && element1.expiresAt!.toDate().isAfter(DateTime.now())) { couponList.add(element1); couponRestaurantList.add(element); } } } }); await FireStoreUtils.getStory().then((stories) { storyList.clear(); print("Total stories fetched: ${stories.length}"); // Create a fast lookup Set of all nearest vendor IDs final nearestIds = allNearestRestaurant.map((e) => e.id).toSet(); print("nearestIds: $nearestIds"); // Filter stories whose vendorID exists in nearestIds storyList.addAll( stories.where((story) => nearestIds.contains(story.vendorID)), ); print("Filtered storyList length: ${storyList.length}"); }); if (Constant.isEnableAdsFeature == true) { await FireStoreUtils.getAllAdvertisement().then((value) { advertisementList.clear(); for (var element1 in value) { for (var element in allNearestRestaurant) { if (element1.vendorId == element.id) { advertisementList.add(element1); } } } }); } }); setLoading(); } Future setLoading() async { await Future.delayed(Duration(seconds: 1), () async { if (allNearestRestaurant.isEmpty) { await Future.delayed(Duration(seconds: 2), () { isLoading.value = false; }); } else { isLoading.value = false; } update(); }); } Future getVendorCategory() async { await FireStoreUtils.getHomeVendorCategory().then((value) { vendorCategoryModel.value = value; if (Constant.restaurantList != null) { List usedCategoryIds = Constant.restaurantList! .expand((vendor) => vendor.categoryID ?? []) .whereType() .toSet() .toList(); vendorCategoryModel.value = vendorCategoryModel .where((category) => usedCategoryIds.contains(category.id)) .toList(); } }); await FireStoreUtils.getHomeTopBanner().then((value) { bannerModel.value = value; }); await FireStoreUtils.getHomeBottomBanner().then((value) { bannerBottomModel.value = value; }); await getFavouriteRestaurant(); } Future getFavouriteRestaurant() async { if (Constant.userModel?.id != null) { await FireStoreUtils.getFavouriteRestaurant().then((value) { favouriteList.value = value; }); } log("Constant.userModel?.id :: ${favouriteList.length}"); } Future getZone() async { await FireStoreUtils.getZone().then((value) { if (value != null) { for (int i = 0; i < value.length; i++) { if (Constant.isPointInPolygon( LatLng( Constant.selectedLocation.location?.latitude ?? 0.0, Constant.selectedLocation.location?.longitude ?? 0.0, ), value[i].area!, )) { Constant.selectedZone = value[i]; Constant.isZoneAvailable = true; break; } else { Constant.selectedZone = value[i]; Constant.isZoneAvailable = false; } } } }); } }