index.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { Text } from "@contentful/f36-components";
  2. import { useMenu } from "@/contexts/MenuContext";
  3. import { useNavigate, useLocation } from "react-router-dom";
  4. import type { JeecgMenu } from "@/types/menu";
  5. import styles from "./index.module.css";
  6. interface SidebarItemProps {
  7. menu: JeecgMenu;
  8. active?: boolean;
  9. onClick?: () => void;
  10. }
  11. function SidebarItem({ menu, active, onClick }: SidebarItemProps) {
  12. return (
  13. <div
  14. className={`${styles.menuItem} ${active ? styles.menuItemActive : ""}`}
  15. onClick={onClick}
  16. >
  17. <Text>{menu.meta?.title || menu.name}</Text>
  18. </div>
  19. );
  20. }
  21. export default function Sidebar() {
  22. const { activeFirstMenu, activeSecondMenu, setActiveSecondMenu } = useMenu();
  23. const navigate = useNavigate();
  24. const location = useLocation();
  25. if (!activeFirstMenu || !activeFirstMenu.children || activeFirstMenu.children.length === 0) {
  26. return null;
  27. }
  28. const secondMenus = activeFirstMenu.children.filter((menu) => !menu.hidden && !menu.meta?.hideMenu);
  29. const handleMenuClick = (menu: JeecgMenu) => {
  30. console.log("Sidebar: Clicked menu", menu.name, menu.path);
  31. setActiveSecondMenu(menu);
  32. const menuPath = menu.path || "";
  33. navigate(menuPath);
  34. };
  35. return (
  36. <aside className={styles.sidebar}>
  37. {secondMenus.map((menu) => {
  38. const menuPath = menu.path || "";
  39. const isActive = location.pathname === menuPath || activeSecondMenu?.id === menu.id;
  40. return (
  41. <SidebarItem
  42. key={menu.id}
  43. menu={menu}
  44. active={isActive}
  45. onClick={() => handleMenuClick(menu)}
  46. />
  47. );
  48. })}
  49. </aside>
  50. );
  51. }