import { Search, Menu, Wifi, WifiOff, Star, ArrowLeft } from 'lucide-react';
import { useState, useEffect, useMemo, useCallback, memo } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { Button } from '@/components/ui/button';
interface HeaderProps {
onSearchClick: () => void;
onMenuClick: () => void;
}
// Memoizar iconos para evitar re-renders
const MenuIcon = memo(() =>
);
MenuIcon.displayName = 'MenuIcon';
const SearchIcon = memo(() => );
SearchIcon.displayName = 'SearchIcon';
const Header = memo(({ onSearchClick, onMenuClick }: HeaderProps) => {
const navigate = useNavigate();
const location = useLocation();
// Mostrar botón de retroceso si no estamos en la página principal
const showBackButton = useMemo(() => location.pathname !== '/', [location.pathname]);
const [isOnline, setIsOnline] = useState(navigator.onLine);
useEffect(() => {
const handleOnline = () => setIsOnline(true);
const handleOffline = () => setIsOnline(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
const handleBack = useCallback(() => {
if (window.history.length > 1) {
navigate(-1);
} else {
navigate('/');
}
}, [navigate]);
// Memoizar handlers para evitar re-renders
const handleMenuClick = useCallback(() => {
// Usar requestAnimationFrame para no bloquear
requestAnimationFrame(() => {
onMenuClick();
});
}, [onMenuClick]);
const handleSearchClick = useCallback(() => {
// Usar requestAnimationFrame para no bloquear
requestAnimationFrame(() => {
onSearchClick();
});
}, [onSearchClick]);
// Memoizar clases del estado online
const onlineStatusClasses = useMemo(() =>
isOnline
? 'bg-success/20 text-success'
: 'bg-warning/20 text-warning',
[isOnline]
);
return (
{showBackButton && (
)}
TES
EMERGES TES
Guía de Protocolos
{isOnline ? (
<>
Online
>
) : (
<>
Offline
>
)}
);
});
Header.displayName = 'Header';
export default Header;