import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faBook, faPlus, faFileImport, faCompass, faExchangeAlt, faCalendar, faClockRotateLeft, faCog, faDesktop, faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons'; export function Sidebar({ isOpen, onClose, onAddMangaClick }) { const [expandedMenus, setExpandedMenus] = useState({ mangas: true, // Par défaut, le menu Mangas est ouvert settings: false, system: false }); const menuItems = [ { icon: faBook, text: 'Mangas', id: 'mangas', subItems: [ { icon: faPlus, text: 'Ajouter un nouveau', onClick: () => onAddMangaClick() }, { icon: faFileImport, text: 'Import bibliothèque', to: '/import' }, { icon: faCompass, text: 'Découvrir', to: '/discover' }, ] }, { icon: faExchangeAlt, text: 'Convertir CBR en CBZ', to: '/convert' }, { icon: faCalendar, text: 'Calendrier', to: '/calendar' }, { icon: faClockRotateLeft, text: 'Activité', to: '/activity', badge: '3' }, { icon: faCog, text: 'Paramètres', id: 'settings', subItems: [ { text: 'Général', to: '/settings/general' }, { text: 'Dossiers', to: '/settings/folders' }, { text: 'Scrappers', to: '/settings/scrappers' }, { text: 'UI', to: '/settings/ui' } ] }, { icon: faDesktop, text: 'Système', id: 'system', subItems: [ { text: 'Status', to: '/system/status' }, { text: 'Backup', to: '/system/backup' }, { text: 'Logs', to: '/system/logs' }, { text: 'Updates', to: '/system/updates' } ] }, ]; const toggleMenu = (menuId) => { setExpandedMenus(prev => ({ ...prev, [menuId]: !prev[menuId] })); }; const MenuItem = ({ item }) => { const hasSubItems = item.subItems && item.subItems.length > 0; const isExpanded = item.id ? expandedMenus[item.id] : false; const handleClick = (e) => { if (hasSubItems) { e.preventDefault(); toggleMenu(item.id); } }; const renderLink = (linkItem, className) => { if (linkItem.onClick) { return ( ); } return ( {linkItem.icon && } {linkItem.text} ); }; return (
{item.to || item.onClick ? ( renderLink(item, "flex items-center px-4 py-2 text-gray-300 hover:text-green-600 transition-colors duration-150") ) : ( )} {hasSubItems && isExpanded && (
{item.subItems.map((subItem, index) => { const link = renderLink( subItem, "block py-2 text-gray-300 hover:text-green-600 transition-colors duration-150" ); return React.cloneElement(link, { key: `${subItem.text}-${index}` }); })}
)}
); }; return ( ); }