172 lines
5.1 KiB
TypeScript
172 lines
5.1 KiB
TypeScript
// src/components/nav_foot/navbar.tsx
|
||
"use client";
|
||
|
||
import { useEffect, useState } from "react";
|
||
import i18n from "@/i18n";
|
||
import { animateScroll as scroll } from "react-scroll";
|
||
import Text from "../lib_components/text";
|
||
import "./navbar.css";
|
||
import { logoImg } from "@/assets";
|
||
import Image from "next/image";
|
||
import { usePathname, useRouter } from "next/navigation";
|
||
import { X } from "lucide-react"; // ❗ exit icon
|
||
|
||
export default function Navbar() {
|
||
const router = useRouter();
|
||
const pathname = usePathname();
|
||
|
||
const [toggle, setToggle] = useState(false);
|
||
const [togglerIcon, setTogglerIcon] = useState("toggler");
|
||
const [lang, setLang] = useState<"uz" | "ru">("uz");
|
||
|
||
const handleChangeLang = (lng: "uz" | "ru") => {
|
||
setLang(lng);
|
||
i18n.changeLanguage(lng);
|
||
};
|
||
|
||
const changeToggler = () => {
|
||
setToggle(!toggle);
|
||
togglerIcon === "toggler"
|
||
? setTogglerIcon("toggler toggle")
|
||
: setTogglerIcon("toggler");
|
||
};
|
||
|
||
const scrollOrRoute = (id: string) => {
|
||
if (pathname !== `/${lang}`) {
|
||
// Agar user boshqa sahifada bo'lsa asosiy sahifaga yo'naltirish
|
||
router.push(`/${lang}#${id}`);
|
||
} else {
|
||
// Agar main page-da bo'lsa scroll qilish
|
||
scroll.scrollTo(document.getElementById(id)!.offsetTop - 100);
|
||
}
|
||
changeToggler();
|
||
};
|
||
|
||
const goHome = () => {
|
||
router.push(`/${lang}`);
|
||
};
|
||
|
||
// ❗ Scrollni bloklash uchun effect
|
||
useEffect(() => {
|
||
if (toggle) {
|
||
document.body.style.overflow = "hidden"; // orqa scrollni o‘chir
|
||
} else {
|
||
document.body.style.overflow = "auto"; // qayta yoq
|
||
}
|
||
}, [toggle]);
|
||
|
||
return (
|
||
<>
|
||
{toggle && (
|
||
<div
|
||
onClick={changeToggler}
|
||
className="fixed inset-0 bg-black/30 bg-opacity-50 z-[900]"
|
||
></div>
|
||
)}
|
||
<div className="w-full bg-white border-gray shadow-md shadow-gray-500 z-[1000] top-0 ">
|
||
<div className="container max-w-[1500px] w-full px-[10px] mx-auto flex justify-between items-center">
|
||
<div className="flex items-center gap-5">
|
||
<button
|
||
onClick={() => handleChangeLang("uz")}
|
||
className={`hover:cursor-pointer ${
|
||
lang === "uz" && "bg-secondary text-primary rounded-[8px]"
|
||
} px-2 py-1 text-[20px] ${
|
||
lang !== "uz" && "border-l-2 border-b-2 border-primary"
|
||
} `}
|
||
>
|
||
UZ
|
||
</button>
|
||
<button
|
||
onClick={() => handleChangeLang("ru")}
|
||
className={`hover:cursor-pointer ${
|
||
lang === "ru" && "bg-secondary text-primary rounded-[8px]"
|
||
} px-2 py-1 text-[20px] ${
|
||
lang !== "ru" && "border-r-2 border-b-2 border-primary"
|
||
}`}
|
||
>
|
||
RU
|
||
</button>
|
||
</div>
|
||
|
||
<div className="flex items-center gap-5">
|
||
<div className="nav_link_group hidden min-[540px]:flex gap-5">
|
||
<LinkButton
|
||
txt="products"
|
||
id="products"
|
||
scrollFunc={scrollOrRoute}
|
||
/>
|
||
<LinkButton txt="news" id="about" scrollFunc={scrollOrRoute} />
|
||
<LinkButton
|
||
txt="contact"
|
||
id="contact"
|
||
scrollFunc={scrollOrRoute}
|
||
/>
|
||
</div>
|
||
|
||
<div onClick={changeToggler} className={togglerIcon}>
|
||
<div className="toggle_item1"></div>
|
||
<div className="toggle_item2"></div>
|
||
<div className="toggle_item3"></div>
|
||
</div>
|
||
|
||
<div
|
||
className={
|
||
toggle ? "nav_link_group_phone active" : "nav_link_group_phone"
|
||
}
|
||
>
|
||
<div className="flex flex-col gap-5 items-end justify-start w-full px-5">
|
||
<button
|
||
onClick={changeToggler}
|
||
className="w-full text-right text-gray-600 hover:text-primary"
|
||
>
|
||
<X size={22} />
|
||
</button>
|
||
<LinkButton
|
||
txt="products"
|
||
id="products"
|
||
scrollFunc={scrollOrRoute}
|
||
/>
|
||
<LinkButton txt="news" id="about" scrollFunc={scrollOrRoute} />
|
||
<LinkButton
|
||
txt="contact"
|
||
id="contact"
|
||
scrollFunc={scrollOrRoute}
|
||
/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div
|
||
onClick={goHome}
|
||
className="flex items-center gap-2 cursor-pointer"
|
||
>
|
||
<span className="flex max-[770px]:hidden text-2xl font-bold">
|
||
SPES-TEXNIKA
|
||
</span>
|
||
<Image src={logoImg} alt="logo" width={100} height={100} priority />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</>
|
||
);
|
||
}
|
||
|
||
function LinkButton({
|
||
txt,
|
||
id,
|
||
scrollFunc,
|
||
}: {
|
||
txt: string;
|
||
id: string;
|
||
scrollFunc: (id: string) => void;
|
||
}) {
|
||
return (
|
||
<button
|
||
onClick={() => scrollFunc(id)}
|
||
className="text-primary hover:text-secondary text-[20px]"
|
||
>
|
||
<Text txt={txt} />
|
||
</button>
|
||
);
|
||
}
|