WebArena-ShopSmart / components /mobile-navigation.tsx
Jack
Initial release
1067b6f
"use client";
import { useState } from "react";
import { Menu } from "lucide-react";
import { routes } from "@/lib/routes";
import Link from "next/link";
import {
Sheet,
SheetContent,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@/components/ui/sheet";
import { ProductSearch } from "./storefront/product-search";
import { ProductImage } from "./product-image";
import { images } from "@/lib/assets";
import { Button } from "./ui/button";
import { useRouter } from "next/navigation";
export const MobileNavigation = () => {
const [isMobileNavOpen, setIsMobileNavOpen] = useState(false);
return (
<>
<Sheet
open={isMobileNavOpen}
onOpenChange={() => setIsMobileNavOpen((prev) => !prev)}
>
<SheetTrigger>
<div className="p-2 rounded-md border border-border">
<Menu />
</div>
</SheetTrigger>
<SheetContent
size="full"
className="overflow-auto lg:max-w-[600px] sm:max-w-[400px] xl:max-w-[650px]"
>
<SheetHeader>
<SheetTitle>Menu</SheetTitle>
</SheetHeader>
<div className="my-6">
<ProductSearch />
</div>
<div className="flex items-start justify-center gap-2 flex-col">
<NavBarLink
image={images[0]}
href={routes.products}
name="Products"
setIsMobileNavOpen={setIsMobileNavOpen}
/>
<NavBarLink
image={images[1]}
href={routes.account}
name="Account"
setIsMobileNavOpen={setIsMobileNavOpen}
/>
</div>
</SheetContent>
</Sheet>
</>
);
};
const NavBarLink = (props: {
href: string;
name: string;
image: string;
setIsMobileNavOpen: React.Dispatch<React.SetStateAction<boolean>>;
}) => {
const router = useRouter();
return (
<div className="flex gap-2 items-center justify-between w-full rounded-md border border-border">
<ProductImage
alt="products"
src={props.image}
sizes="50px"
height="h-14"
width="w-14"
/>
<div className="w-full text-left">
<Button
variant="link"
onClick={() => {
router.push(props.href);
props.setIsMobileNavOpen(false);
}}
>
{props.name}
</Button>
</div>
</div>
);
};