import React, { useState } from "react"; import Typography from "../typography/typography"; import Avatar from "../avatar/avatar"; import Menu, { MenuProps, ItemProps, Item } from "./menu"; import UserProfile from "../user-profile/user-profile"; import SearchBar from "./search-bar"; import { Icon } from "../icon"; type MenuItemType = (MenuProps | ItemProps) & { type?: "menu" | "item"; }; const menuSubItems: MenuItemType[] = [ { id: "overview", title: "Overview", icon: "activity" }, { id: "notifications", title: "Notifications", icon: "notification-box", }, { id: "analytics", title: "Analytics", icon: "bar-line-chart" }, { id: "saved-reports", title: "Saved reports", icon: "star-01" }, { id: "scheduled-reports", title: "Scheduled reports", icon: "clock-fast-forward", }, { id: "user-reports", title: "User reports", icon: "user-square" }, { id: "manage-notifications", title: "Manage Notifications", icon: "settings-03", }, ]; const menuItems: MenuItemType[] = [ { id: "home", title: "Home", icon: "home-line", items: menuSubItems, type: "menu", }, { id: "opportunities", title: "Opportunities", icon: "lightbulb-03", items: menuSubItems, type: "menu", }, { id: "templates", title: "Templates", icon: "file-07", items: menuSubItems, type: "menu", }, { id: "reports", title: "Reports", icon: "pie-chart-03", items: menuSubItems, type: "menu", }, { id: "insights", title: "Insights", icon: "eye", items: menuSubItems, type: "menu", }, { id: "enablement", title: "Enablement", icon: "check-circle", items: menuSubItems, type: "menu", }, ]; const bottomMenuItems: MenuItemType[] = [ { id: "support", title: "Support", icon: "life-buoy-01", }, { id: "company-settings", title: "Company Settings", icon: "settings-01", }, ]; export const SideBar = () => { const [openUserSettings, setOpenUserSettings] = useState(false); const [selectedPath, setSelectedPath] = useState([]); const [selectedItemId, selectedSubItemId] = selectedPath; const renderMenuItems = (menuItems: MenuItemType[]) => menuItems.map(({ type, id, onClick, ...props }) => { const isOpenAlready = selectedItemId === id; const onClickHandler: React.MouseEventHandler = event => { setSelectedPath(isOpenAlready ? [] : [id]); onClick?.(event); }; return type === "menu" ? ( ({ id: itemId, onClick: event => { setSelectedPath([id, itemId]); onItemClick?.(event); }, selected: itemId === selectedSubItemId, ...restItemProps, }) )} /> ) : ( ); }); const renderIconMenuItems = (menuItems: MenuItemType[]) => menuItems.map(({ id, onClick, icon }) => { const isOpenAlready = selectedItemId === id; const onClickHandler: React.MouseEventHandler = event => { setSelectedPath(isOpenAlready ? [] : [id]); onClick?.(event); }; return icon ? (
) : null; }); const selectedMenu = [...menuItems, ...bottomMenuItems].find( ({ id, type = "item" }) => id === selectedItemId && type === "menu" ) as MenuProps; const userProfileRightIcon = openUserSettings ? ( ) : ( ); const sideBarClasses = "h-full border border-gray-200 bg-white px-4 pt-6 pb-4 overflow-auto"; return (
{/* DESKTOP VIEW */}
{renderMenuItems(menuItems)}
{renderMenuItems(bottomMenuItems)}
setOpenUserSettings(prev => !prev)} >
{userProfileRightIcon}
{/* DESKTOP VIEW */} {/* TABLET VIEW */}
{renderIconMenuItems(menuItems)}
{renderIconMenuItems(bottomMenuItems)}
setOpenUserSettings(prev => !prev)} >
{selectedMenu && (
Dashboard
{selectedMenu.items?.map( ({ id, onClick, ...restProps }) => { const isSelected = id === selectedSubItemId; return ( { setSelectedPath( isSelected ? [] : [selectedMenu.id, id] ); onClick?.(event); }} selected={isSelected} {...restProps} /> ); } )}
setOpenUserSettings(prev => !prev)} >
{userProfileRightIcon}
)}
{/* TABLET VIEW */} {openUserSettings && (
)}
); }; export default SideBar;