| Server IP : 13.235.167.51 / Your IP : 216.73.217.116 Web Server : Apache System : Linux machinox-server 6.17.0-1013-aws #13~24.04.1-Ubuntu SMP Fri Apr 24 21:36:58 UTC 2026 aarch64 User : root ( 0) PHP Version : 8.2.29 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/control.machinox.in/node_modules/react-datepicker/src/ |
Upload File : |
import React, { useCallback, useEffect, useRef } from "react";
export type ClickOutsideHandler = (event: MouseEvent) => void;
interface ClickOutsideWrapperProps {
onClickOutside: ClickOutsideHandler;
className?: string;
children: React.ReactNode;
containerRef?: React.RefObject<HTMLDivElement | null>;
style?: React.CSSProperties;
ignoreClass?: string;
}
const useDetectClickOutside = (
onClickOutside: ClickOutsideHandler,
ignoreClass?: string,
) => {
const ref = useRef<HTMLDivElement | null>(null);
const onClickOutsideRef = useRef(onClickOutside);
useEffect(() => {
onClickOutsideRef.current = onClickOutside;
}, [onClickOutside]);
const handleClickOutside = useCallback(
(event: MouseEvent) => {
const target =
(event.composed &&
event.composedPath &&
event
.composedPath()
.find((eventTarget) => eventTarget instanceof Node)) ||
event.target;
if (ref.current && !ref.current.contains(target as Node)) {
if (
!(
ignoreClass &&
target instanceof HTMLElement &&
target.classList.contains(ignoreClass)
)
) {
onClickOutsideRef.current?.(event);
}
}
},
[ignoreClass],
);
useEffect(() => {
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
}, [handleClickOutside]);
return ref;
};
export const ClickOutsideWrapper: React.FC<ClickOutsideWrapperProps> = ({
children,
onClickOutside,
className,
containerRef,
style,
ignoreClass,
}) => {
const detectRef = useDetectClickOutside(onClickOutside, ignoreClass);
return (
<div
className={className}
style={style}
ref={(node: HTMLDivElement | null) => {
detectRef.current = node;
if (containerRef) {
containerRef.current = node;
}
}}
>
{children}
</div>
);
};