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.
nx-guitar-school/apps/client/components/header/header.tsx

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;