@zohodesk/a11y
Version:
In this Package, We Provide Some Basic Components For Accessibility.
74 lines (70 loc) • 2.01 kB
JavaScript
import { useEffect, useRef } from 'react';
import useId from "./useId";
import { applyFocusStyle, preventDOMAvailabllityAndFocus, removeFocusStyle } from "../utils/focusScopeUtil";
import useEvent from "../../hooks/useEvent";
export default (_ref => {
let {
isRestoreFocus,
onUpdate: onUpdateCallback,
onClear: onClearCallback
} = _ref;
const restoreNodesRef = useRef([]);
const restoreFocusId = useId();
const newRestoreEleRef = useRef({});
const getRestoreEle = useEvent(() => newRestoreEleRef.current);
const setRestoreEle = useEvent(value => {
newRestoreEleRef.current = value;
});
const updateNodes = useEvent(nodes => {
restoreNodesRef.current = nodes;
});
const setRestore = useEvent(() => {
const newRestoreEle = {
el: document.activeElement,
id: restoreFocusId
};
setRestoreEle(newRestoreEle);
removeFocusStyle({
ele: document.activeElement
});
updateNodes([...restoreNodesRef.current, newRestoreEle]);
if (onUpdateCallback) {
updateNodes(onUpdateCallback(restoreNodesRef.current));
}
});
const getLastActiveEl = useEvent(() => {
let result = restoreNodesRef.current.find(item => item.id === restoreFocusId);
return result && result.el;
});
const fireFocus = useEvent(() => {
let restoreEl = getLastActiveEl(restoreFocusId);
preventDOMAvailabllityAndFocus(restoreEl);
applyFocusStyle({
ele: restoreEl
});
});
const clearRestore = useEvent(e => {
fireFocus();
if (restoreNodesRef.current) {
setRestoreEle({});
updateNodes(restoreNodesRef.current.filter(item => {
return item.id === restoreFocusId;
}));
}
if (onClearCallback) {
updateNodes(onClearCallback(restoreNodesRef.current));
}
});
useEffect(() => {
if (isRestoreFocus) {
setRestore();
} else {
clearRestore();
}
return clearRestore;
}, [isRestoreFocus]);
return {
getRestoreEle,
setRestoreEle
};
});