-
-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
Copy pathuseGetSetState.ts
32 lines (28 loc) · 908 Bytes
/
useGetSetState.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { useCallback, useRef } from 'react';
import useUpdate from './useUpdate';
const useGetSetState = <T extends object>(
initialState: T = {} as T
): [() => T, (patch: Partial<T>) => void] => {
if (process.env.NODE_ENV !== 'production') {
if (typeof initialState !== 'object') {
console.error('useGetSetState initial state must be an object.');
}
}
const update = useUpdate();
const state = useRef<T>({ ...(initialState as object) } as T);
const get = useCallback(() => state.current, []);
const set = useCallback((patch: Partial<T>) => {
if (!patch) {
return;
}
if (process.env.NODE_ENV !== 'production') {
if (typeof patch !== 'object') {
console.error('useGetSetState setter patch must be an object.');
}
}
Object.assign(state.current, patch);
update();
}, []);
return [get, set];
};
export default useGetSetState;