//Nesta página falta: ajustar caminho do CSS import { useState, useRef, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { useNavigate, useLocation } from 'react-router-dom'; // import './Header.css'; const Header = () => { // --- hooks (sempre na mesma ordem) --- const [isDropdownOpen, setIsDropdownOpen] = useState(false); const [isSuporteCardOpen, setIsSuporteCardOpen] = useState(false); const [isChatOpen, setIsChatOpen] = useState(false); const [mensagem, setMensagem] = useState(''); const [mensagens, setMensagens] = useState([]); const [showLogoutModal, setShowLogoutModal] = useState(false); const [avatarUrl, setAvatarUrl] = useState(null); const navigate = useNavigate(); const location = useLocation(); const chatInputRef = useRef(null); const mensagensContainerRef = useRef(null); // foco quando abre chat useEffect(() => { if (isChatOpen && chatInputRef.current) { chatInputRef.current.focus(); } }, [isChatOpen]); // scroll automático quando nova mensagem useEffect(() => { if (mensagensContainerRef.current) { mensagensContainerRef.current.scrollTop = mensagensContainerRef.current.scrollHeight; } }, [mensagens]); // carrega avatar se existir useEffect(() => { const loadAvatar = () => { const localAvatar = localStorage.getItem('user_avatar'); if (localAvatar) setAvatarUrl(localAvatar); }; loadAvatar(); const onStorage = () => loadAvatar(); window.addEventListener('storage', onStorage); return () => window.removeEventListener('storage', onStorage); }, []); // ESC fecha qualquer overlay/portal aberto (logout / suporte / chat) useEffect(() => { const onKey = (e) => { if (e.key === 'Escape') { if (showLogoutModal) setShowLogoutModal(false); if (isSuporteCardOpen) setIsSuporteCardOpen(false); if (isChatOpen) setIsChatOpen(false); } }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [showLogoutModal, isSuporteCardOpen, isChatOpen]); // --- handlers logout (mantive comportamento) --- const handleLogoutClick = () => { setShowLogoutModal(true); setIsDropdownOpen(false); }; const clearAuthData = () => { ["token","authToken","userToken","access_token","user","auth","userData"].forEach(key => { localStorage.removeItem(key); sessionStorage.removeItem(key); }); if (window.caches) { caches.keys().then(names => { names.forEach(name => { if (name.includes("auth") || name.includes("api")) caches.delete(name); }); }).catch(()=>{}); } }; const handleLogoutConfirm = async () => { try { const token = localStorage.getItem("token") || localStorage.getItem("authToken") || localStorage.getItem("userToken") || localStorage.getItem("access_token") || sessionStorage.getItem("token") || sessionStorage.getItem("authToken"); if (token) { try { await fetch("https://mock.apidog.com/m1/1053378-0-default/auth/v1/logout", { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, }); } catch (err) { // ignora erro de rede / endpoint — prossegue para limpar local console.warn('logout endpoint error (ignored):', err); } } clearAuthData(); navigate('/login'); } catch (err) { console.error('Erro no logout:', err); clearAuthData(); navigate('/login'); } finally { setShowLogoutModal(false); } }; const handleLogoutCancel = () => setShowLogoutModal(false); // --- profile / suporte / chat handlers --- const handleProfileClick = () => { setIsDropdownOpen(!isDropdownOpen); if (isSuporteCardOpen) setIsSuporteCardOpen(false); if (isChatOpen) setIsChatOpen(false); }; const handleViewProfile = () => { navigate('/perfil'); setIsDropdownOpen(false); }; const handleSuporteClick = () => { setIsSuporteCardOpen((s) => !s); setIsDropdownOpen(false); if (isChatOpen) setIsChatOpen(false); }; const handleCloseSuporteCard = () => setIsSuporteCardOpen(false); const handleChatClick = () => { setIsChatOpen(true); setIsSuporteCardOpen(false); setMensagens([ { id: 1, texto: 'Olá! Bem-vindo ao suporte Mediconnect. Como podemos ajudar você hoje?', remetente: 'suporte', hora: new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }) } ]); }; const handleCloseChat = () => { setIsChatOpen(false); setMensagem(''); }; const handleEnviarMensagem = (e) => { e.preventDefault(); if (mensagem.trim() === '') return; const novaMensagemUsuario = { id: Date.now(), texto: mensagem, remetente: 'usuario', hora: new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }) }; setMensagens(prev => [...prev, novaMensagemUsuario]); setMensagem(''); setTimeout(() => { if (chatInputRef.current) chatInputRef.current.focus(); }, 0); setTimeout(() => { const respostas = [ 'Entendi sua dúvida. Vou verificar isso para você.', 'Obrigado pela informação. Estou analisando seu caso.', 'Pode me dar mais detalhes sobre o problema?', 'Já encaminhei sua solicitação para nossa equipe técnica.', 'Vou ajudar você a resolver isso!' ]; const respostaSuporte = { id: Date.now() + 1, texto: respostas[Math.floor(Math.random() * respostas.length)], remetente: 'suporte', hora: new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }) }; setMensagens(prev => [...prev, respostaSuporte]); }, 900); }; // --- subcomponentes (UI) --- const SuporteCardContent = ({ onOpenChat }) => (

Suporte

Entre em contato conosco através dos canais abaixo

Email
suporte@mediconnect.com
Telefone
(11) 3333-4444
Chat Online
Disponível 24/7
); const ChatOnlineContent = ({ mensagens, onSend, onClose }) => (

Chat de Suporte

{mensagens.map((msg) => (
{msg.texto}
{msg.hora}
))}
setMensagem(e.target.value)} placeholder="Digite sua mensagem..." className="chat-campo" autoFocus />
); // --- portals: Logout / Suporte / Chat (garante top-most e clickable) --- const PortalWrapper = ({ children, z = 99999 }) => { if (typeof document === 'undefined') return null; return createPortal(
{children}
, document.body ); }; const LogoutModalPortal = ({ onCancel, onConfirm }) => { if (typeof document === 'undefined') return null; return createPortal(
e.stopPropagation()} >

Confirmar Logout

Tem certeza que deseja encerrar a sessão?

, document.body ); }; const SuportePortal = ({ onClose, children }) => { if (typeof document === 'undefined') return null; return createPortal(
e.stopPropagation()} > {children}
, document.body ); }; const ChatPortal = ({ onClose, children }) => { if (typeof document === 'undefined') return null; return createPortal(
e.stopPropagation()} > {children}
, document.body ); }; // --- evita render na rota de login (mantendo hooks invocados) --- if (location.pathname === '/login') { return null; } // --- JSX principal (header visual) --- return (
📞
{isDropdownOpen && (
e.stopPropagation()}>
)}
{/* logout modal via portal */} {showLogoutModal && } {/* suporte portal */} {isSuporteCardOpen && ( )} {/* chat portal */} {isChatOpen && ( )}
); }; export default Header;