@react-aria/utils 3.28.1 → 3.29.0

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 (92) hide show
  1. package/dist/DOMFunctions.main.js.map +1 -1
  2. package/dist/DOMFunctions.module.js.map +1 -1
  3. package/dist/ShadowTreeWalker.main.js.map +1 -1
  4. package/dist/ShadowTreeWalker.module.js.map +1 -1
  5. package/dist/animation.main.js.map +1 -1
  6. package/dist/animation.module.js.map +1 -1
  7. package/dist/focusWithoutScrolling.main.js.map +1 -1
  8. package/dist/focusWithoutScrolling.module.js.map +1 -1
  9. package/dist/getOffset.main.js.map +1 -1
  10. package/dist/getOffset.module.js.map +1 -1
  11. package/dist/import.mjs +3 -1
  12. package/dist/inertValue.main.js.map +1 -1
  13. package/dist/inertValue.module.js.map +1 -1
  14. package/dist/isFocusable.main.js.map +1 -1
  15. package/dist/isFocusable.module.js.map +1 -1
  16. package/dist/isVirtualEvent.main.js.map +1 -1
  17. package/dist/isVirtualEvent.module.js.map +1 -1
  18. package/dist/keyboard.main.js.map +1 -1
  19. package/dist/keyboard.module.js.map +1 -1
  20. package/dist/main.js +3 -0
  21. package/dist/main.js.map +1 -1
  22. package/dist/mergeRefs.main.js +16 -4
  23. package/dist/mergeRefs.main.js.map +1 -1
  24. package/dist/mergeRefs.mjs +16 -4
  25. package/dist/mergeRefs.module.js +16 -4
  26. package/dist/mergeRefs.module.js.map +1 -1
  27. package/dist/module.js +3 -1
  28. package/dist/module.js.map +1 -1
  29. package/dist/openLink.main.js +1 -1
  30. package/dist/openLink.main.js.map +1 -1
  31. package/dist/openLink.mjs +1 -1
  32. package/dist/openLink.module.js +1 -1
  33. package/dist/openLink.module.js.map +1 -1
  34. package/dist/platform.main.js +1 -0
  35. package/dist/platform.main.js.map +1 -1
  36. package/dist/platform.mjs +1 -0
  37. package/dist/platform.module.js +1 -0
  38. package/dist/platform.module.js.map +1 -1
  39. package/dist/runAfterTransition.main.js +10 -0
  40. package/dist/runAfterTransition.main.js.map +1 -1
  41. package/dist/runAfterTransition.mjs +10 -0
  42. package/dist/runAfterTransition.module.js +10 -0
  43. package/dist/runAfterTransition.module.js.map +1 -1
  44. package/dist/scrollIntoView.main.js.map +1 -1
  45. package/dist/scrollIntoView.module.js.map +1 -1
  46. package/dist/types.d.ts +25 -34
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/useEvent.main.js.map +1 -1
  49. package/dist/useEvent.module.js.map +1 -1
  50. package/dist/useFormReset.main.js.map +1 -1
  51. package/dist/useFormReset.module.js.map +1 -1
  52. package/dist/useLoadMore.main.js.map +1 -1
  53. package/dist/useLoadMore.module.js.map +1 -1
  54. package/dist/useLoadMoreSentinel.main.js +59 -0
  55. package/dist/useLoadMoreSentinel.main.js.map +1 -0
  56. package/dist/useLoadMoreSentinel.mjs +54 -0
  57. package/dist/useLoadMoreSentinel.module.js +54 -0
  58. package/dist/useLoadMoreSentinel.module.js.map +1 -0
  59. package/dist/useObjectRef.main.js +25 -4
  60. package/dist/useObjectRef.main.js.map +1 -1
  61. package/dist/useObjectRef.mjs +26 -5
  62. package/dist/useObjectRef.module.js +26 -5
  63. package/dist/useObjectRef.module.js.map +1 -1
  64. package/dist/useResizeObserver.main.js.map +1 -1
  65. package/dist/useResizeObserver.module.js.map +1 -1
  66. package/dist/useSyncRef.main.js.map +1 -1
  67. package/dist/useSyncRef.module.js.map +1 -1
  68. package/dist/useUpdateLayoutEffect.main.js.map +1 -1
  69. package/dist/useUpdateLayoutEffect.module.js.map +1 -1
  70. package/package.json +6 -6
  71. package/src/animation.ts +6 -6
  72. package/src/focusWithoutScrolling.ts +1 -1
  73. package/src/getOffset.ts +3 -1
  74. package/src/index.ts +3 -0
  75. package/src/inertValue.ts +1 -1
  76. package/src/isFocusable.ts +2 -2
  77. package/src/isVirtualEvent.ts +1 -1
  78. package/src/keyboard.tsx +1 -1
  79. package/src/mergeRefs.ts +28 -8
  80. package/src/openLink.tsx +9 -9
  81. package/src/runAfterTransition.ts +17 -1
  82. package/src/scrollIntoView.ts +2 -2
  83. package/src/shadowdom/DOMFunctions.ts +5 -5
  84. package/src/shadowdom/ShadowTreeWalker.ts +1 -1
  85. package/src/useEvent.ts +1 -1
  86. package/src/useFormReset.ts +1 -1
  87. package/src/useLoadMore.ts +2 -2
  88. package/src/useLoadMoreSentinel.ts +63 -0
  89. package/src/useObjectRef.ts +45 -15
  90. package/src/useResizeObserver.ts +1 -1
  91. package/src/useSyncRef.ts +1 -1
  92. package/src/useUpdateLayoutEffect.ts +1 -1
@@ -10,30 +10,60 @@
10
10
  * governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import {MutableRefObject, useMemo, useRef} from 'react';
13
+ import {MutableRefObject, useCallback, useMemo, useRef} from 'react';
14
14
 
15
15
  /**
16
16
  * Offers an object ref for a given callback ref or an object ref. Especially
17
17
  * helfpul when passing forwarded refs (created using `React.forwardRef`) to
18
18
  * React Aria hooks.
19
19
  *
20
- * @param forwardedRef The original ref intended to be used.
20
+ * @param ref The original ref intended to be used.
21
21
  * @returns An object ref that updates the given ref.
22
- * @see https://reactjs.org/docs/forwarding-refs.html
22
+ * @see https://react.dev/reference/react/forwardRef
23
23
  */
24
- export function useObjectRef<T>(forwardedRef?: ((instance: T | null) => void) | MutableRefObject<T | null> | null): MutableRefObject<T | null> {
24
+ export function useObjectRef<T>(ref?: ((instance: T | null) => (() => void) | void) | MutableRefObject<T | null> | null): MutableRefObject<T | null> {
25
25
  const objRef: MutableRefObject<T | null> = useRef<T>(null);
26
- return useMemo(() => ({
27
- get current() {
28
- return objRef.current;
26
+ const cleanupRef: MutableRefObject<(() => void) | void> = useRef(undefined);
27
+
28
+ const refEffect = useCallback(
29
+ (instance: T | null) => {
30
+ if (typeof ref === 'function') {
31
+ const refCallback = ref;
32
+ const refCleanup = refCallback(instance);
33
+ return () => {
34
+ if (typeof refCleanup === 'function') {
35
+ refCleanup();
36
+ } else {
37
+ refCallback(null);
38
+ }
39
+ };
40
+ } else if (ref) {
41
+ ref.current = instance;
42
+ return () => {
43
+ ref.current = null;
44
+ };
45
+ }
29
46
  },
30
- set current(value) {
31
- objRef.current = value;
32
- if (typeof forwardedRef === 'function') {
33
- forwardedRef(value);
34
- } else if (forwardedRef) {
35
- forwardedRef.current = value;
47
+ [ref]
48
+ );
49
+
50
+ return useMemo(
51
+ () => ({
52
+ get current() {
53
+ return objRef.current;
54
+ },
55
+ set current(value) {
56
+ objRef.current = value;
57
+ if (cleanupRef.current) {
58
+ cleanupRef.current();
59
+ cleanupRef.current = undefined;
60
+ }
61
+
62
+ if (value != null) {
63
+ cleanupRef.current = refEffect(value);
64
+ }
36
65
  }
37
- }
38
- }), [forwardedRef]);
66
+ }),
67
+ [refEffect]
68
+ );
39
69
  }
@@ -12,7 +12,7 @@ type useResizeObserverOptionsType<T> = {
12
12
  onResize: () => void
13
13
  }
14
14
 
15
- export function useResizeObserver<T extends Element>(options: useResizeObserverOptionsType<T>) {
15
+ export function useResizeObserver<T extends Element>(options: useResizeObserverOptionsType<T>): void {
16
16
  const {ref, box, onResize} = options;
17
17
 
18
18
  useEffect(() => {
package/src/useSyncRef.ts CHANGED
@@ -19,7 +19,7 @@ interface ContextValue<T> {
19
19
  }
20
20
 
21
21
  // Syncs ref from context with ref passed to hook
22
- export function useSyncRef<T>(context?: ContextValue<T> | null, ref?: RefObject<T | null>) {
22
+ export function useSyncRef<T>(context?: ContextValue<T> | null, ref?: RefObject<T | null>): void {
23
23
  useLayoutEffect(() => {
24
24
  if (context && context.ref && ref) {
25
25
  context.ref.current = ref.current;
@@ -14,7 +14,7 @@ import {EffectCallback, useRef} from 'react';
14
14
  import {useLayoutEffect} from './useLayoutEffect';
15
15
 
16
16
  // Like useLayoutEffect, but only called for updates after the initial render.
17
- export function useUpdateLayoutEffect(effect: EffectCallback, dependencies: any[]) {
17
+ export function useUpdateLayoutEffect(effect: EffectCallback, dependencies: any[]): void {
18
18
  const isInitialMount = useRef(true);
19
19
  const lastDeps = useRef<any[] | null>(null);
20
20