import React, { useState, useRef, useEffect } from 'react'; import clsx from 'clsx'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useAuthStore } from '@/store/authStore'; import { useUIStore } from '@/store/uiStore'; import { useLogout } from '@/api/hooks'; import { Avatar } from '@/components/ui/Avatar'; import { SearchDropdown } from '@/components/shared/SearchDropdown'; import { SuggestionBadge } from '@/components/ai/SuggestionBadge'; import { Building, ChevronDown, Menu, Zap, Bot, Layers, Code, Plus } from 'lucide-react'; import { NotificationBell } from '@/components/layout/NotificationBell'; import { useWindowStore } from '@/store/windowStore'; import { usePermission } from '@/hooks/usePermission'; export function TopBar() { const { t } = useTranslation(); const navigate = useNavigate(); const { user, currentTenant } = useAuthStore(); const tenants = user?.tenants || []; const { toggleSidebar, toggleMessageSidebar } = useUIStore(); const logoutMutation = useLogout(); const minimizedWindows = useWindowStore((s) => s.windows.filter((w) => w.state === 'minimized')); const { hasPermission } = usePermission(); const canAccess = (perm: string): boolean => { if (user?.is_system_admin) return true; const perms = user?.permissions || []; if (perms.length === 0) return true; return hasPermission(perm); }; const restoreWindow = useWindowStore((s) => s.restoreWindow); const [userMenuOpen, setUserMenuOpen] = useState(false); const userRef = useRef(null); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (userRef.current && !userRef.current.contains(e.target as Node)) setUserMenuOpen(false); }; document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleLogout = async () => { try { await logoutMutation.mutateAsync(); } catch { // ignore } navigate('/login'); }; const fullName = user ? `${user.first_name} ${user.last_name}` : ''; return (
{/* Tenant switcher */} {tenants && tenants.length > 0 && (
)} {/* Search */}
{/* Quick Create */} {canAccess('contacts:write') && ( )} {/* Minimized windows */} {minimizedWindows.length > 0 && (
{minimizedWindows.map((win) => ( ))}
)} {/* User menu */}
{userMenuOpen && (

{fullName}

{user?.email}

{canAccess('settings:read') && ( )} {canAccess('audit:read') && ( )} setUserMenuOpen(false)} className="w-full text-left px-3 py-2 text-sm hover:bg-secondary-50 min-h-touch focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 flex items-center gap-2" role="menuitem" >