Skip to content

Commit afc7def

Browse files
committed
Refactor useStateHook
1 parent 239ed2a commit afc7def

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed
Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
1-
import { useCallback, useMemo, useState, type Dispatch, type SetStateAction } from 'react';
1+
import { useCallback, useMemo, useState, type Dispatch, type RefObject, type SetStateAction } from 'react';
22
import { createPropagation } from 'use-propagate';
33
import { useRefFrom } from 'use-ref-from';
44

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+
520
export default function useStableStateHook<T>(value: T): () => readonly [T];
621

722
export default function useStableStateHook<T>(
@@ -21,19 +36,10 @@ export default function useStableStateHook<T>(
2136
useMemo(() => propagate(value), [propagate, value]);
2237

2338
// 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;
3240

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+
);
3945
}

0 commit comments

Comments
 (0)