| import React from "react"; | |
| import { User, SquarePen, X, PanelLeftClose, ChefHat } from "lucide-react"; | |
| import { useRouter } from "next/navigation"; | |
| import RecentChats from "./RecentChats"; | |
| import { TABLET_BREAKPOINT } from "@/constants/chat"; | |
| interface SidebarProps { | |
| isOpen: boolean; | |
| toggleSidebar?: () => void; | |
| } | |
| const Sidebar = ({ isOpen, toggleSidebar = () => {} }: SidebarProps) => { | |
| const router = useRouter(); | |
| const handleNewChat = () => { | |
| router.push(`/`); | |
| if ( | |
| typeof window !== "undefined" && | |
| window.innerWidth < TABLET_BREAKPOINT && | |
| toggleSidebar | |
| ) { | |
| toggleSidebar(); | |
| } | |
| }; | |
| return ( | |
| <> | |
| {/* Overlay for mobile sidebar */} | |
| {isOpen && ( | |
| <div | |
| className="fixed inset-0 bg-neutral-950 opacity-50 z-40 md:hidden" | |
| onClick={toggleSidebar} | |
| ></div> | |
| )} | |
| <aside | |
| className={`bg-primary-600 shadow-md h-full fixed inset-y-0 left-0 z-50 transform transition-all duration-300 ease-in-out | |
| md:static md:block md:transform-none md:translate-none md:z-auto | |
| ${isOpen ? "translate-x-0 w-64" : "-translate-x-full w-20"}`} | |
| > | |
| <div className="flex flex-col h-full justify-between"> | |
| <div className="px-4"> | |
| <div className="flex items-center justify-between py-3"> | |
| {isOpen && ( | |
| <div className="bg-secondary-100 p-2.5 rounded-2xl"> | |
| <ChefHat size={20} className="text-primary-600" /> | |
| </div> | |
| )} | |
| <button | |
| className="text-grey-200 hover:text-grey-300 cursor-pointer px-2" | |
| onClick={toggleSidebar} | |
| > | |
| <PanelLeftClose className="hidden md:block" /> | |
| <X className="md:hidden" /> | |
| </button> | |
| </div> | |
| <nav className="flex-1 py-4"> | |
| <button | |
| onClick={handleNewChat} | |
| className={`flex items-center text-secondary-100 hover:bg-primary-500 transition-colors rounded-lg cursor-pointer | |
| ${isOpen ? "gap-3 ps-2 py-3 w-full" : "w-fit p-2"}`} | |
| > | |
| <SquarePen size={20} className="text-secondary-100" /> | |
| {isOpen && <span>New Chat</span>} | |
| </button> | |
| {isOpen && ( | |
| <div className="ps-2 py-2 text-sm font-semibold text-grey-200"> | |
| Recent Chats | |
| </div> | |
| )} | |
| {isOpen && <RecentChats toggleSidebar={toggleSidebar} />} | |
| </nav> | |
| </div> | |
| <div className="p-4 border-t border-tertiary-400 md:hidden"> | |
| <div className="flex items-center"> | |
| <div className="w-8 h-8 rounded-full bg-secondary-100 flex items-center justify-center"> | |
| <User size={16} className="text-primary-700" /> | |
| </div> | |
| <span className="ml-2 text-grey-200 font-medium">User Name</span> | |
| </div> | |
| </div> | |
| </div> | |
| </aside> | |
| </> | |
| ); | |
| }; | |
| export default Sidebar; | |