|
import ApplicationLogo from '@/Components/ApplicationLogo'; |
|
import Dropdown from '@/Components/Dropdown'; |
|
import NavLink from '@/Components/NavLink'; |
|
import ResponsiveNavLink from '@/Components/ResponsiveNavLink'; |
|
import { Link, usePage } from '@inertiajs/react'; |
|
import { useState } from 'react'; |
|
|
|
export default function AuthenticatedLayout({ header, children }) { |
|
const user = usePage().props.auth.user; |
|
|
|
const [showingNavigationDropdown, setShowingNavigationDropdown] = |
|
useState(false); |
|
|
|
return ( |
|
<div className="min-h-screen bg-gray-100"> |
|
<nav className="border-b border-gray-100 bg-white"> |
|
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> |
|
<div className="flex h-16 justify-between"> |
|
<div className="flex"> |
|
<div className="flex shrink-0 items-center"> |
|
<Link href="/"> |
|
<ApplicationLogo className="block h-9 w-auto fill-current text-gray-800" /> |
|
</Link> |
|
</div> |
|
|
|
<div className="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex"> |
|
<NavLink |
|
href={route('dashboard')} |
|
active={route().current('dashboard')} |
|
> |
|
Dashboard |
|
</NavLink> |
|
</div> |
|
</div> |
|
|
|
<div className="hidden sm:ms-6 sm:flex sm:items-center"> |
|
<div className="relative ms-3"> |
|
<Dropdown> |
|
<Dropdown.Trigger> |
|
<span className="inline-flex rounded-md"> |
|
<button |
|
type="button" |
|
className="inline-flex items-center rounded-md border border-transparent bg-white px-3 py-2 text-sm font-medium leading-4 text-gray-500 transition duration-150 ease-in-out hover:text-gray-700 focus:outline-none" |
|
> |
|
{user.name} |
|
|
|
<svg |
|
className="-me-0.5 ms-2 h-4 w-4" |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 20 20" |
|
fill="currentColor" |
|
> |
|
<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" |
|
/> |
|
</svg> |
|
</button> |
|
</span> |
|
</Dropdown.Trigger> |
|
|
|
<Dropdown.Content> |
|
<Dropdown.Link |
|
href={route('profile.edit')} |
|
> |
|
Profile |
|
</Dropdown.Link> |
|
<Dropdown.Link |
|
href={route('logout')} |
|
method="post" |
|
as="button" |
|
> |
|
Log Out |
|
</Dropdown.Link> |
|
</Dropdown.Content> |
|
</Dropdown> |
|
</div> |
|
</div> |
|
|
|
<div className="-me-2 flex items-center sm:hidden"> |
|
<button |
|
onClick={() => |
|
setShowingNavigationDropdown( |
|
(previousState) => !previousState, |
|
) |
|
} |
|
className="inline-flex items-center justify-center rounded-md p-2 text-gray-400 transition duration-150 ease-in-out hover:bg-gray-100 hover:text-gray-500 focus:bg-gray-100 focus:text-gray-500 focus:outline-none" |
|
> |
|
<svg |
|
className="h-6 w-6" |
|
stroke="currentColor" |
|
fill="none" |
|
viewBox="0 0 24 24" |
|
> |
|
<path |
|
className={ |
|
!showingNavigationDropdown |
|
? 'inline-flex' |
|
: 'hidden' |
|
} |
|
strokeLinecap="round" |
|
strokeLinejoin="round" |
|
strokeWidth="2" |
|
d="M4 6h16M4 12h16M4 18h16" |
|
/> |
|
<path |
|
className={ |
|
showingNavigationDropdown |
|
? 'inline-flex' |
|
: 'hidden' |
|
} |
|
strokeLinecap="round" |
|
strokeLinejoin="round" |
|
strokeWidth="2" |
|
d="M6 18L18 6M6 6l12 12" |
|
/> |
|
</svg> |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div |
|
className={ |
|
(showingNavigationDropdown ? 'block' : 'hidden') + |
|
' sm:hidden' |
|
} |
|
> |
|
<div className="space-y-1 pb-3 pt-2"> |
|
<ResponsiveNavLink |
|
href={route('dashboard')} |
|
active={route().current('dashboard')} |
|
> |
|
Dashboard |
|
</ResponsiveNavLink> |
|
</div> |
|
|
|
<div className="border-t border-gray-200 pb-1 pt-4"> |
|
<div className="px-4"> |
|
<div className="text-base font-medium text-gray-800"> |
|
{user.name} |
|
</div> |
|
<div className="text-sm font-medium text-gray-500"> |
|
{user.email} |
|
</div> |
|
</div> |
|
|
|
<div className="mt-3 space-y-1"> |
|
<ResponsiveNavLink href={route('profile.edit')}> |
|
Profile |
|
</ResponsiveNavLink> |
|
<ResponsiveNavLink |
|
method="post" |
|
href={route('logout')} |
|
as="button" |
|
> |
|
Log Out |
|
</ResponsiveNavLink> |
|
</div> |
|
</div> |
|
</div> |
|
</nav> |
|
|
|
{header && ( |
|
<header className="bg-white shadow"> |
|
<div className="mx-auto max-w-7xl px-4 py-6 sm:px-6 lg:px-8"> |
|
{header} |
|
</div> |
|
</header> |
|
)} |
|
|
|
<main>{children}</main> |
|
</div> |
|
); |
|
} |
|
|