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-manutencao', label: 'Manutenção', path: '/plataforma/prafrot/manutencao', icon: Wrench }, { id: 'g-sinistros', label: 'Sinistros', path: '/plataforma/prafrot/sinistros', icon: AlertTriangle } ] } ]; export const PrafrotSidebar = ({ isCollapsed, onToggle }) => { const [searchTerm, setSearchTerm] = useState(''); const [expandedItems, setExpandedItems] = useState({ cadastros: true, gerencia: true }); const location = useLocation(); const { user, logout } = useAuthContext(); const toggleExpand = (id) => { setExpandedItems(prev => ({ ...prev, [id]: !prev[id] })); }; const filteredItems = useMemo(() => { if (!searchTerm) return MENU_ITEMS; return MENU_ITEMS.filter(item => { const matchParent = item.label.toLowerCase().includes(searchTerm.toLowerCase()); const matchChildren = item.children?.some(child => child.label.toLowerCase().includes(searchTerm.toLowerCase()) ); return matchParent || matchChildren; }); }, [searchTerm]); const handleLogout = () => { logout(); window.location.href = '/plataforma/prafrot/login'; }; const MenuItem = ({ item, isSub = false }) => { const Icon = item.icon; const hasChildren = item.children && item.children.length > 0; const isExpanded = expandedItems[item.id]; const isActive = location.pathname.startsWith(item.path) || (hasChildren && item.children.some(c => location.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 = (
{ if (isLocked) return; if (hasChildren) toggleExpand(item.id); }} title={isLocked ? item.disabledReason : (isCollapsed ? item.label : '')} > {(!isCollapsed || isSub) && {item.label}} {hasChildren && !isCollapsed && ( )} {isLocked && !isCollapsed && ( )}
); return (
{item.path && !hasChildren && !isLocked ? ( {content} ) : content} {hasChildren && isExpanded && !isCollapsed && ( {subItems.map(child => ( ))} )}
); }; return ( ); };