import { Transition } from "@/components/Transition"; import React, { ReactNode, useCallback, useEffect, useRef, useState, } from "react"; import { createPortal } from "react-dom"; interface Props { children?: ReactNode; onClose?: () => void; show?: boolean; darken?: boolean; } export function FloatingContainer(props: Props) { const [portalElement, setPortalElement] = useState(null); const ref = useRef(null); const target = useRef(null); useEffect(() => { function listen(e: MouseEvent) { target.current = e.target as Element; } document.addEventListener("mousedown", listen); return () => { document.removeEventListener("mousedown", listen); }; }); const click = useCallback( (e: React.MouseEvent) => { const startedTarget = target.current; target.current = null; if (e.currentTarget !== e.target) return; if (!startedTarget) return; if (!startedTarget.isEqualNode(e.currentTarget as Element)) return; if (props.onClose) props.onClose(); }, [props] ); useEffect(() => { const element = ref.current?.closest(".popout-location"); setPortalElement(element ?? document.body); }, []); return (
{portalElement ? createPortal(
{props.children}
, portalElement ) : null}
); }