import React, { useState, useEffect, useRef } from 'react'; import { LayoutDashboard, Users, KanbanSquare, FileText, Briefcase, UserCircle, Calendar, Bell, Menu, X, ArrowDownCircle, ArrowUpCircle, LogOut, Settings, ChevronDown, Search, ChevronRight, Building2, ScrollText } from 'lucide-react'; import { ViewState } from './types'; import { ComFiProvider, useComFi } from './contexts/ComFiContext'; import { ToastProvider } from './contexts/ToastContext'; import { DashboardView } from './components/DashboardView'; import { FinancialReportsView } from './components/FinancialReportsView'; import { CRMView } from './components/CRMView'; import { CalendarView } from './components/CalendarView'; import { KanbanView } from './components/KanbanView'; import { ManagementView } from './components/ManagementView'; import { AccountsPayableView } from './components/AccountsPayableView'; import { AccountsReceivableView } from './components/AccountsReceivableView'; import { UserManagementView } from './components/UserManagementView'; import { SettingsView } from './components/SettingsView'; import { AIChatAssistant } from './components/AIChatAssistant'; import { ProposalsView } from './components/ProposalsView'; // --- COMPONENTS HELPERS --- interface SidebarItemProps { icon: any; label: string; active: boolean; onClick: () => void; collapsed?: boolean; } const SidebarItem: React.FC = ({ icon: Icon, label, active, onClick, collapsed = false }) => ( ); const MainContent: React.FC = () => { const { currentUser, setCurrentUser, users, setUsers, companies, setCompanies, services, setServices, expenses, setExpenses, receivables, setReceivables, clients, setClients, financialSummary, addReceivable } = useComFi(); const [currentView, setCurrentView] = useState('dashboard'); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [isUserMenuOpen, setIsUserMenuOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [isSearchOpen, setIsSearchOpen] = useState(false); const searchRef = useRef(null); const userMenuRef = useRef(null); const toggleMobileMenu = () => setIsMobileMenuOpen(!isMobileMenuOpen); // Search Logic useEffect(() => { if (!searchQuery.trim()) { setSearchResults([]); return; } const query = searchQuery.toLowerCase(); const results: any[] = []; companies.forEach(c => { if (c.name.toLowerCase().includes(query) || c.fantasyName?.toLowerCase().includes(query)) results.push({ id: c.id, type: 'client', title: c.fantasyName || c.name, subtitle: c.email, detail: 'Cliente', targetView: 'crm' }); }); services.forEach(s => { if (s.name.toLowerCase().includes(query)) results.push({ id: s.id, type: 'service', title: s.name, subtitle: `R$ ${s.price}`, detail: s.category, targetView: 'services' }); }); setSearchResults(results); }, [searchQuery, companies, services]); // Click Outside Handlers useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (searchRef.current && !searchRef.current.contains(event.target as Node)) setIsSearchOpen(false); if (userMenuRef.current && !userMenuRef.current.contains(event.target as Node)) setIsUserMenuOpen(false); }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const menuItems: { id: ViewState, label: string, icon: any }[] = [ { id: 'dashboard', label: 'Dashboard', icon: LayoutDashboard }, { id: 'crm', label: 'Clientes (CRM)', icon: Users }, { id: 'proposals', label: 'Propostas', icon: ScrollText }, { id: 'services', label: 'Serviços', icon: Briefcase }, { id: 'receivables', label: 'Contas a Receber', icon: ArrowUpCircle }, { id: 'payables', label: 'Contas a Pagar', icon: ArrowDownCircle }, { id: 'kanban', label: 'Kanban', icon: KanbanSquare }, { id: 'invoicing', label: 'Faturamento', icon: FileText }, { id: 'calendar', label: 'Agenda', icon: Calendar }, ]; const allowedMenuItems = menuItems.filter(item => currentUser.role === 'super_admin' || currentUser.permissions.includes(item.id)); const getPageTitle = (view: ViewState) => { if (view === 'user') return 'Gestão de Usuários'; if (view === 'settings') return 'Configurações'; return menuItems.find(i => i.id === view)?.label || 'Dashboard'; }; return (
{/* Sidebar */} {/* Main Area */}
{ setSearchQuery(e.target.value); setIsSearchOpen(true); }} onFocus={() => setIsSearchOpen(true)} placeholder="Pesquisar..." className="w-full pl-10 pr-4 py-2.5 bg-slate-50 border-none rounded-xl text-sm focus:ring-2 focus:ring-orange-200 outline-none text-slate-600 transition-all placeholder:text-slate-400" /> {isSearchOpen && searchQuery.length > 0 && (
{searchResults.map(r => (
{setCurrentView(r.targetView); setIsSearchOpen(false);}} className="px-4 py-3 hover:bg-slate-50 cursor-pointer flex items-center gap-3 border-b border-slate-50 last:border-0">
{r.title}
{r.subtitle}
))}
)}
setIsUserMenuOpen(!isUserMenuOpen)}>
{currentUser.name}
{currentUser.role === 'super_admin' ? 'Administrator' : 'User'}
User
{isUserMenuOpen && (

{currentUser.name}

{currentUser.email}

{users.map(u => ())}
)}

{getPageTitle(currentView)}

Bem-vindo ao ComFi Dashboard.

{(() => { const hasAccess = currentUser.role === 'super_admin' || currentUser.permissions.includes(currentView) || currentView === 'settings'; if (!hasAccess && currentView !== 'dashboard' && currentView !== 'user') return

Acesso Restrito

; switch(currentView) { case 'dashboard': return ; case 'crm': return ; case 'proposals': return ; case 'services': return ; case 'receivables': return ; case 'payables': return ; case 'calendar': return ; case 'kanban': return ; case 'invoicing': return ; case 'user': return currentUser.role === 'super_admin' ? : null; case 'settings': return ; default: return
Em desenvolvimento.
; } })()}
{/* Mobile Menu */} {isMobileMenuOpen && (

ComFi.

{allowedMenuItems.map((item) => ( {setCurrentView(item.id); toggleMobileMenu();}} />))} {setCurrentView('settings'); toggleMobileMenu();}} /> {currentUser.role === 'super_admin' && {setCurrentView('user'); toggleMobileMenu();}} />}
)}
); }; const App: React.FC = () => { return ( ); }; export default App;