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 (
);
}
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 && (
{GlobalNavigation.map((item) => (
{item.name}
))}
)}
{/* Mobile menu */}
{/* Content area */}
{/* Navigation Bar */}
{/* Main Content */}
{children}
);
}