Files
nabijonovdavronbek619@gmail.com bf7b869dd4 hero section done
2025-11-12 11:51:29 +05:00

172 lines
5.1 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 ochir
} 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>
);
}