//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 }) => (
Entre em contato conosco através dos canais abaixo
Tem certeza que deseja encerrar a sessão?