midrashim/src/components/SiteNavigation.tsx
2025-05-01 12:18:57 -05:00

163 lines
5.1 KiB
TypeScript

'use client'
import { Avatar } from '@/components/avatar'
import {
Dropdown,
DropdownButton,
DropdownDivider,
DropdownItem,
DropdownLabel,
DropdownMenu,
} from '@/components/dropdown'
import {
Navbar,
NavbarDivider,
NavbarItem,
NavbarLabel,
NavbarSection,
NavbarSpacer,
} from '@/components/navbar'
import {
Sidebar,
SidebarBody,
SidebarHeader,
SidebarItem,
SidebarLabel,
SidebarSection,
} from '@/components/sidebar'
import { StackedLayout } from '@/components/stacked-layout'
import { Media } from '@/payload-types'
import { useGlobal } from '@/providers/GlobalProvider'
import { ArrowRightStartOnRectangleIcon, LightBulbIcon, UserIcon } from '@heroicons/react/16/solid'
import { MagnifyingGlassIcon, SunIcon, MoonIcon } from '@heroicons/react/20/solid'
import { useTheme } from 'next-themes'
import Link from 'next/link'
import React, { useMemo } from 'react'
const navItems = [
{ label: 'Home', url: '/' },
{ label: 'Browse', url: '/books' },
{ label: 'Events', url: '/events' },
{ label: 'Settings', url: '/settings' },
]
export default function SiteNavigation(props: { children: React.ReactNode }) {
const { children } = props
const { theme, setTheme } = useTheme()
const { user, setUser } = useGlobal()
useMemo(() => {
if (user) return
fetch('/api/users/me', {
method: 'GET',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
}).then(async (response) => {
const userRequest = await response.json()
setUser(userRequest.user)
})
}, [user, setUser])
const profilePicture = user?.profilePicture as Media | undefined
const initials = user?.firstName
? `${user?.firstName.slice(0, 1) || ''}${user?.lastName?.slice(0, 1)}`
: 'U'
return (
<StackedLayout
navbar={
<Navbar>
<Dropdown>
<DropdownButton
as={NavbarItem}
onClick={() => (window.location.href = '/')}
className="max-lg:hidden"
>
<Avatar src="/api/media/file/bethel-logo.jpg" />
<NavbarLabel>Midrashim</NavbarLabel>
</DropdownButton>
</Dropdown>
<NavbarDivider className="max-lg:hidden" />
<NavbarSection className="max-lg:hidden">
{navItems.map(({ label, url }) => (
<NavbarItem key={label} href={url}>
{label}
</NavbarItem>
))}
</NavbarSection>
<NavbarSpacer />
<NavbarSection>
<NavbarItem href="/search" aria-label="Search">
<MagnifyingGlassIcon />
</NavbarItem>
<NavbarItem
aria-label="Inbox"
role={'button'}
onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
>
<SunIcon className="dark:hidden" />
<MoonIcon className="hidden dark:block" />
</NavbarItem>
<Dropdown>
<DropdownButton as={NavbarItem}>
<Avatar src={profilePicture?.url || ''} initials={initials} square={false} />
</DropdownButton>
<DropdownMenu className="min-w-64" anchor="bottom end">
<DropdownItem href="/profile">
<UserIcon />
<DropdownLabel>My profile</DropdownLabel>
</DropdownItem>
{/*<DropdownItem href="/settings">
<Cog8ToothIcon />
<DropdownLabel>Settings</DropdownLabel>
</DropdownItem>
<DropdownDivider />
<DropdownItem href="/privacy-policy">
<ShieldCheckIcon />
<DropdownLabel>Privacy policy</DropdownLabel>
</DropdownItem>*/}
<DropdownItem href="/feedback">
<LightBulbIcon />
<DropdownLabel>Share feedback</DropdownLabel>
</DropdownItem>
<DropdownDivider />
<DropdownItem href="/logout">
<ArrowRightStartOnRectangleIcon />
<DropdownLabel>Sign out</DropdownLabel>
</DropdownItem>
</DropdownMenu>
</Dropdown>
</NavbarSection>
</Navbar>
}
sidebar={
<Sidebar>
<SidebarHeader>
<Dropdown>
<DropdownButton as={SidebarItem} className="lg:mb-2.5">
<Link href="/" className="flex items-center justify-around gap-3">
<Avatar src="/api/media/file/bethel-logo.jpg" className="size-8" />
<SidebarLabel>Midrashim</SidebarLabel>
</Link>
</DropdownButton>
</Dropdown>
</SidebarHeader>
<SidebarBody>
<SidebarSection>
{navItems.map(({ label, url }) => (
<SidebarItem key={label} href={url}>
{label}
</SidebarItem>
))}
</SidebarSection>
</SidebarBody>
</Sidebar>
}
>
{children}
</StackedLayout>
)
}