@atlaskit/spotlight
Version:
A spotlight introduces users to points of interest, from focused messages to multi-step tours.
40 lines (39 loc) • 1.08 kB
JavaScript
import { useCallback, useEffect, useState } from 'react';
import { bind } from 'bind-event-listener';
import { getDocument } from '@atlaskit/browser-apis';
export const useFocusWithin = ref => {
const [active, setActive] = useState(null);
const updateFocusedElement = useCallback(() => {
const doc = getDocument();
const activeElement = (doc === null || doc === void 0 ? void 0 : doc.activeElement) || null;
if (!ref || !ref.current) {
setActive(null);
return;
}
if (!activeElement) {
setActive(null);
return;
}
// Check if the focused element is within the ref element
if (!ref.current.contains(activeElement)) {
setActive(null);
return;
}
setActive(activeElement);
}, [ref]);
useEffect(() => {
const doc = getDocument();
if (!doc) {
return;
}
updateFocusedElement();
const unbindFocusIn = bind(doc, {
type: 'focusin',
listener: updateFocusedElement
});
return () => {
unbindFocusIn();
};
}, [updateFocusedElement]);
return active;
};