mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 07:26:59 +00:00
On mobile when the Sidebar menu is open and you want to switch to cart, it would toggle the sidebar and close it instead of switching view.
92 lines
2.6 KiB
TypeScript
92 lines
2.6 KiB
TypeScript
import { FC } from 'react'
|
|
import Link from 'next/link'
|
|
import cn from 'clsx'
|
|
import type { LineItem } from '@commerce/types/cart'
|
|
import useCart from '@framework/cart/use-cart'
|
|
import useCustomer from '@framework/customer/use-customer'
|
|
import { Avatar } from '@components/common'
|
|
import { Heart, Bag } from '@components/icons'
|
|
import { useUI } from '@components/ui/context'
|
|
import Button from '@components/ui/Button'
|
|
import DropdownMenu from './DropdownMenu'
|
|
import s from './UserNav.module.css'
|
|
import Menu from '@components/icons/Menu'
|
|
|
|
interface Props {
|
|
className?: string
|
|
}
|
|
|
|
const countItem = (count: number, item: LineItem) => count + item.quantity
|
|
|
|
const UserNav: FC<Props> = ({ className }) => {
|
|
const { data } = useCart()
|
|
const { data: customer } = useCustomer()
|
|
const { toggleSidebar, closeSidebarIfPresent, openModal, setSidebarView } =
|
|
useUI()
|
|
const itemsCount = data?.lineItems.reduce(countItem, 0) ?? 0
|
|
|
|
return (
|
|
<nav className={cn(s.root, className)}>
|
|
<ul className={s.list}>
|
|
{process.env.COMMERCE_CART_ENABLED && (
|
|
<li className={s.item}>
|
|
<Button
|
|
className={s.item}
|
|
variant="naked"
|
|
onClick={() => {
|
|
setSidebarView('CART_VIEW')
|
|
openSidebar()
|
|
}}
|
|
aria-label={`Cart items: ${itemsCount}`}
|
|
>
|
|
<Bag />
|
|
{itemsCount > 0 && (
|
|
<span className={s.bagCount}>{itemsCount}</span>
|
|
)}
|
|
</Button>
|
|
</li>
|
|
)}
|
|
{process.env.COMMERCE_WISHLIST_ENABLED && (
|
|
<li className={s.item}>
|
|
<Link href="/wishlist">
|
|
<a onClick={closeSidebarIfPresent} aria-label="Wishlist">
|
|
<Heart />
|
|
</a>
|
|
</Link>
|
|
</li>
|
|
)}
|
|
{process.env.COMMERCE_CUSTOMERAUTH_ENABLED && (
|
|
<li className={s.item}>
|
|
{customer ? (
|
|
<DropdownMenu />
|
|
) : (
|
|
<button
|
|
className={s.avatarButton}
|
|
aria-label="Menu"
|
|
onClick={() => openModal()}
|
|
>
|
|
<Avatar />
|
|
</button>
|
|
)}
|
|
</li>
|
|
)}
|
|
<li className={s.mobileMenu}>
|
|
<Button
|
|
className={s.item}
|
|
variant="naked"
|
|
onClick={() => {
|
|
setSidebarView('MOBILEMENU_VIEW')
|
|
openSidebar()
|
|
}}
|
|
aria-label="Menu"
|
|
>
|
|
<Menu />
|
|
</Button>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
)
|
|
}
|
|
|
|
export default UserNav
|