;
+ }
+
+ render();
+
+ fireEvent.click(screen.getByText('Test'));
+
+ expect(handlerSpy).not.toHaveBeenCalled();
+ });
+});
diff --git a/src/hooks/useEventListener/useEventListener.ts b/src/hooks/useEventListener/useEventListener.ts
new file mode 100644
index 00000000..89ffb4a9
--- /dev/null
+++ b/src/hooks/useEventListener/useEventListener.ts
@@ -0,0 +1,113 @@
+import { RefObject, useEffect } from 'react';
+
+import { usePreservedCallback } from '../usePreservedCallback/index.ts';
+
+/**
+ * @description
+ * `useEventListener` is a React hook that allows you to easily add and clean up event listeners on various targets,
+ * such as `window`, `document`, HTML elements, or SVG elements.
+ * The listener is automatically updated with the latest handler on each render without reattaching,
+ * ensuring stable performance and correct behavior.
+ *
+ * @template KW - Event name type for `window` events, determining the corresponding event object type.
+ * @template KD - Event name type for `document` events, determining the corresponding event object type.
+ * @template KH - Event name type for HTML or SVG element events, determining the corresponding event object type.
+ * @template T - Type of the DOM element being referenced (default is `HTMLElement`, but can be an SVG element).
+ * @param {KW | KD | KH} eventName - The name of the event to listen for.
+ * @param {(event: WindowEventMap[KW] | DocumentEventMap[KD] | HTMLElementEventMap[KH] | SVGElementEventMap[KH]) => void} handler - The callback function that will be triggered when the event occurs.
+ * @param {RefObject | Document} [element] - The target to attach the event listener to. Can be a React `ref` object or the `document`. If omitted or `undefined`, the listener is attached to the `window`.
+ * @param {boolean | AddEventListenerOptions} [options] - Optional parameters for the event listener such as `capture`, `once`, or `passive`.
+ *
+ * @example
+ * function WindowResize() {
+ * useEventListener('resize', (event) => {
+ * console.log('Window resized', event);
+ * });
+ *
+ * return