This commit is contained in:
@@ -1,12 +1,15 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useGetCartItems } from "@/app/[name]/(Main)/cart/hooks/useCartData";
|
||||||
import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData";
|
import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData";
|
||||||
import { glassSurfaceNav } from "@/lib/styles/glassSurface";
|
import { glassSurfaceNav } from "@/lib/styles/glassSurface";
|
||||||
|
import { useReceiptStore } from "@/zustand/receiptStore";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import type { Icon } from "iconsax-react";
|
import type { Icon } from "iconsax-react";
|
||||||
import { Bag2, Heart, Home2, InfoCircle, Reserve } from "iconsax-react";
|
import { Bag2, Heart, Home2, InfoCircle, Reserve } from "iconsax-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useParams, usePathname, useRouter } from "next/navigation";
|
import { useParams, usePathname, useRouter } from "next/navigation";
|
||||||
|
import { useMemo } from "react";
|
||||||
import { toastLoginRequired } from "../Toast";
|
import { toastLoginRequired } from "../Toast";
|
||||||
|
|
||||||
type BottomNavBarProps = {
|
type BottomNavBarProps = {
|
||||||
@@ -19,12 +22,22 @@ type NavItemProps = {
|
|||||||
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;
|
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;
|
||||||
onButtonClick?: () => void;
|
onButtonClick?: () => void;
|
||||||
Icon: Icon;
|
Icon: Icon;
|
||||||
|
badge?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
function NavItem({ href, isActive, onClick, onButtonClick, Icon }: NavItemProps) {
|
function NavItem({ href, isActive, onClick, onButtonClick, Icon, badge }: NavItemProps) {
|
||||||
const className = clsx("flex-1 flex items-center justify-center h-full rounded-full", isActive && "bg-primary/12");
|
const className = clsx("flex-1 flex items-center justify-center h-full rounded-full", isActive && "bg-primary/12");
|
||||||
|
|
||||||
const icon = <Icon size={20} color="currentColor" variant={isActive ? "Bold" : "Linear"} className={isActive ? "text-primary" : "text-icon-deactive"} />;
|
const icon = (
|
||||||
|
<span className="relative">
|
||||||
|
<Icon size={20} color="currentColor" variant={isActive ? "Bold" : "Linear"} className={isActive ? "text-primary" : "text-icon-deactive"} />
|
||||||
|
{badge != null && badge > 0 && (
|
||||||
|
<span className="absolute -right-1.5 -top-1 flex min-w-3.5 h-3.5 items-center justify-center rounded-full bg-primary px-0.5 text-[8px] font-medium text-container dark:bg-white dark:text-black">
|
||||||
|
{badge > 99 ? "99+" : badge}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
|
||||||
if (onButtonClick) {
|
if (onButtonClick) {
|
||||||
return (
|
return (
|
||||||
@@ -47,6 +60,14 @@ function BottomNavBar({ onPagerClick }: BottomNavBarProps) {
|
|||||||
const pathname = usePathname();
|
const pathname = usePathname();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { isSuccess } = useGetProfile();
|
const { isSuccess } = useGetProfile();
|
||||||
|
const { data: cartData } = useGetCartItems(isSuccess);
|
||||||
|
const localItems = useReceiptStore((state) => state.items);
|
||||||
|
|
||||||
|
const guestItemCount = useMemo(
|
||||||
|
() => Object.values(localItems).reduce((sum, item) => sum + (item?.quantity ?? 0), 0),
|
||||||
|
[localItems],
|
||||||
|
);
|
||||||
|
const cartItemCount = isSuccess ? (cartData?.data?.totalItems ?? 0) : guestItemCount;
|
||||||
|
|
||||||
const isHomeActive = pathname === `/${name}`;
|
const isHomeActive = pathname === `/${name}`;
|
||||||
const isFavoriteActive = pathname.startsWith(`/${name}/favorite`);
|
const isFavoriteActive = pathname.startsWith(`/${name}/favorite`);
|
||||||
@@ -70,7 +91,7 @@ function BottomNavBar({ onPagerClick }: BottomNavBarProps) {
|
|||||||
<NavItem href={`/${name}/favorite`} isActive={isFavoriteActive} onClick={handleFavoritesClick} Icon={Heart} />
|
<NavItem href={`/${name}/favorite`} isActive={isFavoriteActive} onClick={handleFavoritesClick} Icon={Heart} />
|
||||||
{onPagerClick ? <NavItem isActive={isPagerActive} onButtonClick={onPagerClick} Icon={Reserve} /> : <NavItem href={`/${name}/pager`} isActive={isPagerActive} Icon={Reserve} />}
|
{onPagerClick ? <NavItem isActive={isPagerActive} onButtonClick={onPagerClick} Icon={Reserve} /> : <NavItem href={`/${name}/pager`} isActive={isPagerActive} Icon={Reserve} />}
|
||||||
<NavItem href={`/${name}/about`} isActive={isAboutActive} Icon={InfoCircle} />
|
<NavItem href={`/${name}/about`} isActive={isAboutActive} Icon={InfoCircle} />
|
||||||
<NavItem href={`/${name}/cart`} isActive={isCartActive} Icon={Bag2} />
|
<NavItem href={`/${name}/cart`} isActive={isCartActive} Icon={Bag2} badge={cartItemCount} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user