import React, {useState} from "react"; import { Divider, Flex, HStack, Image, Input, InputGroup, InputLeftElement, InputRightElement, Stack, Text } from "@chakra-ui/react"; import {useNavigate} from "react-router-dom"; import {Search2Icon} from "@chakra-ui/icons"; import {snakeCase} from "change-case"; interface SidebarMenuItem { label: string, icon?: string, path: string, } interface SidebarMenuSection { label?: string, menuItems: SidebarMenuItem[] } interface SidebarProps { componentName?: string, menuItemSections: SidebarMenuSection[], dividerStyles?: { color?: string, thickness?: string }, logoIcon?: string, primaryColor?: string, secondaryColor?: string, activeItemBG?: string, activeItemColor?: string, showLogoBG?: boolean, logoBgColor?: string, navItemFontSize?: string, logoSize?: number, sideBarPaddingX?: string, sideBarPaddingY?: string, menuItemsPaddingX?: string, menuItemsPaddingY?: string, menuItemsCornerRadius?: string, //search input props isSearchInput?: boolean, searchInputBg?: string, searchIconColor?: string, searchIconPosition?: string, } function Sidebar(props: SidebarProps) { const { menuItemSections, dividerStyles = {color: "#ffffff", thickness: "2px"}, logoIcon = "https://socialimpact.com/wp-content/uploads/2021/03/logo-placeholder.jpg", primaryColor = "#051E61", secondaryColor = "#ffffff", activeItemBG = "white", activeItemColor = "black", showLogoBG = false, logoBgColor = primaryColor, navItemFontSize = "18px", logoSize = 80, menuItemsPaddingX = "32px", menuItemsCornerRadius = "8px", menuItemsPaddingY = "15px", sideBarPaddingX = "8px", sideBarPaddingY = "8px", searchInputBg = "rgba(0, 0, 0, 0.03)", searchIconColor = "rgba(0, 0, 0, 0.3)", searchIconPosition = "left", isSearchInput = false } = props; const isActive = (path: string) => { return (window.location.pathname.substring(1) || "/") === snakeCase(path); }; let navigate = useNavigate(); const [filterText, setFilterText] = useState(''); const onClick = (path: string) => { navigate(`/${snakeCase(path)}`); } let searchItem: any; if (isSearchInput) { searchItem = ( setFilterText(e.target.value)} placeholder='Search' px={menuItemsPaddingX} py={menuItemsPaddingY} borderRadius={menuItemsCornerRadius} /> ) } return ( {searchItem} {menuItemSections?.map((section: any, sectionIndex: number) => ( {section?.menuItems?.map((item: any, index: number) => ( onClick(item.path)} isActive={isActive(item.path)} secondaryColor={secondaryColor} primaryColor={primaryColor} navItemFontSize={navItemFontSize} menuItemsPaddingX={menuItemsPaddingX} menuItemsPaddingY={menuItemsPaddingY} menuItemsCornerRadius={menuItemsCornerRadius} activeItemBG={activeItemBG} activeItemColor={activeItemColor} /> )) } ))} ); } function SidebarItem(props: any) { const { title, icon, onClick, menuItemsCornerRadius, isActive, secondaryColor, menuItemsPaddingY, navItemFontSize, primaryColor, menuItemsPaddingX, activeItemBG, activeItemColor } = props; let iconEl: any; if (icon) { iconEl = } return ( {iconEl} {title} ); } export default Sidebar;