mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-01 00:08:27 +01:00
4167a60588
Follows up on https://github.com/Unleash/unleash/pull/4853 to add Biome to the frontend as well. ![image](https://github.com/Unleash/unleash/assets/14320932/1906faf1-fc29-4172-a4d4-b2716d72cd65) Added a few `biome-ignore` to speed up the process but we may want to check and fix them in the future.
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import { useEffect } from 'react';
|
|
|
|
export const useOnBlur = (
|
|
containerRef: React.RefObject<HTMLElement>,
|
|
callback: () => void,
|
|
): void => {
|
|
useEffect(() => {
|
|
let mouseDownInside = false;
|
|
|
|
const handleMouseDown = (event: MouseEvent) => {
|
|
mouseDownInside =
|
|
containerRef.current?.contains(event.target as Node) || false;
|
|
};
|
|
|
|
const handleBlur = (event: FocusEvent) => {
|
|
setTimeout(() => {
|
|
if (
|
|
!mouseDownInside &&
|
|
containerRef.current &&
|
|
!containerRef.current.contains(document.activeElement)
|
|
) {
|
|
callback();
|
|
}
|
|
// Reset the flag for the next sequence of events.
|
|
mouseDownInside = false;
|
|
}, 0);
|
|
};
|
|
|
|
document.addEventListener('mousedown', handleMouseDown);
|
|
|
|
const containerElement = containerRef.current;
|
|
if (containerElement) {
|
|
containerElement.addEventListener('blur', handleBlur, true);
|
|
}
|
|
|
|
return () => {
|
|
document.removeEventListener('mousedown', handleMouseDown);
|
|
if (containerElement) {
|
|
containerElement.removeEventListener('blur', handleBlur, true);
|
|
}
|
|
};
|
|
}, [containerRef, callback]);
|
|
};
|