2023-07-11 17:22:54 -06:00
|
|
|
import { signIn, signOut, useSession } from "next-auth/react";
|
2023-04-20 04:20:00 -06:00
|
|
|
import Image from "next/image";
|
2023-07-11 17:22:54 -06:00
|
|
|
import Link from "next/link";
|
2023-05-31 21:49:25 -06:00
|
|
|
import { useRouter } from "next/router";
|
2023-07-11 17:22:54 -06:00
|
|
|
import { env } from "~/env.mjs";
|
2023-04-20 04:20:00 -06:00
|
|
|
|
|
|
|
interface NavbarProps {
|
|
|
|
title: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
const Navbar: React.FC<NavbarProps> = ({ title }) => {
|
2023-05-31 21:49:25 -06:00
|
|
|
const { data: sessionData, status: sessionStatus } = useSession();
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
const navigationMenu = () => {
|
|
|
|
if (sessionStatus === "authenticated" && router.pathname !== "/dashboard") {
|
|
|
|
return (
|
|
|
|
<Link className="btn btn-secondary btn-outline mx-2" href="/dashboard">
|
|
|
|
Dashboard
|
|
|
|
</Link>
|
|
|
|
);
|
|
|
|
} else if (sessionStatus === "unauthenticated") {
|
|
|
|
return (
|
|
|
|
<button className="btn btn-secondary" onClick={() => void signIn()}>
|
|
|
|
Sign In
|
|
|
|
</button>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
2023-04-20 04:20:00 -06:00
|
|
|
|
|
|
|
return (
|
2023-05-31 21:49:25 -06:00
|
|
|
<nav className="navbar bg-base-100 h-12">
|
2023-04-20 04:20:00 -06:00
|
|
|
<div className="flex-1">
|
|
|
|
<Link
|
|
|
|
about="Back to home."
|
|
|
|
href="/"
|
|
|
|
className="btn btn-ghost normal-case text-xl"
|
|
|
|
>
|
|
|
|
<Image
|
2023-05-31 21:49:25 -06:00
|
|
|
className="md:mr-2"
|
2023-04-20 04:20:00 -06:00
|
|
|
src="/logo.webp"
|
|
|
|
alt="Nav Logo"
|
|
|
|
width={32}
|
|
|
|
height={32}
|
|
|
|
priority
|
|
|
|
/>
|
2023-05-31 21:49:25 -06:00
|
|
|
<span className="hidden md:inline-flex">
|
|
|
|
{title}
|
2023-06-05 16:56:28 -06:00
|
|
|
{env.NEXT_PUBLIC_APP_ENV === "development" && " >> Staging"}
|
2023-05-31 21:49:25 -06:00
|
|
|
</span>
|
2023-04-20 04:20:00 -06:00
|
|
|
</Link>
|
|
|
|
</div>
|
2023-05-31 21:49:25 -06:00
|
|
|
|
2023-06-19 16:39:05 -06:00
|
|
|
{sessionStatus === "loading" ? (
|
|
|
|
<div className="flex items-center justify-center">
|
2023-06-19 23:46:12 -06:00
|
|
|
<span className="loading loading-dots loading-lg"></span>
|
2023-06-19 16:39:05 -06:00
|
|
|
</div>
|
|
|
|
) : (
|
|
|
|
navigationMenu()
|
|
|
|
)}
|
2023-05-31 21:49:25 -06:00
|
|
|
|
2023-04-20 04:20:00 -06:00
|
|
|
{sessionData?.user.image && (
|
|
|
|
<div className="flex-none gap-2">
|
|
|
|
<div className="dropdown dropdown-end">
|
|
|
|
<label tabIndex={0} className="btn btn-ghost btn-circle avatar">
|
|
|
|
<div className="w-10 rounded-full">
|
|
|
|
<Image
|
|
|
|
src={sessionData.user.image}
|
|
|
|
alt="Profile picture."
|
|
|
|
height={32}
|
|
|
|
width={32}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</label>
|
|
|
|
<ul
|
|
|
|
tabIndex={0}
|
2023-06-12 18:24:29 -06:00
|
|
|
className="mt-3 p-2 shadow menu menu-compact dropdown-content bg-base-100 rounded-box z-50"
|
2023-04-20 04:20:00 -06:00
|
|
|
>
|
|
|
|
<li>
|
|
|
|
<Link
|
|
|
|
about="Profile Page"
|
|
|
|
href="/profile"
|
|
|
|
className="justify-between"
|
|
|
|
>
|
|
|
|
Profile
|
|
|
|
</Link>
|
|
|
|
</li>
|
|
|
|
{sessionData.user.role === "ADMIN" && (
|
|
|
|
<li>
|
|
|
|
<Link
|
|
|
|
about="Admin Page"
|
|
|
|
href="/admin"
|
|
|
|
className="justify-between"
|
|
|
|
>
|
|
|
|
Admin
|
|
|
|
</Link>
|
|
|
|
</li>
|
|
|
|
)}
|
|
|
|
<li>
|
2023-05-30 22:16:33 -06:00
|
|
|
<a onClick={() => void signOut({ callbackUrl: "/" })}>
|
|
|
|
Sign Out
|
|
|
|
</a>
|
2023-04-20 04:20:00 -06:00
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</nav>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default Navbar;
|