import React, { useState, useMemo } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { ChevronLeft, ChevronRight, Search, ChevronDown, LayoutDashboard, Car, Users, Wrench, Activity, Radio, AlertTriangle, Store, ClipboardList, LogOut, ShieldAlert, Building2, Award, GitBranch, Lock } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useAuthContext } from '@/components/shared/AuthProvider'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import './PrafrotSidebar.css'; const MENU_ITEMS = [ { id: 'dashboard', label: 'Estatísticas', icon: LayoutDashboard, path: '/plataforma/prafrot/estatisticas' }, { id: 'cadastros', label: 'Cadastros', icon: ClipboardList, children: [ { id: 'c-veiculos', label: 'Veículos', path: '/plataforma/prafrot/veiculos', icon: Car }, { id: 'c-dispatcher', label: 'Dispatcher', path: '/plataforma/prafrot/dispatcher', icon: ClipboardList }, // { id: 'c-motoristas', label: 'Motoristas', path: '/plataforma/prafrot/motoristas', icon: Users, disabled: true, disabledReason: 'Funcionalidade em manutenção' }, { id: 'c-oficinas', label: 'Oficinas', path: '/plataforma/prafrot/oficinas', icon: Store } ] }, { id: 'gerencia', label: 'Gerência', icon: Activity, children: [ { id: 'g-monitoramento', label: 'Monitoramento', path: '/plataforma/prafrot/monitoramento', icon: Radio }, { id: 'g-status', label: 'Status Frota', path: '/plataforma/prafrot/status', icon: Activity }, { id: 'g-manutencao', label: 'Manutenção', path: '/plataforma/prafrot/manutencao', icon: Wrench }, { id: 'g-sinistros', label: 'Sinistros', path: '/plataforma/prafrot/sinistros', icon: AlertTriangle } ] } ]; // Optimized MenuItem component outside main render loop const MenuItem = React.memo(({ item, isSub = false, isCollapsed, expandedItems, toggleExpand, pathname, searchTerm }) => { const Icon = item.icon; const hasChildren = item.children && item.children.length > 0; const isExpanded = expandedItems[item.id]; const isActive = pathname.startsWith(item.path) || (hasChildren && item.children.some(c => pathname.startsWith(c.path))); const isLocked = item.disabled; // Filter sub-items if searching const subItems = item.children?.filter(child => !searchTerm || child.label.toLowerCase().includes(searchTerm.toLowerCase()) ); const content = (