Skip to content

Commit fdadb61

Browse files
authored
feat: support modern useEffectEvent (#9095)
* feat: support modern useEffectEvent * chore: require callback * fix: backwards compatibility
1 parent 05f6a30 commit fdadb61

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

packages/@react-aria/utils/src/useEffectEvent.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ import {useLayoutEffect} from './useLayoutEffect';
1717
// before all layout effects, but is available only in React 18 and later.
1818
const useEarlyEffect = React['useInsertionEffect'] ?? useLayoutEffect;
1919

20-
export function useEffectEvent<T extends Function>(fn?: T): T {
20+
// Starting with React 19.2, this hook has been internalized.
21+
const useModernEffectEvent = React['useEffectEvent'] ?? useLegacyEffectEvent;
22+
23+
function useLegacyEffectEvent<T extends Function>(fn?: T): T {
2124
const ref = useRef<T | null | undefined>(null);
2225
useEarlyEffect(() => {
2326
ref.current = fn;
@@ -28,3 +31,7 @@ export function useEffectEvent<T extends Function>(fn?: T): T {
2831
return f?.(...args);
2932
}, []);
3033
}
34+
35+
export function useEffectEvent<T extends Function>(fn: T): T {
36+
return useModernEffectEvent(fn);
37+
}

packages/@react-aria/utils/src/useEvent.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*/
1212

1313
import {RefObject} from '@react-types/shared';
14-
import {useEffect} from 'react';
14+
import {useCallback, useEffect} from 'react';
1515
import {useEffectEvent} from './useEffectEvent';
1616

1717
export function useEvent<K extends keyof GlobalEventHandlersEventMap>(
@@ -20,7 +20,8 @@ export function useEvent<K extends keyof GlobalEventHandlersEventMap>(
2020
handler?: (this: Document, ev: GlobalEventHandlersEventMap[K]) => any,
2121
options?: boolean | AddEventListenerOptions
2222
): void {
23-
let handleEvent = useEffectEvent(handler);
23+
let noop = useCallback(() => {}, []);
24+
let handleEvent = useEffectEvent(handler ?? noop);
2425
let isDisabled = handler == null;
2526

2627
useEffect(() => {

0 commit comments

Comments
 (0)