Popover.tsx 1.5 Ko
Télécharger le fichier
import { FC, JSX, PropsWithChildren, useEffect, useRef, useState } from 'react';
export const ReactPopover: FC<
PropsWithChildren<{
content: JSX.Element;
trigger?: 'click' | 'hover';
}>
> = (props) => {
const { content = null, trigger = null, children = null } = props;
const [show, setShow] = useState(false);
const wrapperRef = useRef(null);
const handleMouseOver = () => trigger === 'hover' && setShow(true);
const handleMouseLeft = () => trigger === 'hover' && setShow(false);
useEffect(() => {
if (!show) return;
const handleClickOutside = (event: MouseEvent) => {
if (wrapperRef.current && !wrapperRef.current.contains(event.target)) setShow(false);
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
// Unbind the event listener on clean up
document.removeEventListener('mousedown', handleClickOutside);
};
}, [show, wrapperRef]);
return (
<div ref={wrapperRef} className="relative flex justify-center w-fit h-fit" onMouseEnter={handleMouseOver} onMouseLeave={handleMouseLeft}>
<div onClick={() => setShow(!show)}>{children}</div>
<div className="min-w-fit w-[200px] h-fit absolute bottom-full z-50 transition-all" hidden={!show}>
<div className="mb-[10px] rounded-[8px] border border-[#c4cabf] bg-[#f2f2eb] p-3 shadow-none">{content}</div>
</div>
</div>
);
};
