'use client'; import { FC, useState, useEffect } from "react"; import { MenuProps } from "@/validations/mutual/dashboard/props"; import { langGetKey } from "@/lib/langGet"; import { parseURlFormString } from "@/lib/menuGet"; import FirstLayerDropdown from "./firstLayerComponent"; import SecondLayerDropdown from "./secondLayerComponent"; import ThirdLayerDropdown from "./thirdLayerComponent"; // Define types for menu structure type ThirdLayerItem = Record; type SecondLayerItems = Record; type FirstLayerItems = Record; type MenuStructure = FirstLayerItems; const MenuComponent: FC = ({ lang, menuItems, menuTranslationsFlatten, activePageUrl }) => { // State for tracking expanded menu items const [expandedFirstLayer, setExpandedFirstLayer] = useState(null); const [expandedSecondLayer, setExpandedSecondLayer] = useState(null); const [menuStructure, setMenuStructure] = useState({}); // Parse active URL to determine which menu items should be active const activePathLayers = parseURlFormString(activePageUrl).data; const activeFirstLayer = activePathLayers[0] || null; const activeSecondLayer = activePathLayers[1] || null; const activeThirdLayer = activePathLayers[2] || null; // Initialize expanded state based on active path useEffect(() => { if (activeFirstLayer) { setExpandedFirstLayer(activeFirstLayer); if (activeSecondLayer) { setExpandedSecondLayer(activeSecondLayer); } } }, [activeFirstLayer, activeSecondLayer]); // Process menu items into a hierarchical structure useEffect(() => { const processedStructure: MenuStructure = {}; Object.entries(menuItems).forEach(([path, _]: [string, any]) => { const layers = parseURlFormString(path).data; const firstLayer = layers[0]; const secondLayer = layers[1]; const thirdLayer = layers[2]; // Create first layer if it doesn't exist if (!processedStructure[firstLayer]) { processedStructure[firstLayer] = {}; } // Create second layer if it doesn't exist if (!processedStructure[firstLayer][secondLayer]) { processedStructure[firstLayer][secondLayer] = {}; } // Add third layer processedStructure[firstLayer][secondLayer][thirdLayer] = {}; }); setMenuStructure(processedStructure); }, [menuItems]); // Handle click on first layer menu item const handleFirstLayerClick = (key: string) => { if (expandedFirstLayer === key) { // If already expanded, collapse it setExpandedFirstLayer(null); setExpandedSecondLayer(null); } else { // Otherwise expand it setExpandedFirstLayer(key); setExpandedSecondLayer(null); } }; // Handle click on second layer menu item const handleSecondLayerClick = (key: string) => { if (expandedSecondLayer === key) { // If already expanded, collapse it setExpandedSecondLayer(null); } else { // Otherwise expand it setExpandedSecondLayer(key); } }; // Render third layer menu items const renderThirdLayerItems = (firstLayerKey: string, secondLayerKey: string, thirdLayerItems: ThirdLayerItem) => { const baseUrl = `/${firstLayerKey}/${secondLayerKey}`; return Object.keys(thirdLayerItems).map(thirdLayerKey => { const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey && activeThirdLayer === thirdLayerKey; const url = `/${lang}${baseUrl}/${thirdLayerKey}`; return (
); }); }; // Render second layer menu items const renderSecondLayerItems = (firstLayerKey: string, secondLayerItems: SecondLayerItems) => { return Object.entries(secondLayerItems).map(([secondLayerKey, thirdLayerItems]) => { const isActive = activeFirstLayer === firstLayerKey && activeSecondLayer === secondLayerKey; const isExpanded = expandedSecondLayer === secondLayerKey; return (
handleSecondLayerClick(secondLayerKey)} /> {isExpanded && (
{renderThirdLayerItems(firstLayerKey, secondLayerKey, thirdLayerItems)}
)}
); }); }; // Render first layer menu items const renderFirstLayerItems = () => { return Object.entries(menuStructure).map(([firstLayerKey, secondLayerItems]) => { const isActive = activeFirstLayer === firstLayerKey; const isExpanded = expandedFirstLayer === firstLayerKey; return (
handleFirstLayerClick(firstLayerKey)} /> {isExpanded && (
{renderSecondLayerItems(firstLayerKey, secondLayerItems)}
)}
); }); }; return (
{renderFirstLayerItems()}
); }; export default MenuComponent;