'use client'; import React, { useEffect, useRef } from 'react'; export interface MdClickOutsideWrapperProps { onClickOutside(_e: React.MouseEvent): void; children: React.ReactNode; className?: string; ref?: React.ForwardedRef; } export const MdClickOutsideWrapper = React.forwardRef( ({ onClickOutside, children, className = '', ...otherProps }, ref) => { const innerRef = useRef(null); /** * Combine ref from parent via props with internal ref */ useEffect(() => { if (!ref) return; if (typeof ref === 'function') { ref(innerRef.current); } else { ref.current = innerRef.current; } }); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (innerRef.current && !innerRef.current?.contains(event.target as Node)) { if (onClickOutside) { onClickOutside(event as unknown as React.MouseEvent); } } }; document.addEventListener('click', handleClickOutside, true); return () => { document.removeEventListener('click', handleClickOutside, true); }; }, [onClickOutside]); return (
{children}
); }, ); MdClickOutsideWrapper.displayName = 'MdClickOutsideWrapper'; export default MdClickOutsideWrapper;