import React, { useEffect, useState } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import { useTheme } from '../contexts/ThemeContext'; import { useLanguage } from '../contexts/LanguageContext'; import { useTranslation } from 'react-i18next'; import { Moon, Sun, Languages, LogOut, UserCircle, Menu } from 'lucide-react'; import NotificationBell from './NotificationBell'; import { useSidebarLayout } from '../contexts/SidebarLayoutContext'; interface HeaderProps { userEmail?: string; } const getStoredUserDisplayName = (): string => { try { const user = localStorage.getItem('user'); if (!user) return ''; const parsed = JSON.parse(user); return parsed.full_name || parsed.email || parsed.user_id || parsed.name || ''; } catch { return ''; } }; const Header: React.FC = ({ userEmail }) => { const navigate = useNavigate(); const location = useLocation(); const { theme, toggleTheme } = useTheme(); const { language, changeLanguage } = useLanguage(); const { t } = useTranslation(); const [userDisplayName, setUserDisplayName] = useState(getStoredUserDisplayName); const { openMobileSidebar } = useSidebarLayout(); useEffect(() => { const fetchUserDisplayName = async () => { try { const userResponse = await fetch('/api/method/frappe.auth.get_logged_user', { method: 'GET', headers: { 'Content-Type': 'application/json' }, credentials: 'include', }); const userData = await userResponse.json(); const email = userData.message; if (email) { const fullNameResponse = await fetch( `/api/resource/User/${encodeURIComponent(email)}?fields=["full_name"]`, { method: 'GET', headers: { 'Content-Type': 'application/json' }, credentials: 'include', } ); const fullNameData = await fullNameResponse.json(); setUserDisplayName(fullNameData.data?.full_name || email); return; } } catch (error) { console.error('Error fetching user display name:', error); } if (userEmail) { setUserDisplayName(userEmail); } }; fetchUserDisplayName(); }, [userEmail]); const handleLogout = async () => { localStorage.removeItem('user'); localStorage.removeItem('sid'); try { const csrfToken = document.cookie .split('; ') .find(row => row.startsWith('X-Frappe-CSRF-Token=')) ?.split('=')[1] || ''; await fetch('/api/method/frappe.auth.logout', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Frappe-CSRF-Token': csrfToken, }, credentials: 'include', }); await fetch('/?cmd=web_logout', { credentials: 'include', }); } catch (err) { console.error('Logout error:', err); } finally { window.location.href = '/asm_app/login'; } }; const isProfileActive = location.pathname === '/user-profile'; return (
); }; export default Header;