import "../../assets/css/index.css" import { Link } from "react-router-dom"; import { useState, useEffect, useRef, useLayoutEffect } from "react"; import { createPortal } from "react-dom"; function DropdownPortal({ anchorEl, isOpen, onClose, className, children }) { const menuRef = useRef(null); const [stylePos, setStylePos] = useState({ position: "absolute", top: 0, left: 0, visibility: "hidden", zIndex: 1000, }); // Posiciona o menu após renderar (medir tamanho do menu) useLayoutEffect(() => { if (!isOpen) return; if (!anchorEl || !menuRef.current) return; const anchorRect = anchorEl.getBoundingClientRect(); const menuRect = menuRef.current.getBoundingClientRect(); const scrollY = window.scrollY || window.pageYOffset; const scrollX = window.scrollX || window.pageXOffset; // tenta alinhar à direita do botão (como dropdown-menu-right) let left = anchorRect.right + scrollX - menuRect.width; let top = anchorRect.bottom + scrollY; // evita sair da esquerda da tela if (left < 0) left = scrollX + 4; // se extrapolar bottom, abre para cima if (top + menuRect.height > window.innerHeight + scrollY) { top = anchorRect.top + scrollY - menuRect.height; } setStylePos({ position: "absolute", top: `${Math.round(top)}px`, left: `${Math.round(left)}px`, visibility: "visible", zIndex: 1000, }); }, [isOpen, anchorEl, children]); // fecha ao clicar fora / ao rolar useEffect(() => { if (!isOpen) return; function handleDocClick(e) { const menu = menuRef.current; if (menu && !menu.contains(e.target) && anchorEl && !anchorEl.contains(e.target)) { onClose(); } } function handleScroll() { onClose(); } document.addEventListener("mousedown", handleDocClick); // captura scroll em qualquer elemento (true) document.addEventListener("scroll", handleScroll, true); return () => { document.removeEventListener("mousedown", handleDocClick); document.removeEventListener("scroll", handleScroll, true); }; }, [isOpen, onClose, anchorEl]); if (!isOpen) return null; return createPortal(
e.stopPropagation()} > {children}
, document.body ); } function AgendaList() { const [openDropdown, setOpenDropdown] = useState(null); const anchorRefs = useRef({}); return (

Lista de consultas


Adicionar consulta
ID da cosulta Nome do Paciente Idade Nome do médico Especialidade Data da consulta Hora da consulta Status Ação
APT0001 João Miguel 18 Davi Andrade Cardiologista 25 Set 2025 10:00am - 11:00am Ativo
setOpenDropdown(null)} className="dropdown-menu dropdown-menu-right show" > {/* { e.stopPropagation(); setOpenDropdown(null); }} > Ver Detalhes */} { e.stopPropagation(); setOpenDropdown(null); }} > Editar
{/* Modal delete */}
); } export default AgendaList;