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(
| 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 |
|