refactor: simplify Header component by removing unused scroll handling and improving mobile menu structure
This commit is contained in:
@@ -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');
|
||||||
|
|||||||
@@ -15,10 +15,6 @@
|
|||||||
"title": "Roadmap",
|
"title": "Roadmap",
|
||||||
"link": "/roadmap"
|
"link": "/roadmap"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"title": "Artikel",
|
|
||||||
"link": "/articles"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"title": "Team",
|
"title": "Team",
|
||||||
"link": "/teams"
|
"link": "/teams"
|
||||||
|
|||||||
Reference in New Issue
Block a user