RGAlex

moto page

Mar 2nd, 2022
767
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useState } from "react";
  2. import Header from "../components/Header";
  3. import { db } from "/firebase";
  4. import dataMoto from "./dataMoto.json";
  5. import prices from "./dataPrices.json";
  6. import years from "./dataMinYears.json";
  7. import yearsMax from "./dataMaxYears.json";
  8. import Post from "../components/PostMoto";
  9. import ListButton from "../components/ListButton";
  10. import { MdArrowBackIosNew } from "react-icons/md";
  11.  
  12. function Moto({ items }) {
  13.   const [make, setMake] = useState("All Makes");
  14.   const [model, setModel] = useState("All Models");
  15.   const [modelList, setModelList] = useState([]);
  16.   const [minPrice, setMinPrice] = useState("Min price");
  17.   const [maxPrice, setMaxPrice] = useState("Max price");
  18.   const [fuelType, setFuelType] = useState("Fuel type");
  19.   const [minYear, setMinYear] = useState("Min year");
  20.   const [maxYear, setMaxYear] = useState("Max year");
  21.   const [gearbox, setGearbox] = useState("Gearbox");
  22.   const [showSidebar, setShowSidebar] = useState(false);
  23.  
  24.   const fuelTypes = [
  25.     { name: "Fuel type" },
  26.     { name: "Petrol" },
  27.     { name: "Diesel" },
  28.     { name: "Electric" },
  29.     { name: "Hybrid" },
  30.   ];
  31.   const gearboxType = [
  32.     { name: "Gearbox" },
  33.     { name: "Manual" },
  34.     { name: "Automatic" },
  35.   ];
  36.  
  37.   function makeFilter(value) {
  38.     setMake(value);
  39.     setModelList(dataMoto.find((x) => x.name === value).model) || "All Models";
  40.     setModel("All Models");
  41.     setMinPrice("Min price");
  42.     setMaxPrice("Max price");
  43.   }
  44.  
  45.   function modelFilter(value) {
  46.     setModel(value);
  47.     setMinPrice("Min price");
  48.     setMaxPrice("Max price");
  49.   }
  50.  
  51.   function minPriceFilter(value) {
  52.     setMinPrice(value);
  53.   }
  54.  
  55.   function maxPriceFilter(value) {
  56.     setMaxPrice(value);
  57.   }
  58.  
  59.   function fuelTypeFilter(value) {
  60.     setFuelType(value);
  61.   }
  62.  
  63.   function minYearFilter(value) {
  64.     setMinYear(value);
  65.   }
  66.  
  67.   function maxYearFilter(value) {
  68.     setMaxYear(value);
  69.   }
  70.  
  71.   function gearboxFilter(value) {
  72.     setGearbox(value);
  73.   }
  74.  
  75.   return (
  76.     <div className="min-h-screen">
  77.       <Header />
  78.       <div className="max-w-[1800px]">
  79.         <div className="lg:hidden">
  80.           {showSidebar ? (
  81.             <MdArrowBackIosNew
  82.               className="h-8 w-8 ml-52 items-center cursor-pointer text-sky-500 fixed inset-y-1/2 z-50 "
  83.               onClick={() => setShowSidebar(!showSidebar)}
  84.             />
  85.           ) : (
  86.             <MdArrowBackIosNew
  87.               onClick={() => setShowSidebar(!showSidebar)}
  88.               className="fixed items-center cursor-pointer text-sky-500 inset-y-1/2 h-12 w-12 pr-4 rotate-180 rounded-md -left-5 bg-white/75 shadow-md z-50"
  89.             />
  90.           )}
  91.  
  92.           <div
  93.             className={`top-0 left-0 w-60 h-full bg-white/75 p-4 fixed ease-in-out duration-500 shadow-md ${
  94.               showSidebar ? "" : "-translate-x-full"
  95.             }`}
  96.           >
  97.             <div className="w-44 fixed inset-y-1/3 ml-2 space-y-2">
  98.               <ListButton type={make} func={makeFilter} data={dataMoto} />
  99.               <ListButton type={model} func={modelFilter} data={modelList} />
  100.               <ListButton
  101.                 type={minPrice}
  102.                 func={minPriceFilter}
  103.                 data={
  104.                   maxPrice === "Max price"
  105.                     ? prices
  106.                     : prices.filter((price) => price.name < maxPrice)
  107.                 }
  108.               />
  109.               <ListButton
  110.                 type={maxPrice}
  111.                 func={maxPriceFilter}
  112.                 data={
  113.                   minPrice === "Min price"
  114.                     ? prices
  115.                     : prices.filter((price) => price.name > minPrice)
  116.                 }
  117.               />
  118.               <ListButton
  119.                 type={gearbox}
  120.                 func={gearboxFilter}
  121.                 data={gearboxType}
  122.               />
  123.               <ListButton
  124.                 type={fuelType}
  125.                 func={fuelTypeFilter}
  126.                 data={fuelTypes}
  127.               />
  128.               <ListButton
  129.                 type={minYear}
  130.                 func={minYearFilter}
  131.                 data={
  132.                   maxYear === "Max year"
  133.                     ? years
  134.                     : years.filter((year) => year.name < maxYear)
  135.                 }
  136.               />
  137.               <ListButton
  138.                 type={maxYear}
  139.                 func={maxYearFilter}
  140.                 data={
  141.                   minYear === "Min year"
  142.                     ? yearsMax
  143.                     : yearsMax.filter((year) => year.name > minYear)
  144.                 }
  145.               />
  146.             </div>
  147.           </div>
  148.         </div>
  149.         <div className="w-44 fixed top-16 ml-2 2xl:ml-24 space-y-2 hidden lg:block">
  150.           <ListButton type={make} func={makeFilter} data={dataMoto} />
  151.           <ListButton type={model} func={modelFilter} data={modelList} />
  152.           <ListButton
  153.             type={minPrice}
  154.             func={minPriceFilter}
  155.             data={
  156.               maxPrice === "Max price"
  157.                 ? prices
  158.                 : prices.filter((price) => price.name < maxPrice)
  159.             }
  160.           />
  161.           <ListButton
  162.             type={maxPrice}
  163.             func={maxPriceFilter}
  164.             data={
  165.               minPrice === "Min price"
  166.                 ? prices
  167.                 : prices.filter((price) => price.name > minPrice)
  168.             }
  169.           />
  170.           <ListButton type={gearbox} func={gearboxFilter} data={gearboxType} />
  171.           <ListButton type={fuelType} func={fuelTypeFilter} data={fuelTypes} />
  172.           <ListButton
  173.             type={minYear}
  174.             func={minYearFilter}
  175.             data={
  176.               maxYear === "Max year"
  177.                 ? years
  178.                 : years.filter((year) => year.name < maxYear)
  179.             }
  180.           />
  181.           <ListButton
  182.             type={maxYear}
  183.             func={maxYearFilter}
  184.             data={
  185.               minYear === "Min year"
  186.                 ? yearsMax
  187.                 : yearsMax.filter((year) => year.name > minYear)
  188.             }
  189.           />
  190.         </div>
  191.  
  192.         <div className="lg:ml-48">
  193.           {items
  194.             .filter(
  195.               make === "All Makes"
  196.                 ? (x) => x.post.make
  197.                 : (x) => x.post.make == make
  198.             )
  199.             .filter(
  200.               model === "All Models"
  201.                 ? (x) => x.post.make
  202.                 : (x) => x.post.make == make && x.post.model == model
  203.             )
  204.             .filter(
  205.               minPrice === "Min price"
  206.                 ? (x) => x.post.price
  207.                 : (x) => x.post.price >= minPrice
  208.             )
  209.             .filter(
  210.               maxPrice === "Max price"
  211.                 ? (x) => x.post.price
  212.                 : (x) => x.post.price <= maxPrice
  213.             )
  214.             .filter(
  215.               fuelType === "Fuel type"
  216.                 ? (x) => x.post.fuel
  217.                 : (x) => x.post.fuel === fuelType
  218.             )
  219.             .filter(
  220.               gearbox === "Gearbox"
  221.                 ? (x) => x.post.gearbox
  222.                 : (x) => x.post.gearbox === gearbox
  223.             )
  224.             .filter(
  225.               minYear === "Min year"
  226.                 ? (x) => x.post.year
  227.                 : (x) => x.post.year >= minYear
  228.             )
  229.             .filter(
  230.               maxYear === "Max year"
  231.                 ? (x) => x.post.year
  232.                 : (x) => x.post.year <= maxYear
  233.             )
  234.             .map(({ id, post }) => (
  235.               <Post
  236.                 reference={id}
  237.                 key={id.toString()}
  238.                 username={post.username}
  239.                 make={post.make}
  240.                 model={post.model}
  241.                 price={post.price}
  242.                 imageUrl={post.imageUrl}
  243.                 imageUrl2={post.imageUrl2}
  244.                 imageUrl3={post.imageUrl3}
  245.                 imageUrl4={post.imageUrl4}
  246.                 timestamp={post.timestamp}
  247.                 horsepower={post.horsepower}
  248.                 year={post.year}
  249.                 kilometers={post.kilometers}
  250.                 description={post.description}
  251.                 gearbox={post.gearbox}
  252.                 kilometers={post.kilometers}
  253.                 fuel={post.fuel}
  254.                 location={post.location}
  255.               />
  256.             ))}
  257.         </div>
  258.       </div>
  259.     </div>
  260.   );
  261. }
  262. export default Moto;
  263.  
  264. export async function getServerSideProps() {
  265.   const data = await db.collection("moto").get();
  266.   return {
  267.     props: {
  268.       items: data.docs.map((doc) => ({
  269.         id: doc.id,
  270.         post: doc.data(),
  271.       })),
  272.     },
  273.   };
  274. }
  275.  
Advertisement
Add Comment
Please, Sign In to add comment