Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 283x 283x 241x 241x 178x 178x 37x 178x 34x 178x 178x 178x 283x 241x 241x 141x 241x 283x | /**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import createEventHandle from '../createEventHandle';
import useLayoutEffect from '../useLayoutEffect';
import useStable from '../useStable';
type Callback = null | ((any) => void);
type AddListener = (target: EventTarget, listener: null | ((any) => void)) => () => void;
/**
* This can be used with any event type include custom events.
*
* const click = useEvent('click', options);
* useEffect(() => {
* click.setListener(target, onClick);
* return () => click.clear();
* }).
*/
export default function useEvent(
event: string,
options?: ?{
capture?: boolean,
passive?: boolean
}
): AddListener {
const targetListeners = useStable(() => new Map());
const addListener = useStable(() => {
const addEventListener = createEventHandle(event, options);
return (target: EventTarget, callback: Callback) => {
const removeTargetListener = targetListeners.get(target);
if (removeTargetListener != null) {
removeTargetListener();
}
if (callback == null) {
targetListeners.delete(target);
}
const removeEventListener = addEventListener(target, callback);
targetListeners.set(target, removeEventListener);
return removeEventListener;
};
});
useLayoutEffect(() => {
return () => {
targetListeners.forEach((removeListener) => {
removeListener();
});
targetListeners.clear();
};
}, []);
return addListener;
}
|