refactor: simplify Header component by removing unused scroll handling and improving mobile menu structure

This commit is contained in:
arraysid
2025-06-01 08:42:59 +07:00
parent 07e5bab31f
commit e871d453a8
3 changed files with 5 additions and 35 deletions
@@ -13,45 +13,26 @@ import { LuMenu, LuX } from 'react-icons/lu';
export function Header() { export function Header() {
const router = useRouter(); const router = useRouter();
const pathname = usePathname(); const pathname = usePathname();
const [isScrolled, setIsScrolled] = useState(false);
const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
useEffect(() => { useEffect(() => {
const handleScroll = () => {
setIsScrolled(window.scrollY > 10);
};
window.addEventListener('scroll', handleScroll);
// Lock body scroll when mobile menu is open
if (mobileMenuOpen) { if (mobileMenuOpen) {
document.body.style.overflow = 'hidden'; document.body.style.overflow = 'hidden';
} else { } else {
document.body.style.overflow = 'auto'; document.body.style.overflow = 'auto';
} }
return () => { return () => {
window.removeEventListener('scroll', handleScroll);
document.body.style.overflow = 'auto'; document.body.style.overflow = 'auto';
}; };
}, [mobileMenuOpen]); }, [mobileMenuOpen]);
// Close mobile menu when route changes
useEffect(() => { useEffect(() => {
setMobileMenuOpen(false); setMobileMenuOpen(false);
}, [pathname]); }, [pathname]);
return ( return (
<header <header className="sticky top-0 w-full z-50 bg-background/70">
className={cn(
'sticky top-0 z-50 w-full transition-all duration-300',
isScrolled
? 'bg-background/90 backdrop-blur-lg border-b shadow-sm'
: 'bg-background/70'
)}
>
<div className="container flex h-20 items-center justify-between"> <div className="container flex h-20 items-center justify-between">
{/* Logo */}
<Link <Link
href="/" href="/"
className="relative overflow-hidden rounded z-50" className="relative overflow-hidden rounded z-50"
@@ -60,7 +41,6 @@ export function Header() {
<LogoSimple className="w-24 md:w-28" /> <LogoSimple className="w-24 md:w-28" />
</Link> </Link>
{/* Desktop Navigation */}
<nav className="hidden md:flex items-center gap-8"> <nav className="hidden md:flex items-center gap-8">
{NAVIGATIONS.map(({ link, title }) => ( {NAVIGATIONS.map(({ link, title }) => (
<Link <Link
@@ -84,7 +64,6 @@ export function Header() {
))} ))}
</nav> </nav>
{/* Desktop Auth Buttons */}
<div className="hidden md:flex items-center gap-x-3"> <div className="hidden md:flex items-center gap-x-3">
<Button <Button
onClick={() => router.push('/signin')} onClick={() => router.push('/signin')}
@@ -93,7 +72,7 @@ export function Header() {
Masuk Masuk
</Button> </Button>
<Button <Button
variant="primary" variant="bordered"
onClick={() => router.push('/signup')} onClick={() => router.push('/signup')}
className="px-5 py-2 text-sm font-medium shadow-lg shadow-primary/20 hover:shadow-primary/30" className="px-5 py-2 text-sm font-medium shadow-lg shadow-primary/20 hover:shadow-primary/30"
> >
@@ -101,9 +80,8 @@ export function Header() {
</Button> </Button>
</div> </div>
{/* Mobile Menu Button */}
<button <button
onClick={() => setMobileMenuOpen(!mobileMenuOpen)} onClick={() => setMobileMenuOpen((prev) => !prev)}
className="flex md:hidden relative z-50 p-2 rounded-lg hover:bg-muted transition-colors" className="flex md:hidden relative z-50 p-2 rounded-lg hover:bg-muted transition-colors"
aria-label={mobileMenuOpen ? 'Tutup menu' : 'Buka menu'} aria-label={mobileMenuOpen ? 'Tutup menu' : 'Buka menu'}
> >
@@ -114,16 +92,14 @@ export function Header() {
)} )}
</button> </button>
{/* Fullscreen Mobile Menu */}
<AnimatePresence> <AnimatePresence>
{mobileMenuOpen && ( {mobileMenuOpen && (
<motion.div <motion.div
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
animate={{ opacity: 1 }} animate={{ opacity: 1 }}
exit={{ opacity: 0 }} exit={{ opacity: 0 }}
className="fixed inset-0 z-40 bg-background flex flex-col" className="fixed inset-0 z-60 bg-background flex flex-col"
> >
{/* Menu Header */}
<div className="container flex h-20 items-center justify-between"> <div className="container flex h-20 items-center justify-between">
<Link <Link
href="/" href="/"
@@ -142,7 +118,6 @@ export function Header() {
</button> </button>
</div> </div>
{/* Navigation Links */}
<motion.nav <motion.nav
className="flex-1 flex flex-col items-center justify-center gap-6 py-10" className="flex-1 flex flex-col items-center justify-center gap-6 py-10"
initial={{ y: 20, opacity: 0 }} initial={{ y: 20, opacity: 0 }}
@@ -166,7 +141,6 @@ export function Header() {
))} ))}
</motion.nav> </motion.nav>
{/* Auth Buttons */}
<motion.div <motion.div
className="container space-y-4 pb-10" className="container space-y-4 pb-10"
initial={{ y: 20, opacity: 0 }} initial={{ y: 20, opacity: 0 }}
@@ -183,7 +157,7 @@ export function Header() {
Masuk Masuk
</Button> </Button>
<Button <Button
variant="primary" variant="bordered"
onClick={() => { onClick={() => {
setMobileMenuOpen(false); setMobileMenuOpen(false);
router.push('/signup'); router.push('/signup');
-4
View File
@@ -15,10 +15,6 @@
"title": "Roadmap", "title": "Roadmap",
"link": "/roadmap" "link": "/roadmap"
}, },
{
"title": "Artikel",
"link": "/articles"
},
{ {
"title": "Team", "title": "Team",
"link": "/teams" "link": "/teams"