ListingInner.js 9.65 KB
import React, { useEffect, useState } from "react";
import ListingFilter from "./ListingFilter";
import ListingItems from "./ListingItems";
import Image from "next/image";
import { getActivitiesByFilters, getWishlists, setActivityFilters } from "../../redux/actions/activityAction";
import { useDispatch, useSelector } from "react-redux";
import { useRouter } from "next/router";

const ListingInner = ({ allActivitiesData, loading, totalCount }) => {
  console.log("allActivitiesData", allActivitiesData);
  const [isFilterViewOpen, setIsFilterViewOpen] = useState(false);
  const [isGridViewOpen, setIsGridViewOpen] = useState(false);
  const [isOpen, setIsOpen] = useState(false);
  const { activityFilters } = useSelector(sate => sate.activityFilters);

  const dispatch = useDispatch();
  const router = useRouter();
  const [size, setSize] = useState(768);
  const toggleGridViewDropdown = () => {
    setIsGridViewOpen(!isGridViewOpen);
  };
  const toggleFilterViewDropdown = () => {
    setIsFilterViewOpen(!isFilterViewOpen);
  };
  const toggleDropdown = () => {
    setIsOpen(!isOpen);
  };
  const [gridClass, setGridClass] = useState("col-md-3");

  const handleGridChange = className => {
    setGridClass(className);
  };

  useEffect(() => {
    const handleResize = () => {
      // console.log("Window Width:");
      setSize(window.innerWidth);
    };

    // Initial window width
    handleResize();

    // Add event listener for window resize
    window.addEventListener("resize", handleResize);

    // Clean up the event listener on component unmount
    return () => {
      window.removeEventListener("resize", handleResize);
    };
  }, []);

  // USEEFFECT FOR FILTERS

  useEffect(() => {
    let filters = {};
    // console.log("subcategory here", activityFilters.startDate);
    if (activityFilters.category) {
      filters["category"] = { id: { $eq: activityFilters.category } };
    }
    if (activityFilters.subCategories?.length > 0) {
      filters["category"] = null;
      filters["subCategory"] = activityFilters.subCategories.map(item => {
        return { subCategory: { id: { $eq: item } } };
      });
    }
    if (activityFilters.activityType) {
      filters["activityType"] = activityFilters.activityType;
    }
    if (activityFilters.startDate) {
      filters["fromDate"] = activityFilters.startDate;
    }
    if (activityFilters.endDate) {
      filters["toDate"] = activityFilters.endDate;
    }
    if (activityFilters.minDuration > 0) {
      filters["minimumDuration"] = activityFilters.minDuration;
    }
    if (activityFilters.maxDuration > 0) {
      filters["maximumDuration"] = activityFilters.maxDuration;
    }
    if (activityFilters.minGroupSize > 0) {
      filters["minGroupSize"] = activityFilters.minGroupSize;
    }
    if (activityFilters.maxGroupSize > 0) {
      filters["maxGroupSize"] = activityFilters.maxGroupSize;
    }
    if (activityFilters.minAge) {
      filters["ageLowerLimit"] = activityFilters.minAge;
    }
    if (activityFilters.sorting) {
      filters["sort"] = activityFilters.sorting;
    }
    if (activityFilters.priceUpperLimit) {
      filters["priceUpperLimit"] = activityFilters.priceUpperLimit;
    }
    if (activityFilters.priceLowerLimit) {
      filters["priceLowerLimit"] = activityFilters.priceLowerLimit;
    }
    // console.log("router query", filters);
    dispatch(
      getActivitiesByFilters({
        subCategory: filters.subCategory,
        category: filters.category,
        activityType: filters.activityType,
        fromDate: filters.fromDate,
        toDate: filters.toDate,
        minimumDuration: filters.minimumDuration,
        maximumDuration: filters.maximumDuration,
        minGroupSize: filters.minGroupSize,
        maxGroupSize: filters.maxGroupSize,
        ageLowerLimit: filters.ageLowerLimit,
        sort: filters.sort,
        priceUpperLimit: filters.priceUpperLimit,
        priceLowerLimit: filters.priceLowerLimit,
        currentPage: router.query.page
      })
    );
  }, [activityFilters]);
  console.log("activityFilters", activityFilters);
  // useEffect(() => {
  //   dispatch(getActivitiesByFilters({ currentPage: router.query.page }));
  // }, []);

  return (
    <>
      <section className="listing-inner-session">
        <div className="container-fluid">
          <div className="row">
            <div className="col-md-6">{/* <h3 className="heading03">Sub Category Tags:</h3> */}</div>
            <div className="col-md-6">
              <div className="filter-dd">
                <div className="filter-view box-inner">
                  <a onClick={toggleFilterViewDropdown}>
                    <span className="image-container">
                      <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/filter-view.svg" />
                    </span>
                  </a>
                </div>
                <div className="grid-view box-inner">
                  <a onClick={toggleGridViewDropdown}>
                    <span className="image-container">
                      <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/grid-view.svg" />
                    </span>
                  </a>
                  <div className={`inner-content ${isGridViewOpen ? "open" : ""}`}>
                    <div className="top-head">
                      <div className="">View By</div>
                      <div className="close-btn" onClick={toggleGridViewDropdown}>
                        <span className="image-container">
                          <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/close-icon.svg" />
                        </span>
                      </div>
                    </div>
                    <ul className="list-by">
                      <li>
                        <input className="form-check-labe" type="radio" id="3 Grid View" name="gridView" onClick={() => handleGridChange("col-md-4")} />
                        <label htmlFor="3 Grid View">3 Grid View</label>
                      </li>
                      <li>
                        <input className="form-check-labe" type="radio" id="4 Grid View" name="gridView" onClick={() => handleGridChange("col-md-3")} defaultChecked />
                        <label htmlFor="4 Grid View">4 Grid View</label>
                      </li>
                    </ul>
                  </div>
                </div>
                <div className="sort-by box-inner">
                  <a onClick={toggleDropdown}>
                    <span className="image-container">
                      <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/sort-by.svg" />
                    </span>
                  </a>
                  <div className={`inner-content ${isOpen ? "open" : ""}`}>
                    <div className="top-head">
                      <div className="">Sort By</div>
                      <div className="close-btn" onClick={toggleDropdown}>
                        <span className="image-container">
                          <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/close-icon.svg" />
                        </span>
                      </div>
                    </div>
                    <ul className="list-by">
                      <li>
                        <input
                          className="form-check-labe"
                          onChange={e => {
                            dispatch(setActivityFilters({ filters: { ...activityFilters, sorting: e.target.value } }));
                            // console.log(e.target.value);
                          }}
                          type="radio"
                          id="Price - High to Low"
                          name="sort"
                          value={"descending"}
                        />
                        <label htmlFor="Price - High to Low">Price - High to Low</label>
                      </li>
                      <li>
                        <input
                          className="form-check-labe"
                          onChange={e => {
                            dispatch(setActivityFilters({ filters: { ...activityFilters, sorting: e.target.value } }));
                            // console.log(e.target.value);
                          }}
                          type="radio"
                          id="Price - Low to High"
                          name="sort"
                          value={"ascending"}
                        />
                        <label htmlFor="Price - Low to High">Price - Low to High</label>
                      </li>
                      {/* <li>
                        <input className="form-check-labe" type="radio" id="Most Rated" name="sort" />
                        <label htmlFor="Most Rated">Most Rated</label>
                      </li>
                      <li>
                        <input className="form-check-labe" type="radio" id="Most Popular" name="sort" />
                        <label htmlFor="Most Popular">Most Popular</label>
                      </li> */}
                    </ul>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div className="row ">
            {(isFilterViewOpen || size > 768) && (
              <>
                <div className={`col-md-3 first-block-content ${isFilterViewOpen ? "show" : ""}`}>
                  <ListingFilter />
                </div>
              </>
            )}

            <div className="col-md-9">
              <ListingItems allActivitiesData={allActivitiesData} loading={loading} gridClass={gridClass} totalCount={totalCount} />
            </div>
          </div>
        </div>
      </section>
    </>
  );
};

export default ListingInner;