Skip to content

Conversation

FrankChinedu
Copy link

import { useRef, useEffect } from 'react'

interface IEventProps {
eventType: keyof GlobalEventHandlersEventMap
listener: Function,
target: Window | Document,
options?: boolean | AddEventListenerOptions | undefined
}

const useEventListener = ({
eventType = 'scroll',
listener = () => null,
target = window,
options = undefined
}: IEventProps) => {
const savedListener = useRef();

useEffect(() => {
savedListener.current = listener;
}, [listener]);

useEffect(() => {
if (!target?.addEventListener) return;

const eventListener = (event: any) => savedListener?.current?.(event);

target?.addEventListener?.(eventType, eventListener, options);

return () => {
  target?.removeEventListener(eventType, eventListener, options);
};

}, [eventType, target, options]);
};

export default useEventListener;

import { useRef, useEffect } from 'react'

interface IEventProps {
  eventType: keyof GlobalEventHandlersEventMap
  listener: Function,
  target: Window | Document,
  options?: boolean | AddEventListenerOptions | undefined
}

const useEventListener = ({
  eventType = 'scroll',
  listener = () => null,
  target = window,
  options = undefined
}: IEventProps) => {
  const savedListener = useRef<Function>();

  useEffect(() => {
    savedListener.current = listener;
  }, [listener]);

  useEffect(() => {
    if (!target?.addEventListener) return;

    const eventListener = (event: any) => savedListener?.current?.(event);

    target?.addEventListener?.(eventType, eventListener, options);

    return () => {
      target?.removeEventListener(eventType, eventListener, options);
    };
  }, [eventType, target, options]);
};

export default useEventListener;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant