import React, { useState, useEffect, useContext } from 'react'; import Typography from '@mui/material/Typography'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import Box from '@mui/material/Box'; import CircularProgress from '@mui/material/CircularProgress'; import { Link as RouterLink } from 'react-router-dom'; import LegalPage from './LegalPage.js'; import SocketContext from '../contexts/SocketContext.js'; // Helper function to recursively collect all categories from the tree const collectAllCategories = (categoryNode, categories = [], level = 0) => { if (!categoryNode) return categories; // Add current category (skip root category 209) if (categoryNode.id !== 209 && categoryNode.seoName) { categories.push({ id: categoryNode.id, name: categoryNode.name, seoName: categoryNode.seoName, level: level }); } // Recursively add children if (categoryNode.children) { for (const child of categoryNode.children) { collectAllCategories(child, categories, level + 1); } } return categories; }; const Sitemap = () => { const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); const socket = useContext(SocketContext); const sitemapLinks = [ { title: 'Startseite', url: '/' }, { title: 'Mein Profil', url: '/profile' }, { title: 'Datenschutz', url: '/datenschutz' }, { title: 'AGB', url: '/agb' }, { title: 'Impressum', url: '/impressum' }, { title: 'Batteriegesetzhinweise', url: '/batteriegesetzhinweise' }, { title: 'Widerrufsrecht', url: '/widerrufsrecht' }, { title: 'Growbox Konfigurator', url: '/Konfigurator' }, { title: 'API', url: '/api/', route:false }, ]; useEffect(() => { const fetchCategories = () => { // Try cache first if (window.productCache && window.productCache['categoryTree_209']) { const cached = window.productCache['categoryTree_209']; const cacheAge = Date.now() - cached.timestamp; const tenMinutes = 10 * 60 * 1000; if (cacheAge < tenMinutes && cached.categoryTree) { const allCategories = collectAllCategories(cached.categoryTree); setCategories(allCategories); setLoading(false); return; } } // Otherwise, fetch from socket if available if (socket) { socket.emit('categoryList', { categoryId: 209 }, (response) => { if (response && response.categoryTree) { // Store in cache try { if (!window.productCache) window.productCache = {}; window.productCache['categoryTree_209'] = { categoryTree: response.categoryTree, timestamp: Date.now() }; } catch (err) { console.error('Error caching category data:', err); } const allCategories = collectAllCategories(response.categoryTree); setCategories(allCategories); setLoading(false); } else { console.error('Failed to fetch categories'); setLoading(false); } }); } else { setLoading(false); } }; fetchCategories(); }, [socket]); const content = ( <> Hier finden Sie eine Übersicht aller verfügbaren Seiten unserer Website. {/* @note Static site links */} Seiten {sitemapLinks.map((link) => ( ))} {/* @note Category links */} Kategorien {loading ? ( ) : ( {categories.map((category) => ( ))} )} ); return ; }; export default Sitemap;