@mui/x-data-grid
Version:
The community edition of the data grid component (MUI X).
33 lines • 1.31 kB
JavaScript
import * as React from 'react';
import { isFunction } from '../../utils/utils';
import { useGridLogger } from './useGridLogger';
export const useGridNativeEventListener = (apiRef, ref, eventName, handler, options) => {
const logger = useGridLogger(apiRef, 'useNativeEventListener');
const [added, setAdded] = React.useState(false);
const handlerRef = React.useRef(handler);
const wrapHandler = React.useCallback(event => {
return handlerRef.current && handlerRef.current(event);
}, []);
React.useEffect(() => {
handlerRef.current = handler;
}, [handler]);
React.useEffect(() => {
let targetElement;
if (isFunction(ref)) {
targetElement = ref();
} else {
targetElement = ref && ref.current ? ref.current : null;
}
if (targetElement && eventName && !added) {
logger.debug(`Binding native ${eventName} event`);
targetElement.addEventListener(eventName, wrapHandler, options);
const boundElem = targetElement;
setAdded(true);
const unsubscribe = () => {
logger.debug(`Clearing native ${eventName} event`);
boundElem.removeEventListener(eventName, wrapHandler, options);
};
apiRef.current.subscribeEvent('unmount', unsubscribe);
}
}, [ref, wrapHandler, eventName, added, logger, options, apiRef]);
};