import classNames from "classnames";
import { ReactNode, useCallback, useEffect, useRef, useState } from "react";
import { createPortal } from "react-dom";
import { Transition } from "@/components/Transition";
export interface OverlayProps {
children?: ReactNode;
onClose?: () => void;
show?: boolean;
darken?: boolean;
}
export function OverlayDisplay(props: { children: ReactNode }) {
return
{props.children}
;
}
export function Overlay(props: OverlayProps) {
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);
}, []);
const backdrop = (
);
return (
{portalElement
? createPortal(
{backdrop}
{props.children}
,
portalElement
)
: null}
);
}