import clsx from 'clsx'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { signOut, useSession } from 'next-auth/react'; import type { ReactNode } from 'react'; import { Fragment, useState } from 'react'; import { Menu, Transition } from '@headlessui/react'; import { Bars3BottomLeftIcon } from '@heroicons/react/24/outline'; import { Button } from '@tih/ui'; import GlobalNavigation from '~/components/global/GlobalNavigation'; import HomeNavigation from '~/components/global/HomeNavigation'; import OffersNavigation, { OffersNavigationAdmin, OffersNavigationAuthenticated, } from '~/components/offers/OffersNavigation'; import QuestionsNavigation from '~/components/questions/QuestionsNavigation'; import ResumesNavigation from '~/components/resumes/ResumesNavigation'; import { trpc } from '~/utils/trpc'; import GoogleAnalytics from './GoogleAnalytics'; import MobileNavigation from './MobileNavigation'; import type { ProductNavigationItems } from './ProductNavigation'; import ProductNavigation from './ProductNavigation'; import loginPageHref from '../shared/loginPageHref'; type Props = Readonly<{ children: ReactNode; }>; function ProfileJewel() { const router = useRouter(); const { data: session, status } = useSession(); const isSessionLoading = status === 'loading'; if (isSessionLoading) { return null; } const loginHref = loginPageHref(); if (session == null) { return router.pathname !== loginHref.pathname ? (
Sign In
) : null; } const userNavigation = [ { href: '/settings', name: 'Settings' }, { href: '/api/auth/signout', name: 'Sign Out', onClick: (event: React.MouseEvent) => { event.preventDefault(); signOut(); }, }, ]; return (
Open user menu {session?.user?.image == null ? ( TODO: Render some icon ) : ( {session?.user?.email )}
{!!session?.user?.name && ( {() => ( {session?.user?.name ?? ''} )} )} {userNavigation.map((item) => ( {({ active }) => ( {item.name} )} ))}
); } export default function AppShell({ children }: Props) { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const router = useRouter(); const { data: session } = useSession(); // TODO: Shift this into offers pages and not in this common component. const { isLoading: isOffersAdminResultsLoading, data: isOffersAdmin } = trpc.useQuery(['offers.admin.isAdmin']); const currentProductNavigation: Readonly<{ logo?: React.ReactNode; navigation: ProductNavigationItems; showGlobalNav: boolean; title: string; titleHref: string; }> = (() => { const path = router.pathname; if (path.startsWith('/resumes')) { return ResumesNavigation; } if (path.startsWith('/offers')) { if (session == null) { return OffersNavigation; } if (!isOffersAdminResultsLoading && isOffersAdmin) { return OffersNavigationAdmin; } return OffersNavigationAuthenticated; } if (path.startsWith('/questions')) { return QuestionsNavigation; } return HomeNavigation; })(); return (
{/* Narrow sidebar */} {currentProductNavigation.showGlobalNav && (
Tech Interview Handbook
{GlobalNavigation.map((item) => (
)} {/* Mobile menu */} {/* Content area */}
{/* Navigation Bar */}
{/* Main Content */}
{children}
); }