Files
AutonetSellCar/temp_header.tsx

154 lines
4.7 KiB
TypeScript

"use client";
import { useState, useEffect } from "react";
import Link from "next/link";
import { useRouter, usePathname } from "next/navigation";
import { Menu, X } from "lucide-react";
import { useLanguage } from "@/contexts/LanguageContext";
import LanguageSelector from "./LanguageSelector";
export default function Header() {
const { t } = useLanguage();
const router = useRouter();
const pathname = usePathname();
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const navItems = [
{ name: t("nav", "about"), href: "/#about" },
{ name: t("nav", "technology"), href: "/#technology" },
{ name: t("nav", "projects"), href: "/#projects" },
{ name: t("nav", "solutions"), href: "/#solutions" },
{ name: t("nav", "products"), href: "/#products" },
{ name: t("nav", "downloads"), href: "/downloads" },
{ name: t("nav", "contact"), href: "/#contact" },
];
useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 50);
};
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
// Handle hash scroll after navigation
useEffect(() => {
if (pathname === "/" && window.location.hash) {
const hash = window.location.hash.substring(1);
setTimeout(() => {
const element = document.getElementById(hash);
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
}, 100);
}
}, [pathname]);
const handleNavClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {
// If it's not a hash link, let it navigate normally
if (!href.includes("#")) {
return;
}
e.preventDefault();
const hash = href.split("#")[1];
if (pathname === "/") {
// Already on homepage, just scroll
const element = document.getElementById(hash);
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
} else {
// Navigate to homepage first, then scroll
router.push(href);
}
setIsMobileMenuOpen(false);
};
return (
<header
className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${
isScrolled
? "bg-white/95 backdrop-blur-sm shadow-md"
: "bg-transparent"
}`}
>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex items-center justify-between h-16 md:h-20">
{/* Logo */}
<Link href="/" className="flex items-center space-x-2">
<span
className={`text-2xl font-bold transition-colors ${
isScrolled ? "text-[#1E3A8A]" : "text-white"
}`}
>
GRANTECH
</span>
</Link>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center space-x-6">
{navItems.map((item) => (
<a
key={item.href}
href={item.href}
onClick={(e) => handleNavClick(e, item.href)}
className={`text-sm font-medium transition-colors hover:text-[#3B82F6] ${
isScrolled ? "text-gray-700" : "text-white"
}`}
>
{item.name}
</a>
))}
<LanguageSelector isScrolled={isScrolled} />
</nav>
{/* Mobile Menu Button */}
<div className="flex items-center md:hidden space-x-2">
<LanguageSelector isScrolled={isScrolled} />
<button
className="p-2"
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
>
{isMobileMenuOpen ? (
<X
className={`w-6 h-6 ${
isScrolled ? "text-gray-700" : "text-white"
}`}
/>
) : (
<Menu
className={`w-6 h-6 ${
isScrolled ? "text-gray-700" : "text-white"
}`}
/>
)}
</button>
</div>
</div>
{/* Mobile Menu */}
{isMobileMenuOpen && (
<div className="md:hidden bg-white border-t">
<nav className="py-4 space-y-2">
{navItems.map((item) => (
<a
key={item.href}
href={item.href}
onClick={(e) => handleNavClick(e, item.href)}
className="block px-4 py-2 text-gray-700 hover:bg-gray-50 hover:text-[#3B82F6]"
>
{item.name}
</a>
))}
</nav>
</div>
)}
</div>
</header>
);
}