@aweebit/react-essentials 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/LICENSE +0 -0
  2. package/dist/hooks/useEventListener.d.ts +5 -4
  3. package/dist/hooks/useEventListener.d.ts.map +1 -1
  4. package/dist/hooks/useEventListener.js +9 -4
  5. package/dist/hooks/useEventListener.js.map +1 -1
  6. package/dist/hooks/useForceUpdate.d.ts +0 -0
  7. package/dist/hooks/useForceUpdate.d.ts.map +0 -0
  8. package/dist/hooks/useForceUpdate.js +0 -0
  9. package/dist/hooks/useForceUpdate.js.map +0 -0
  10. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +4 -0
  11. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -0
  12. package/dist/hooks/useIsomorphicLayoutEffect.js +5 -0
  13. package/dist/hooks/useIsomorphicLayoutEffect.js.map +1 -0
  14. package/dist/hooks/useReducerWithDeps.d.ts +0 -0
  15. package/dist/hooks/useReducerWithDeps.d.ts.map +0 -0
  16. package/dist/hooks/useReducerWithDeps.js +0 -0
  17. package/dist/hooks/useReducerWithDeps.js.map +0 -0
  18. package/dist/hooks/useStateWithDeps.d.ts +0 -0
  19. package/dist/hooks/useStateWithDeps.d.ts.map +0 -0
  20. package/dist/hooks/useStateWithDeps.js +0 -0
  21. package/dist/hooks/useStateWithDeps.js.map +0 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/utils/index.d.ts +1 -0
  27. package/dist/utils/index.d.ts.map +1 -1
  28. package/dist/utils/index.js +1 -0
  29. package/dist/utils/index.js.map +1 -1
  30. package/lib/hooks/useEventListener.ts +26 -12
  31. package/lib/hooks/useForceUpdate.ts +0 -0
  32. package/lib/hooks/useIsomorphicLayoutEffect.ts +7 -0
  33. package/lib/hooks/useReducerWithDeps.ts +0 -0
  34. package/lib/hooks/useStateWithDeps.ts +0 -0
  35. package/lib/index.ts +1 -0
  36. package/lib/utils/index.ts +2 -0
  37. package/package.json +1 -1
package/LICENSE CHANGED
File without changes
@@ -11,9 +11,10 @@
11
11
  * It is the user's responsibility to make sure `element` and `options` values
12
12
  * are correctly memoized!
13
13
  */
14
- declare function useEventListener<K extends keyof SVGElementEventMap, T extends SVGElement>(eventName: K, handler: (event: SVGElementEventMap[K]) => void, element: T, options?: boolean | AddEventListenerOptions): void;
15
- declare function useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement>(eventName: K, handler: (event: HTMLElementEventMap[K]) => void, element: T, options?: boolean | AddEventListenerOptions): void;
16
- declare function useEventListener<K extends keyof DocumentEventMap>(eventName: K, handler: (event: DocumentEventMap[K]) => void, element: Document, options?: boolean | AddEventListenerOptions): void;
17
- declare function useEventListener<K extends keyof WindowEventMap>(eventName: K, handler: (event: WindowEventMap[K]) => void, element?: Window, options?: boolean | AddEventListenerOptions): void;
14
+ declare function useEventListener<K extends keyof SVGElementEventMap, T extends SVGElement>(eventName: K, handler: (this: T, event: SVGElementEventMap[K]) => void, element: T | null, options?: boolean | AddEventListenerOptions): void;
15
+ declare function useEventListener<K extends keyof HTMLElementEventMap, T extends HTMLElement>(eventName: K, handler: (this: T, event: HTMLElementEventMap[K]) => void, element: T | null, options?: boolean | AddEventListenerOptions): void;
16
+ declare function useEventListener<K extends keyof DocumentEventMap>(eventName: K, handler: (this: Document, event: DocumentEventMap[K]) => void, element: Document, options?: boolean | AddEventListenerOptions): void;
17
+ declare function useEventListener<K extends keyof WindowEventMap>(eventName: K, handler: (this: Window, event: WindowEventMap[K]) => void, element?: Window, options?: boolean | AddEventListenerOptions): void;
18
+ declare function useEventListener<T extends EventTarget>(eventName: string, handler: (this: T, event: Event) => void, element?: T | null, options?: boolean | AddEventListenerOptions): void;
18
19
  export default useEventListener;
19
20
  //# sourceMappingURL=useEventListener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEventListener.d.ts","sourceRoot":"","sources":["../../lib/hooks/useEventListener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;GAMG;AAGH,iBAAS,gBAAgB,CACvB,CAAC,SAAS,MAAM,kBAAkB,EAClC,CAAC,SAAS,UAAU,EAEpB,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC/C,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CACvB,CAAC,SAAS,MAAM,mBAAmB,EACnC,CAAC,SAAS,WAAW,EAErB,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EAChD,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EACxD,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC7C,OAAO,EAAE,QAAQ,EACjB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CAAC,CAAC,SAAS,MAAM,cAAc,EACtD,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3C,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAiCR,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"useEventListener.d.ts","sourceRoot":"","sources":["../../lib/hooks/useEventListener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;GAMG;AAGH,iBAAS,gBAAgB,CACvB,CAAC,SAAS,MAAM,kBAAkB,EAClC,CAAC,SAAS,UAAU,EAEpB,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,EACxD,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CACvB,CAAC,SAAS,MAAM,mBAAmB,EACnC,CAAC,SAAS,WAAW,EAErB,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,EACzD,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CAAC,CAAC,SAAS,MAAM,gBAAgB,EACxD,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC7D,OAAO,EAAE,QAAQ,EACjB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CAAC,CAAC,SAAS,MAAM,cAAc,EACtD,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,EACzD,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAGR,iBAAS,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,EACxC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,EAClB,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;AAsCR,eAAe,gBAAgB,CAAC"}
@@ -4,19 +4,24 @@
4
4
  * @license MIT
5
5
  * @copyright 2020 Julien CARON
6
6
  */
7
- import { useEffect, useLayoutEffect, useRef } from 'react';
7
+ import { useEffect, useRef } from 'react';
8
+ import useIsomorphicLayoutEffect from "./useIsomorphicLayoutEffect.js";
8
9
  function useEventListener(eventName, handler, element, options) {
9
10
  // Create a ref that stores handler
10
11
  const savedHandler = useRef(handler);
11
- useLayoutEffect(() => {
12
+ useIsomorphicLayoutEffect(() => {
12
13
  savedHandler.current = handler;
13
14
  }, [handler]);
14
15
  useEffect(() => {
16
+ if (element === null) {
17
+ // No element has been attached to the ref yet
18
+ return;
19
+ }
15
20
  // Define the listening target
16
21
  const targetElement = element ?? window;
17
22
  // Create event listener that calls handler function stored in ref
18
- const listener = (event) => {
19
- savedHandler.current(event);
23
+ const listener = function (event) {
24
+ savedHandler.current.call(this, event);
20
25
  };
21
26
  targetElement.addEventListener(eventName, listener, options);
22
27
  // Remove event listener on cleanup
@@ -1 +1 @@
1
- {"version":3,"file":"useEventListener.js","sourceRoot":"","sources":["../../lib/hooks/useEventListener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAgD3D,SAAS,gBAAgB,CACvB,SAAiB,EACjB,OAA+B,EAC/B,OAAqB,EACrB,OAA2C;IAE3C,mCAAmC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAErC,eAAe,CAAC,GAAG,EAAE;QACnB,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,8BAA8B;QAC9B,MAAM,aAAa,GAAG,OAAO,IAAI,MAAM,CAAC;QAExC,kEAAkE;QAClE,MAAM,QAAQ,GAAmB,CAAC,KAAK,EAAE,EAAE;YACzC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE7D,mCAAmC;QACnC,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"useEventListener.js","sourceRoot":"","sources":["../../lib/hooks/useEventListener.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,yBAAyB,MAAM,gCAAgC,CAAC;AAwDvE,SAAS,gBAAgB,CACvB,SAAiB,EACjB,OAAkD,EAClD,OAA4B,EAC5B,OAA2C;IAE3C,mCAAmC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAErC,yBAAyB,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,8CAA8C;YAC9C,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,MAAM,aAAa,GAAG,OAAO,IAAI,MAAM,CAAC;QAExC,kEAAkE;QAClE,MAAM,QAAQ,GAAmB,UAAU,KAAK;YAC9C,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE7D,mCAAmC;QACnC,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,eAAe,gBAAgB,CAAC"}
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ import { useLayoutEffect } from 'react';
2
+ declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
3
+ export default useIsomorphicLayoutEffect;
4
+ //# sourceMappingURL=useIsomorphicLayoutEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsomorphicLayoutEffect.d.ts","sourceRoot":"","sources":["../../lib/hooks/useIsomorphicLayoutEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAGxC,QAAA,MAAM,yBAAyB,wBACyB,CAAC;AAEzD,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { useLayoutEffect } from 'react';
2
+ import { noop } from "../utils/index.js";
3
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : noop;
4
+ export default useIsomorphicLayoutEffect;
5
+ //# sourceMappingURL=useIsomorphicLayoutEffect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsomorphicLayoutEffect.js","sourceRoot":"","sources":["../../lib/hooks/useIsomorphicLayoutEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,yBAAyB,GAC7B,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AAEzD,eAAe,yBAAyB,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as useEventListener } from './hooks/useEventListener.js';
2
2
  export { default as useForceUpdate } from './hooks/useForceUpdate.js';
3
+ export { default as useIsomorphicLayoutEffect } from './hooks/useIsomorphicLayoutEffect.js';
3
4
  export { default as useReducerWithDeps } from './hooks/useReducerWithDeps.js';
4
5
  export { default as useStateWithDeps } from './hooks/useStateWithDeps.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { default as useEventListener } from './hooks/useEventListener.js';
2
2
  export { default as useForceUpdate } from './hooks/useForceUpdate.js';
3
+ export { default as useIsomorphicLayoutEffect } from './hooks/useIsomorphicLayoutEffect.js';
3
4
  export { default as useReducerWithDeps } from './hooks/useReducerWithDeps.js';
4
5
  export { default as useStateWithDeps } from './hooks/useStateWithDeps.js';
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { DependencyList } from 'react';
2
+ export declare function noop(): void;
2
3
  export declare function isFunction(input: unknown): input is Function;
3
4
  export declare function depsAreEqual(prevDeps: DependencyList, deps: DependencyList): boolean;
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAKT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,wBAAgB,IAAI,SAAK;AAGzB,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,cAAc,GACnB,OAAO,CAKT"}
@@ -1,3 +1,4 @@
1
+ export function noop() { }
1
2
  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
2
3
  export function isFunction(input) {
3
4
  return typeof input === 'function';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":"AAEA,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAwB,EACxB,IAAoB;IAEpB,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/utils/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,IAAI,KAAI,CAAC;AAEzB,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAwB,EACxB,IAAoB;IAEpB,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAC5D,CAAC;AACJ,CAAC"}
@@ -5,7 +5,8 @@
5
5
  * @copyright 2020 Julien CARON
6
6
  */
7
7
 
8
- import { useEffect, useLayoutEffect, useRef } from 'react';
8
+ import { useEffect, useRef } from 'react';
9
+ import useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect.ts';
9
10
 
10
11
  /**
11
12
  * Adds `handler` as a listener for the event `eventName` of `element`
@@ -21,8 +22,8 @@ function useEventListener<
21
22
  T extends SVGElement,
22
23
  >(
23
24
  eventName: K,
24
- handler: (event: SVGElementEventMap[K]) => void,
25
- element: T,
25
+ handler: (this: T, event: SVGElementEventMap[K]) => void,
26
+ element: T | null,
26
27
  options?: boolean | AddEventListenerOptions,
27
28
  ): void;
28
29
 
@@ -32,15 +33,15 @@ function useEventListener<
32
33
  T extends HTMLElement,
33
34
  >(
34
35
  eventName: K,
35
- handler: (event: HTMLElementEventMap[K]) => void,
36
- element: T,
36
+ handler: (this: T, event: HTMLElementEventMap[K]) => void,
37
+ element: T | null,
37
38
  options?: boolean | AddEventListenerOptions,
38
39
  ): void;
39
40
 
40
41
  // Document Event based useEventListener interface
41
42
  function useEventListener<K extends keyof DocumentEventMap>(
42
43
  eventName: K,
43
- handler: (event: DocumentEventMap[K]) => void,
44
+ handler: (this: Document, event: DocumentEventMap[K]) => void,
44
45
  element: Document,
45
46
  options?: boolean | AddEventListenerOptions,
46
47
  ): void;
@@ -48,31 +49,44 @@ function useEventListener<K extends keyof DocumentEventMap>(
48
49
  // Window Event based useEventListener interface
49
50
  function useEventListener<K extends keyof WindowEventMap>(
50
51
  eventName: K,
51
- handler: (event: WindowEventMap[K]) => void,
52
+ handler: (this: Window, event: WindowEventMap[K]) => void,
52
53
  element?: Window,
53
54
  options?: boolean | AddEventListenerOptions,
54
55
  ): void;
55
56
 
57
+ // Fallback overload for all other event targets and types
58
+ function useEventListener<T extends EventTarget>(
59
+ eventName: string,
60
+ handler: (this: T, event: Event) => void,
61
+ element?: T | null,
62
+ options?: boolean | AddEventListenerOptions,
63
+ ): void;
64
+
56
65
  function useEventListener(
57
66
  eventName: string,
58
- handler: (event: Event) => void,
59
- element?: EventTarget,
67
+ handler: (this: EventTarget, event: Event) => void,
68
+ element?: EventTarget | null,
60
69
  options?: boolean | AddEventListenerOptions,
61
70
  ) {
62
71
  // Create a ref that stores handler
63
72
  const savedHandler = useRef(handler);
64
73
 
65
- useLayoutEffect(() => {
74
+ useIsomorphicLayoutEffect(() => {
66
75
  savedHandler.current = handler;
67
76
  }, [handler]);
68
77
 
69
78
  useEffect(() => {
79
+ if (element === null) {
80
+ // No element has been attached to the ref yet
81
+ return;
82
+ }
83
+
70
84
  // Define the listening target
71
85
  const targetElement = element ?? window;
72
86
 
73
87
  // Create event listener that calls handler function stored in ref
74
- const listener: typeof handler = (event) => {
75
- savedHandler.current(event);
88
+ const listener: typeof handler = function (event) {
89
+ savedHandler.current.call(this, event);
76
90
  };
77
91
 
78
92
  targetElement.addEventListener(eventName, listener, options);
File without changes
@@ -0,0 +1,7 @@
1
+ import { useLayoutEffect } from 'react';
2
+ import { noop } from '../utils/index.ts';
3
+
4
+ const useIsomorphicLayoutEffect =
5
+ typeof window !== 'undefined' ? useLayoutEffect : noop;
6
+
7
+ export default useIsomorphicLayoutEffect;
File without changes
File without changes
package/lib/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { default as useEventListener } from './hooks/useEventListener.js';
2
2
  export { default as useForceUpdate } from './hooks/useForceUpdate.js';
3
+ export { default as useIsomorphicLayoutEffect } from './hooks/useIsomorphicLayoutEffect.js';
3
4
  export { default as useReducerWithDeps } from './hooks/useReducerWithDeps.js';
4
5
  export { default as useStateWithDeps } from './hooks/useStateWithDeps.js';
@@ -1,5 +1,7 @@
1
1
  import type { DependencyList } from 'react';
2
2
 
3
+ export function noop() {}
4
+
3
5
  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
4
6
  export function isFunction(input: unknown): input is Function {
5
7
  return typeof input === 'function';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aweebit/react-essentials",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "type": "module",
5
5
  "repository": "github:aweebit/react-essentials",
6
6
  "main": "dist/index.js",