You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
7.6 KiB
153 lines
7.6 KiB
import {Collapse, Dropdown} from "flowbite";
|
|
import {useEffect} from "react";
|
|
import delve from "dlv";
|
|
|
|
/* eslint-disable-next-line */
|
|
export interface AppHeaderProps {
|
|
}
|
|
|
|
export function Header({items = []}) {
|
|
useEffect(function mount() {
|
|
const burgerButton = document.getElementById('mega-menu-button');
|
|
const megaZone = document.getElementById('mega-menu');
|
|
new Collapse(megaZone, burgerButton);
|
|
|
|
const userButton = document.getElementById('user-menu-button');
|
|
const userZone = document.getElementById('user-dropdown');
|
|
new Dropdown(userZone, userButton);
|
|
});
|
|
|
|
const generateItem = (item, index, isActive = false) => {
|
|
const value = delve(item, 'attributes', {});
|
|
return (
|
|
<li key={value.title + index}>
|
|
{value.children.data.length > 0 ? dropdownItem(value, isActive) : regularItem(value, isActive)}
|
|
</li>
|
|
);
|
|
}
|
|
|
|
const regularItem = (item, isActive = false) => {
|
|
return (
|
|
<a href={item.url}
|
|
target={item.target}
|
|
className={(isActive ? 'text-blue-600' : '') + " block py-2 pl-3 pr-4 border-b border-gray-100 hover:bg-gray-50 md:hover:bg-transparent md:border-0 md:hover:text-blue-600 md:p-0 dark:text-blue-500 md:dark:hover:text-blue-500 dark:hover:bg-gray-700 dark:hover:text-blue-500 md:dark:hover:bg-transparent dark:border-gray-700"}
|
|
aria-current="page">{item.title}</a>
|
|
)
|
|
}
|
|
|
|
const regularDropdownItem = (item, index) => {
|
|
const value = delve(item, 'attributes', {});
|
|
return (
|
|
<li key={value.title + index}>
|
|
<a href={value.url}
|
|
className="dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-500">
|
|
{value.title}
|
|
</a>
|
|
</li>
|
|
);
|
|
}
|
|
|
|
const dropdownItem = (item, isActive = false) => {
|
|
return (
|
|
<>
|
|
<button id="mega-menu-dropdown-button"
|
|
data-dropdown-toggle="mega-menu-dropdown"
|
|
className={(isActive ? 'text-blue-600' : '') + " flex items-center justify-between w-full py-2 pl-3 pr-4 font-medium border-b border-gray-100 md:w-auto hover:bg-gray-50 md:hover:bg-transparent md:border-0 md:hover:text-blue-600 md:p-0 dark:text-gray-400 md:dark:hover:text-blue-500 dark:hover:bg-gray-700 dark:hover:text-blue-500 md:dark:hover:bg-transparent dark:border-gray-700"}>
|
|
{item.title}
|
|
<svg aria-hidden="true"
|
|
className="w-5 h-5 ml-1 md:w-4 md:h-4"
|
|
fill="currentColor"
|
|
viewBox="0 0 20 20"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path fillRule="evenodd"
|
|
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
|
clipRule="evenodd"></path>
|
|
</svg>
|
|
</button>
|
|
<div id="mega-menu-dropdown"
|
|
className="absolute z-10 grid hidden w-auto text-sm bg-white border border-gray-100 rounded-lg shadow-md dark:border-gray-700 dark:bg-gray-700">
|
|
<div className="p-4 pb-0 text-gray-900 md:pb-4 dark:text-white">
|
|
<ul className="space-y-4" aria-labelledby="mega-menu-dropdown-button">
|
|
{item.children.data.map((children, index) => regularDropdownItem(children, index))}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<nav
|
|
className="bg-white px-2 sm:px-4 py-2.5 dark:bg-gray-900 fixed w-full z-20 top-0 left-0 border-b border-gray-200 dark:border-gray-600">
|
|
<div className="container flex flex-wrap items-center justify-between mx-auto">
|
|
<a href="https://flowbite.com" className="flex items-center">
|
|
<img src="https://flowbite.com/docs/images/logo.svg" className="h-6 mr-3 sm:h-9" alt="Flowbite Logo"/>
|
|
<span className="self-center text-xl font-semibold whitespace-nowrap dark:text-white">Flowbite</span>
|
|
</a>
|
|
<div className="flex items-center md:order-2">
|
|
<a href="#"
|
|
className="text-gray-800 dark:text-white hover:bg-gray-50 focus:ring-4 focus:ring-gray-300 font-medium rounded-lg text-sm px-4 py-2 md:px-5 md:py-2.5 mr-1 md:mr-2 dark:hover:bg-gray-700 focus:outline-none dark:focus:ring-gray-800">Login</a>
|
|
<a href="#"
|
|
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2 md:px-5 md:py-2.5 mr-1 md:mr-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800">Sign
|
|
up</a>
|
|
|
|
<button type="button"
|
|
className="flex mr-3 text-sm bg-gray-800 rounded-full md:mr-0 focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600"
|
|
id="user-menu-button" aria-expanded="false" data-dropdown-toggle="user-dropdown"
|
|
data-dropdown-placement="bottom">
|
|
<span className="sr-only">Open user menu</span>
|
|
<img className="w-8 h-8 rounded-full" src="/docs/images/people/profile-picture-3.jpg" alt="user photo"/>
|
|
</button>
|
|
<div
|
|
className="z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600"
|
|
id="user-dropdown">
|
|
<div className="px-4 py-3">
|
|
<span className="block text-sm text-gray-900 dark:text-white">Bonnie Green</span>
|
|
<span
|
|
className="block text-sm font-medium text-gray-500 truncate dark:text-gray-400">name@flowbite.com</span>
|
|
</div>
|
|
<ul className="py-1" aria-labelledby="user-menu-button">
|
|
<li>
|
|
<a href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white">Dashboard</a>
|
|
</li>
|
|
<li>
|
|
<a href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white">Settings</a>
|
|
</li>
|
|
<li>
|
|
<a href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white">Earnings</a>
|
|
</li>
|
|
<li>
|
|
<a href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white">Sign
|
|
out</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<button id="mega-menu-button" data-collapse-toggle="mega-menu" type="button"
|
|
className="inline-flex items-center p-2 ml-1 text-sm text-gray-500 rounded-lg md:hidden hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600"
|
|
aria-controls="mega-menu" aria-expanded="false">
|
|
<span className="sr-only">Open main menu</span>
|
|
<svg aria-hidden="true" className="w-6 h-6" fill="currentColor" viewBox="0 0 20 20"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path fillRule="evenodd"
|
|
d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
|
clipRule="evenodd"></path>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
<div id="mega-menu" className="items-center justify-between hidden w-full md:flex md:w-auto md:order-1">
|
|
<ul className="flex flex-col mt-4 font-medium md:flex-row md:space-x-8 md:mt-0">
|
|
{items.map((item, index: number) => generateItem(item, index))}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
);
|
|
}
|
|
|
|
export default Header;
|