mirror of
https://github.com/khairul169/code-share.git
synced 2025-04-29 00:59:37 +07:00
87 lines
2.4 KiB
TypeScript
87 lines
2.4 KiB
TypeScript
import React, { ComponentProps } from "react";
|
|
import { cn } from "~/lib/utils";
|
|
import Link from "~/renderer/link";
|
|
import { Button } from "../ui/button";
|
|
import Logo from "./logo";
|
|
import { useAuth } from "~/hooks/useAuth";
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuTrigger,
|
|
} from "../ui/dropdown-menu";
|
|
import { FaChevronDown } from "react-icons/fa";
|
|
import trpc from "~/lib/trpc";
|
|
import { usePageContext } from "~/renderer/context";
|
|
|
|
const Navbar = () => {
|
|
const {user, urlPathname } = usePageContext();
|
|
const logout = trpc.auth.logout.useMutation({
|
|
onSuccess() {
|
|
window.location.reload();
|
|
},
|
|
});
|
|
|
|
return (
|
|
<>
|
|
<div className="h-16" />
|
|
|
|
<header className="h-16 bg-background fixed z-20 top-0 left-0 w-full border-b border-white/20">
|
|
<div className="h-full container max-w-5xl flex items-center gap-3">
|
|
<Logo />
|
|
|
|
<NavMenu className="md:ml-8 flex-1">
|
|
<NavItem href="/">Home</NavItem>
|
|
{/* <NavItem href="/browse">Browse</NavItem> */}
|
|
</NavMenu>
|
|
|
|
<div className="flex items-center gap-3">
|
|
{user ? (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger asChild>
|
|
<Button variant="ghost" className="gap-3 px-0">
|
|
<div className="size-8 rounded-full bg-white/40" />
|
|
<p>{user.name}</p>
|
|
<FaChevronDown />
|
|
</Button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent align="end">
|
|
<DropdownMenuItem onClick={() => logout.mutate()}>
|
|
Logout
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
) : (
|
|
<Button href={"/auth/login?return=" + urlPathname}>Log in</Button>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</header>
|
|
</>
|
|
);
|
|
};
|
|
|
|
const NavMenu = ({ children, className }: ComponentProps<"nav">) => (
|
|
<nav className={cn("flex items-stretch h-full gap-6", className)}>
|
|
{children}
|
|
</nav>
|
|
);
|
|
|
|
type NavItemProps = {
|
|
href?: string;
|
|
children?: React.ReactNode;
|
|
};
|
|
|
|
const NavItem = ({ href, children }: NavItemProps) => {
|
|
return (
|
|
<Link
|
|
href={href}
|
|
className="flex items-center text-white/70 data-[active]:text-white hover:text-white transition-colors"
|
|
>
|
|
{children}
|
|
</Link>
|
|
);
|
|
};
|
|
|
|
export default Navbar;
|