Header.js 6.96 KB
import { getSession, signOut } from "next-auth/react";
import Image from "next/image";
import Link from "next/link";
import React, { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { cleanImage } from "../../services/imageHandling";
import { Button, Container, Form, Nav, Navbar } from "react-bootstrap";
import { getCurrentEndUser, loadUser } from "../../redux/actions/userActions";
import { useRouter } from "next/router";
import { getWishlists } from "../../redux/actions/activityAction";
import { Typeahead } from "react-bootstrap-typeahead";
import axios from "axios";

const Header = () => {
  const { loadedUser } = useSelector(state => state.loadedUser);
  const { endUser } = useSelector(state => state.endUser);
  const [open, setopen] = useState(false);
  const [options, setoptions] = useState([]);
  console.log("options", options);
  const dispatch = useDispatch();
  // console.log("user", loadedUser);
  const [isSticky, setIsSticky] = useState(false);
  const router = useRouter();
  useEffect(() => {
    const handleScroll = () => {
      // Check if the scroll position is greater than a certain threshold
      const scrollY = window.scrollY || window.pageYOffset;
      setIsSticky(scrollY > 50);
    };

    // Attach the scroll event listener when the component mounts
    window.addEventListener("scroll", handleScroll);

    // Clean up the event listener when the component unmounts
    return () => {
      window.removeEventListener("scroll", handleScroll);
    };
  }, []);
  useEffect(() => {
    dispatch(getCurrentEndUser());
  }, []);

  useEffect(() => {
    if (endUser) dispatch(getWishlists({ endUser: endUser.id }));
  }, [endUser]);
  return (
    <header className={`header_wrap ${isSticky ? "stick" : ""}`}>
      <Navbar expand="lg" className="bg-body-tertiary">
        <Container fluid>
          <Navbar.Brand href="/">
            <span className="image-container">
              <Image layout="fill" alt="" className="image img-fluid" src="/images/Zango-logo.svg" />
            </span>
          </Navbar.Brand>
          <Navbar.Toggle aria-controls="navbarScroll" />
          <Navbar.Collapse id="navbarScroll">
            <Nav className=" my-2 my-lg-0" style={{ maxHeight: "100px" }} navbarScroll>
              <Nav.Link href="/blog">Blogs</Nav.Link>
              <Nav.Link href="/gift-card" className="gift-card">
                Gift Card
                <span className="image-container">
                  <Image layout="fill" className="image img-fluid" src="/images/icons/gift-card-icon.svg" alt="" />
                </span>
              </Nav.Link>
            </Nav>
            <Form className="d-flex me-3">
              <div className="header-search">
                <Typeahead
                  open={open}
                  onBlur={() => {
                    setopen(false);
                  }}
                  id="select"
                  placeholder="Search for products, brands or categories"
                  onChange={selected => {
                    console.log("selected", selected);
                    // router.push("/listing");
                    if (selected[0]?.label.includes("experience")) {
                      // console.log("jjja");
                      router.push(`/activities/${selected[0].id}`);
                    }
                    if (selected[0]?.label.includes("category")) {
                      router.push(`/listing?category=${selected[0].id}`);
                      // dispatch(setActivityFilters({ filters: { category: selected[0].id, subCategories: [] } }));
                    }
                    // Handle selections...
                  }}
                  onInputChange={async e => {
                    console.log(e);
                    if (e.length > 1) {
                      const config = {
                        headers: {
                          "Content-Type": "application/json"
                        }
                      };

                      const res = await axios.post(`${process.env.NEXT_PUBLIC_BACKEND_API_URL}/api/experience/get-search-response`, { string: e }, config);
                      console.log("res", res.data);
                      if (res.data.success) {
                        let opts = res.data.data.categories?.map(item => {
                          return { id: item.id, label: `${item.name} - category` };
                        });
                        console.log("here", opts);
                        if (opts?.length > 0) {
                          const a = res.data.data.activities?.map(item => {
                            return { id: item.id, label: `${item.name} - experience` };
                          });
                          opts = [...opts, ...a];
                        } else {
                          opts = res.data.data.activities?.map(item => {
                            return { id: item.id, label: `${item.name} - experience` };
                          });
                        }
                        console.log("opts", opts);
                        setoptions(opts);
                        setopen(true);
                      }
                    } else {
                      setopen(false);
                    }
                  }}
                  options={options}
                />
                <Button className="search-icon" variant="outline-success">
                  <span className="image-container">
                    <Image layout="fill" alt="" className="image img-fluid" src="/images/icons/search-icon.svg" />
                  </span>
                </Button>
              </div>
            </Form>
            {/* {console.log(user.id)} */}
            {loadedUser && loadedUser.id ? (
              <div className="top-btn">
                <div className="logout-bk">
                  <p>Brand Logo</p>
                  <p>{loadedUser.phone}</p>
                </div>
                <Button
                  onClick={async () => {
                    signOut({ redirect: false });
                    await router.push("/");
                    window.location.reload();
                  }}
                  className="me-3"
                  variant="primary"
                >
                  Log out
                </Button>
              </div>
            ) : (
              <div className="top-btn">
                <Button
                  onClick={() => {
                    router.push("/signup/user");
                  }}
                  className="me-3"
                  variant="primary"
                >
                  Sign Up
                </Button>
                <Button
                  onClick={() => {
                    router.push("/login/user");
                  }}
                  className=""
                  variant="primary"
                >
                  Log In
                </Button>
              </div>
            )}
          </Navbar.Collapse>
        </Container>
      </Navbar>
    </header>
  );
};

export default Header;