import { useEffect, useState } from 'react'; import { NavLink, Navigate, Outlet, useNavigate } from 'react-router-dom'; import { LogOut, Menu, X, Database, Users } from 'lucide-react'; import { cn } from '../lib/cn'; import { useAuth } from '../auth/context'; import { onAuthErrorAll, orderBookingClient } from '../api/clients'; import { SCREENS } from './tabs'; import { routeConfig } from '../routesConfig'; import logoUrl from '../assets/logo.png'; import './screen.css'; const canAccessScreen = (key: string, isAdmin: boolean, roles: string[]) => { const route = routeConfig.find(r => r.path === `/${key}`); if (!route) return true; if (route.adminOnly && !isAdmin) return false; if (!route.adminOnly && route.roles) { return route.roles.some(r => roles.includes(r)); } return true; }; /** Auth-guarded shell: slim navy top bar + fixed bottom tab nav + routed . */ export function ConsoleLayout() { const { authed, logout, isAdmin, roles: userRoles } = useAuth(); const navigate = useNavigate(); const user = orderBookingClient.currentUser(); const [isMenuOpen, setIsMenuOpen] = useState(false); // A 401 from any workflow client bounces back to login. useEffect(() => { onAuthErrorAll(() => { logout(); navigate('/login', { replace: true }); }); }, [logout, navigate]); if (!authed) return ; return (
Krishna Sales {/* Sandbox {APP_ID}{user?.name ? ` ยท ${user.name}` : ''} */}
{/* Sidebar Overlay */} {isMenuOpen && (
setIsMenuOpen(false)} /> )}
Krishna Krishna Field Sales
{SCREENS.filter(t => canAccessScreen(t.key, isAdmin, userRoles)).map((t) => { const Icon = t.icon; return ( setIsMenuOpen(false)} className={({ isActive }) => cn( "flex items-center gap-3 px-4 py-3 mx-2 rounded-lg no-underline transition-colors duration-150 sidebar-item", isActive ? "active" : "" )} > {t.label} ); })}
{isAdmin && ( <> setIsMenuOpen(false)} className={({ isActive }) => cn( "flex items-center gap-3 px-4 py-3 mx-2 rounded-lg no-underline transition-colors duration-150 sidebar-item", isActive ? "active" : "" )} > Sales Officers setIsMenuOpen(false)} className={({ isActive }) => cn( "flex items-center gap-3 px-4 py-3 mx-2 rounded-lg no-underline transition-colors duration-150 sidebar-item", isActive ? "active" : "" )} > Manage Datasets )}
{user && (
{user.name || 'User'} {user.email || 'user@email.com'} {userRoles && userRoles.length > 0 && ( {userRoles.join(', ')} )}
)}
); }