- Login is not responsive - Add country field in book consultant any country - correct form submit of book consultant in mobile view - updatr email in privacy page - make home page slider responsive - redirect login whentokenexpired
258 lines
8.6 KiB
JavaScript
258 lines
8.6 KiB
JavaScript
"use client";
|
|
|
|
import React, { useContext, useState, useEffect } from "react";
|
|
import Link from "next/link";
|
|
import { Menu, ShoppingBag, UserRound } from "lucide-react";
|
|
import authAxios, { backendUrl } from "@/utils/axios";
|
|
import { IoMdClose } from "react-icons/io";
|
|
import Image from "next/image";
|
|
import SearchComponent from "../search/searchComponent";
|
|
import ProductContext from "@/app/contexts/productContext";
|
|
import MainContext from "@/app/contexts/mainContext";
|
|
import { useCurrency } from "@/app/contexts/currencyContext";
|
|
import CurrencySelect from "../dynamic-navbar/currencySelect";
|
|
|
|
const Navbar = () => {
|
|
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
const [isScrolled, setIsScrolled] = useState(false);
|
|
const { category } = useContext(ProductContext);
|
|
const { token } = useContext(MainContext);
|
|
const [cartItemCount, setCartItemCount] = useState(0);
|
|
const { selectedCurrency, setSelectedCurrency, SUPPORTED_CURRENCIES, error } =
|
|
useCurrency();
|
|
|
|
const toggleSidebar = () => setIsSidebarOpen(!isSidebarOpen);
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
const isMobile = window.innerWidth < 768;
|
|
|
|
setIsScrolled(isMobile || window.scrollY > 60);
|
|
};
|
|
|
|
handleScroll();
|
|
|
|
window.addEventListener("scroll", handleScroll);
|
|
window.addEventListener("resize", handleScroll);
|
|
|
|
return () => {
|
|
window.removeEventListener("scroll", handleScroll);
|
|
window.removeEventListener("resize", handleScroll);
|
|
};
|
|
}, []);
|
|
|
|
const getCart = async () => {
|
|
try {
|
|
const response = await authAxios.get("/orders/cart/");
|
|
const cartData = response.data;
|
|
console.log(cartData);
|
|
console.log(cartData.length);
|
|
|
|
// Calculate total items in cart
|
|
if (cartData && cartData.length > 0 && cartData[0].items) {
|
|
const totalItems = cartData[0].items.reduce(
|
|
(sum, item) => sum + item.quantity,
|
|
0
|
|
);
|
|
setCartItemCount(totalItems);
|
|
} else {
|
|
setCartItemCount(0);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error fetching cart:", error);
|
|
setCartItemCount(0);
|
|
}
|
|
};
|
|
|
|
// Fetch cart data when component mounts and when token changes
|
|
useEffect(() => {
|
|
if (token) {
|
|
getCart();
|
|
} else {
|
|
setCartItemCount(0);
|
|
}
|
|
}, [token]);
|
|
|
|
// Set up an interval to periodically check for cart updates
|
|
useEffect(() => {
|
|
if (token) {
|
|
// Initial fetch
|
|
getCart();
|
|
|
|
// Set up interval to check for updates every 3 seconds
|
|
const intervalId = setInterval(getCart, 3000);
|
|
|
|
// Clean up interval on component unmount
|
|
return () => clearInterval(intervalId);
|
|
}
|
|
}, [token]);
|
|
|
|
const categoryItems = category
|
|
? category.map((category) => ({
|
|
label: category.category_name,
|
|
url: `/collections/${category.id}`,
|
|
}))
|
|
: []; // Fallback to an empty array if category is undefined
|
|
|
|
const consultation = {
|
|
label: "Rudraksha consultation",
|
|
url: "/products/premium-rudraksha-consultation-astrology",
|
|
};
|
|
|
|
const visibleItems = [...categoryItems.slice(0, 4), consultation];
|
|
|
|
return (
|
|
<>
|
|
<header className="fixed top-0 left-0 right-0 z-50 bg-white shadow-md">
|
|
<div className="container mx-auto flex justify-between items-center p-4">
|
|
<div className="flex items-center md:space-x-4">
|
|
<button onClick={toggleSidebar} className="z-50">
|
|
{isSidebarOpen ? (
|
|
<IoMdClose size={28} />
|
|
) : (
|
|
<Menu size={28} strokeWidth={1} />
|
|
)}
|
|
</button>
|
|
<Link href="/">
|
|
<Image
|
|
src="/logo1.jpg"
|
|
alt="Logo"
|
|
width={60}
|
|
height={60}
|
|
className="!max-w-[60px]"
|
|
/>
|
|
</Link>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-4">
|
|
<SearchComponent isScrolled={isScrolled} />
|
|
<Link href="/pages/shopping-cart" className="relative">
|
|
<ShoppingBag size={20} className="cursor-pointer" />
|
|
<span className="absolute -top-2 -right-2 bg-red-600 font-bold text-white text-xs rounded-full h-5 w-5 flex items-center justify-center">
|
|
{cartItemCount}
|
|
</span>
|
|
</Link>
|
|
<div className="cursor-pointer">
|
|
{token ? (
|
|
<Link href="/accounts/profile">
|
|
<UserRound size={20} />
|
|
</Link>
|
|
) : (
|
|
<Link href="/accounts/login">
|
|
<button className="bg-[#c19a5b] text-white px-3 py-1 rounded hover:bg-[#b48943] text-sm">
|
|
Login
|
|
</button>
|
|
</Link>
|
|
)}
|
|
</div>
|
|
<CurrencySelect
|
|
selectedCurrency={selectedCurrency}
|
|
setSelectedCurrency={setSelectedCurrency}
|
|
SUPPORTED_CURRENCIES={SUPPORTED_CURRENCIES}
|
|
error={error}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="py-2 ">
|
|
<div className="container mx-auto flex justify-center items-center">
|
|
<div className="flex space-x-4">
|
|
{visibleItems.map((item) => (
|
|
<Link
|
|
key={item.label}
|
|
href={item.url}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
))}
|
|
<button
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
More
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
{isSidebarOpen && (
|
|
<div className="fixed inset-0 bg-black bg-opacity-50 z-40">
|
|
<div className="fixed top-0 left-0 w-full h-full bg-white shadow-lg z-50 pt-32">
|
|
<div className="p-4 h-full w-full md:w-1/2">
|
|
<div
|
|
style={{ justifyContent: "start" }}
|
|
className="flex md:items-start md:!justify-between h-full flex-col flex-col-reverse md:flex-row"
|
|
>
|
|
<div className="mb-6 border-t md:border-0">
|
|
<h2 className="text-lg font-semibold mb-4">Quick Links</h2>
|
|
<ul className="space-y-2">
|
|
<li>
|
|
<Link
|
|
href="/products/premium-rudraksha-consultation-astrology"
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
Get a Consultation
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/pages/certification-and-guarantee"
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
Certification and Guarantee
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/pages/contact-us"
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
Contact Us
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/blogs/blog"
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
Blogs
|
|
</Link>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div className="mb-6 md:mb-0">
|
|
<h2 className="text-lg font-semibold mb-4">Categories</h2>
|
|
<ul className="space-y-2">
|
|
{categoryItems.map((item) => (
|
|
<li key={item.label}>
|
|
<Link
|
|
href={item.url}
|
|
onClick={toggleSidebar}
|
|
className="text-sm font-medium hover:text-[#AC8C6B] transition-colors"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
<div className="h-[120px]"></div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Navbar;
|