2025-02-20 01:37:35 +07:00
|
|
|
import { useState } from 'react'
|
|
|
|
|
import { Link } from 'react-router'
|
|
|
|
|
|
2025-03-02 12:06:30 +08:00
|
|
|
import type { TCategorySchema } from '~/apis/common/get-categories'
|
2025-02-22 15:15:04 +07:00
|
|
|
import { CloseIcon } from '~/components/icons/close'
|
|
|
|
|
import { MenuIcon } from '~/components/icons/menu'
|
2025-02-22 17:34:25 +08:00
|
|
|
import { useNewsContext } from '~/contexts/news'
|
|
|
|
|
import { HeaderSearch } from '~/layouts/news/header-search'
|
2025-02-20 01:37:35 +07:00
|
|
|
|
2025-03-02 12:06:30 +08:00
|
|
|
type THeaderMenuMobile = {
|
|
|
|
|
menu?: TCategorySchema['data']
|
|
|
|
|
}
|
2025-02-20 01:37:35 +07:00
|
|
|
|
2025-03-02 12:06:30 +08:00
|
|
|
export default function HeaderMenuMobile(properties: THeaderMenuMobile) {
|
|
|
|
|
const { menu } = properties
|
2025-02-20 01:37:35 +07:00
|
|
|
const [isMenuOpen, setIsMenuOpen] = useState(false)
|
2025-02-22 17:34:25 +08:00
|
|
|
const { setIsLoginOpen } = useNewsContext()
|
2025-02-20 01:37:35 +07:00
|
|
|
|
|
|
|
|
const handleToggleMenu = (): void => {
|
|
|
|
|
setIsMenuOpen(!isMenuOpen)
|
|
|
|
|
}
|
|
|
|
|
return (
|
|
|
|
|
<>
|
2025-02-22 15:15:04 +07:00
|
|
|
<div className="relative z-20 flex min-h-[65px] bg-[#2E2F7C] font-[sans-serif] tracking-wide text-white sm:hidden sm:px-10">
|
2025-02-20 01:37:35 +07:00
|
|
|
<div className="mx-auto flex w-full max-w-screen-xl flex-wrap items-center gap-4 align-middle">
|
|
|
|
|
{/* Menu */}
|
|
|
|
|
<div
|
2025-02-22 15:15:04 +07:00
|
|
|
className={`z-20 transition-transform duration-300 max-lg:fixed max-lg:top-0 max-lg:left-0 max-lg:h-full max-lg:w-full max-lg:overflow-auto max-lg:bg-[#2E2F7C] max-lg:p-6 max-lg:shadow-md ${
|
2025-02-20 01:37:35 +07:00
|
|
|
isMenuOpen ? 'translate-x-0' : '-translate-x-full'
|
|
|
|
|
}`}
|
|
|
|
|
>
|
|
|
|
|
{/* Tombol Close */}
|
|
|
|
|
<button
|
|
|
|
|
onClick={handleToggleMenu}
|
2025-02-22 15:15:04 +07:00
|
|
|
className="fixed top-5 right-5 z-20 flex h-9 w-9 items-center justify-center lg:hidden"
|
2025-02-20 01:37:35 +07:00
|
|
|
>
|
2025-02-22 15:15:04 +07:00
|
|
|
<CloseIcon
|
|
|
|
|
width={50}
|
|
|
|
|
height={50}
|
|
|
|
|
/>
|
2025-02-20 01:37:35 +07:00
|
|
|
</button>
|
|
|
|
|
|
|
|
|
|
{/* List Menu */}
|
2025-02-22 15:15:04 +07:00
|
|
|
<ul className="mx-10 mt-10 max-lg:space-y-3 lg:ml-14 lg:flex lg:gap-x-5">
|
2025-03-02 12:06:30 +08:00
|
|
|
{menu?.map((item, index) => (
|
2025-02-21 20:47:15 +07:00
|
|
|
<li
|
|
|
|
|
key={index}
|
|
|
|
|
className="px-3 max-lg:border-b max-lg:py-3"
|
|
|
|
|
>
|
2025-02-20 01:37:35 +07:00
|
|
|
<Link
|
2025-03-02 12:06:30 +08:00
|
|
|
key={item.id}
|
|
|
|
|
to={`/category/${item.code}`}
|
2025-02-20 01:37:35 +07:00
|
|
|
className={
|
|
|
|
|
'flex h-full items-center justify-center border-white px-[35px] sm:border-r'
|
|
|
|
|
}
|
|
|
|
|
>
|
2025-03-02 12:06:30 +08:00
|
|
|
{item.name}
|
2025-02-20 01:37:35 +07:00
|
|
|
</Link>
|
|
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
|
2025-02-22 17:34:25 +08:00
|
|
|
<button
|
|
|
|
|
className="w-full bg-white px-[35px] py-3 text-center text-[#2E2F7C] sm:hidden"
|
|
|
|
|
onClick={() => {
|
|
|
|
|
setIsLoginOpen(true)
|
|
|
|
|
setIsMenuOpen(false)
|
|
|
|
|
}}
|
|
|
|
|
>
|
2025-02-20 01:37:35 +07:00
|
|
|
Akun
|
|
|
|
|
</button>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Search dan Toggle Button */}
|
|
|
|
|
<div className="align-center flex w-full justify-center">
|
|
|
|
|
<button
|
|
|
|
|
onClick={handleToggleMenu}
|
|
|
|
|
className="h-[63px] border border-white px-4 lg:hidden"
|
|
|
|
|
>
|
2025-02-22 15:15:04 +07:00
|
|
|
<MenuIcon
|
|
|
|
|
width={25}
|
|
|
|
|
height={25}
|
|
|
|
|
/>
|
2025-02-20 01:37:35 +07:00
|
|
|
</button>
|
|
|
|
|
<div className="w-full py-3">
|
2025-02-21 20:47:15 +07:00
|
|
|
<HeaderSearch />
|
2025-02-20 01:37:35 +07:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
)
|
|
|
|
|
}
|