@mantine/hooks
Version:
A collection of 50+ hooks for state and UI management
51 lines (47 loc) • 1.37 kB
JavaScript
'use client';
;
var React = require('react');
function containsRelatedTarget(event) {
if (event.currentTarget instanceof HTMLElement && event.relatedTarget instanceof HTMLElement) {
return event.currentTarget.contains(event.relatedTarget);
}
return false;
}
function useFocusWithin({
onBlur,
onFocus
} = {}) {
const ref = React.useRef();
const [focused, setFocused] = React.useState(false);
const focusedRef = React.useRef(false);
const _setFocused = (value) => {
setFocused(value);
focusedRef.current = value;
};
const handleFocusIn = (event) => {
if (!focusedRef.current) {
_setFocused(true);
onFocus?.(event);
}
};
const handleFocusOut = (event) => {
if (focusedRef.current && !containsRelatedTarget(event)) {
_setFocused(false);
onBlur?.(event);
}
};
React.useEffect(() => {
if (ref.current) {
ref.current.addEventListener("focusin", handleFocusIn);
ref.current.addEventListener("focusout", handleFocusOut);
return () => {
ref.current?.removeEventListener("focusin", handleFocusIn);
ref.current?.removeEventListener("focusout", handleFocusOut);
};
}
return void 0;
}, [handleFocusIn, handleFocusOut]);
return { ref, focused };
}
exports.useFocusWithin = useFocusWithin;
//# sourceMappingURL=use-focus-within.cjs.map