// GuinchoFlow — Layout (Sidebar + Topbar)
const NAV_ITEMS = [
{ id: 'dashboard', label: 'Dashboard', icon: 'home' },
{ id: 'assistencias', label: 'Assistências', icon: 'truck' },
{ id: 'vistoria', label: 'Vistoria Digital', icon: 'search' },
{ id: 'frota', label: 'Frota de Guinchos',icon: 'wrench' },
{ id: 'motoristas', label: 'Motoristas', icon: 'users' },
{ id: 'seguradoras', label: 'Seguradoras', icon: 'shield' },
{ id: 'financeiro', label: 'Financeiro', icon: 'dollar' },
{ id: 'relatorios', label: 'Relatórios', icon: 'fileText' },
{ id: 'configuracoes',label: 'Configurações', icon: 'settings' },
];
const Sidebar = ({ active, onNav, collapsed, onToggle, session, onLogout }) => {
const [hov, setHov] = React.useState(null);
const [userInfo, setUserInfo] = React.useState(null);
React.useEffect(() => {
if (!session?.user) { setUserInfo(null); return; }
db.one('usuarios', session.user.id).then(u => setUserInfo(u));
}, [session?.user?.id]);
const userNome = userInfo?.nome || session?.user?.email?.split('@')[0] || 'Usuário';
const userCargo = userInfo?.cargo || '—';
const userInits = userNome.split(' ').map(w => w[0]).join('').slice(0, 2).toUpperCase();
return (
);
};
const BREADCRUMBS = {
dashboard: ['Dashboard'],
assistencias: ['Assistências'],
vistoria: ['Vistoria Digital'],
frota: ['Frota de Guinchos'],
motoristas: ['Cadastros', 'Motoristas'],
seguradoras: ['Cadastros', 'Seguradoras'],
financeiro: ['Financeiro'],
relatorios: ['Relatórios'],
configuracoes: ['Configurações'],
};
const Topbar = ({ active, onMenuToggle, isMobile, onNav, session }) => {
const [searchOpen, setSearchOpen] = React.useState(false);
const [searchVal, setSearchVal] = React.useState('');
const [notifOpen, setNotifOpen] = React.useState(false);
const [alerts, setAlerts] = React.useState([]);
const crumbs = BREADCRUMBS[active] || ['Dashboard'];
React.useEffect(() => {
if (!notifOpen) return;
(async () => {
const abertas = await db.list('assistencias', { eq: { status: 'aberta' } });
const manut = await db.list('frota', { eq: { status: 'manutencao' } });
const list = [
...abertas.slice(0, 3).map(a => ({ id: 'a' + a.id, type: 'danger', msg: `Assistência ${a.numero || '#' + a.id} aberta`, link: 'assistencias' })),
...manut.slice(0, 2).map(g => ({ id: 'f' + g.id, type: 'warning', msg: `Guincho ${g.code} (${g.placa}) em manutenção`, link: 'frota' })),
];
setAlerts(list);
})();
}, [notifOpen]);
const userEmail = session?.user?.email || '';
const userInits = userEmail.split('@')[0].slice(0, 2).toUpperCase() || 'U';
const userShort = userEmail.split('@')[0];
return (