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;