mirror of
https://github.com/streamich/react-use.git
synced 2025-12-08 18:02:14 +00:00
Also reduce max line width to 100. And remove `lint:types` step for commit sequence, it bothers when committing incomplete (wip) changes.
33 lines
908 B
TypeScript
33 lines
908 B
TypeScript
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;
|