1
- import { useCallback , useMemo , useState , type Dispatch , type SetStateAction } from 'react' ;
1
+ import { useCallback , useMemo , useState , type Dispatch , type RefObject , type SetStateAction } from 'react' ;
2
2
import { createPropagation } from 'use-propagate' ;
3
3
import { useRefFrom } from 'use-ref-from' ;
4
4
5
+ const useCreateHook = < T > (
6
+ setValue : Dispatch < SetStateAction < T > > | undefined ,
7
+ useListen : ( listener : ( value : T ) => void ) => void ,
8
+ valueRef : RefObject < T >
9
+ ) => {
10
+ const [ propagatedValue , setPropagatedValue ] = useState < T > ( valueRef . current ) ;
11
+
12
+ useListen ( setPropagatedValue ) ;
13
+
14
+ return useMemo (
15
+ ( ) => Object . freeze ( setValue ? ( [ propagatedValue , setValue ] as const ) : ( [ propagatedValue ] as const ) ) ,
16
+ [ propagatedValue , setValue ]
17
+ ) ;
18
+ } ;
19
+
5
20
export default function useStableStateHook < T > ( value : T ) : ( ) => readonly [ T ] ;
6
21
7
22
export default function useStableStateHook < T > (
@@ -21,19 +36,10 @@ export default function useStableStateHook<T>(
21
36
useMemo ( ( ) => propagate ( value ) , [ propagate , value ] ) ;
22
37
23
38
// Hack around ESLint rules without disabling react-hooks/rules-of-hooks.
24
- const _useListen = useListen ;
25
- const _useMemo = useMemo ;
26
- const _useState = useState ;
27
-
28
- return useCallback ( ( ) => {
29
- const [ propagatedValue , setPropagatedValue ] = _useState < T > ( valueRef . current ) ;
30
-
31
- _useListen ( setPropagatedValue ) ;
39
+ const _useCreateHook = useCreateHook ;
32
40
33
- return _useMemo (
34
- ( ) => Object . freeze ( setValue ? ( [ propagatedValue , setValue ] as const ) : ( [ propagatedValue ] as const ) ) ,
35
- // This deps is not checked by ESLint, verify with care.
36
- [ propagatedValue , setValue ]
37
- ) ;
38
- } , [ _useMemo , _useListen , _useState , setValue , valueRef ] ) ;
41
+ return useCallback (
42
+ ( ) => _useCreateHook ( setValue , useListen , valueRef ) ,
43
+ [ _useCreateHook , setValue , useListen , valueRef ]
44
+ ) ;
39
45
}
0 commit comments