UNPKG

@zohodesk/a11y

Version:

In this Package, We Provide Some Basic Components For Accessibility.

74 lines (70 loc) 2.01 kB
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 }; });