204 lines
7.6 KiB
JavaScript
204 lines
7.6 KiB
JavaScript
import { useEffect, useState } from 'react';
|
|
|
|
import { Plugins } from '@capacitor/core';
|
|
import * as actions from '../../store/actions';
|
|
|
|
const Nav = ({ page }) => {
|
|
const [showProfileMenu, setShowProfileMenu] = useState(false);
|
|
|
|
const title = typeof page?.title === 'function' ? page?.title() : page?.title || '';
|
|
|
|
useEffect(() => {
|
|
Plugins.StatusBar.setStyle({
|
|
style: 'DARK',
|
|
}).catch(() => {});
|
|
}, []);
|
|
|
|
return (
|
|
<nav
|
|
className="bg-gray-800 w-full flex-0 flex items-end flex-row z-10"
|
|
style={{
|
|
height: `calc(env(safe-area-inset-bottom, 0px) + 64px)`,
|
|
}}
|
|
>
|
|
<div className="max-w-7xl mx-auto px-2 sm:px-6 lg:px-8 flex-1">
|
|
<div className="relative flex items-center justify-between h-16">
|
|
<div
|
|
className="absolute inset-y-0 left-0 flex items-center sm:hidden"
|
|
onClick={() => actions.setMenuOpen(true)}
|
|
>
|
|
{/* Mobile menu button*/}
|
|
<button
|
|
className="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-white hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white"
|
|
aria-expanded="false"
|
|
>
|
|
<span className="sr-only">Open main menu</span>
|
|
{/* Icon when menu is closed. */}
|
|
{/*
|
|
Heroicon name: menu
|
|
|
|
Menu open: "hidden", Menu closed: "block"
|
|
*/}
|
|
<svg
|
|
className="block h-6 w-6"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
aria-hidden="true"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth="2"
|
|
d="M4 6h16M4 12h16M4 18h16"
|
|
/>
|
|
</svg>
|
|
{/* Icon when menu is open. */}
|
|
{/*
|
|
Heroicon name: x
|
|
|
|
Menu open: "block", Menu closed: "hidden"
|
|
*/}
|
|
<svg
|
|
className="hidden h-6 w-6"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
aria-hidden="true"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth="2"
|
|
d="M6 18L18 6M6 6l12 12"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
<div className="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start">
|
|
<div className="flex-shrink-0 flex items-center">
|
|
<h1 className="text-gray-50">{title}</h1>
|
|
</div>
|
|
<div className="hidden sm:block sm:ml-6">
|
|
<div className="flex space-x-4">
|
|
{/* Current: "bg-gray-900 text-white", Default: "text-gray-300 hover:bg-gray-700 hover:text-white" */}
|
|
<a
|
|
href="#"
|
|
className="bg-gray-900 text-white px-3 py-2 rounded-md text-sm font-medium"
|
|
>
|
|
Dashboard
|
|
</a>
|
|
<a
|
|
href="#"
|
|
className="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium"
|
|
>
|
|
Team
|
|
</a>
|
|
<a
|
|
href="#"
|
|
className="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium"
|
|
>
|
|
Projects
|
|
</a>
|
|
<a
|
|
href="#"
|
|
className="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium"
|
|
>
|
|
Calendar
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="absolute inset-y-0 right-0 flex items-center pr-2 sm:static sm:inset-auto sm:ml-6 sm:pr-0">
|
|
<button
|
|
className="bg-gray-800 p-1 rounded-full text-gray-400 hover:text-white focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-800 focus:ring-white"
|
|
onClick={() => actions.setNotificationsOpen(true)}
|
|
>
|
|
<span className="sr-only">View notifications</span>
|
|
{/* Heroicon name: bell */}
|
|
<svg
|
|
className="h-6 w-6"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
aria-hidden="true"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth="2"
|
|
d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
|
|
{/* Profile dropdown */}
|
|
<div className="ml-3 relative">
|
|
<div>
|
|
<button
|
|
className="bg-gray-800 flex text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-800 focus:ring-white"
|
|
id="user-menu"
|
|
aria-haspopup="true"
|
|
onClick={() => setShowProfileMenu(!showProfileMenu)}
|
|
>
|
|
<span className="sr-only">Open user menu</span>
|
|
<img
|
|
className="h-8 w-8 rounded-full"
|
|
src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80"
|
|
alt=""
|
|
/>
|
|
</button>
|
|
</div>
|
|
{/*
|
|
Profile dropdown panel, show/hide based on dropdown state.
|
|
|
|
Entering: "transition ease-out duration-100"
|
|
From: "transform opacity-0 scale-95"
|
|
To: "transform opacity-100 scale-100"
|
|
Leaving: "transition ease-in duration-75"
|
|
From: "transform opacity-100 scale-100"
|
|
To: "transform opacity-0 scale-95"
|
|
*/}
|
|
<div
|
|
className={`${
|
|
showProfileMenu ? '' : 'hidden'
|
|
} origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg py-1 bg-white dark:bg-gray-800 ring-1 ring-black ring-opacity-5`}
|
|
role="menu"
|
|
aria-orientation="vertical"
|
|
aria-labelledby="user-menu"
|
|
>
|
|
<a
|
|
href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-400"
|
|
role="menuitem"
|
|
>
|
|
Your Profile
|
|
</a>
|
|
<a
|
|
href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-400"
|
|
role="menuitem"
|
|
>
|
|
Settings
|
|
</a>
|
|
<a
|
|
href="#"
|
|
className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-400"
|
|
role="menuitem"
|
|
>
|
|
Sign out
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
);
|
|
};
|
|
|
|
export default Nav;
|