Merge pull request #592 from Granipouss/feat-memoized-useMap

Memoized utils methods for useMap
This commit is contained in:
Anton Zinovyev 2019-09-05 16:49:53 +03:00 committed by GitHub
commit 4fc2e3631b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 9 deletions

View File

@ -106,3 +106,16 @@ it('should reset map to initial object provided', () => {
expect(result.current[0]).toEqual({ foo: 'bar', a: 1 });
});
it('should memoized its utils methods', () => {
const { result } = setUp({ foo: 'bar', a: 1 });
const [, utils] = result.current;
const { set } = utils;
act(() => {
set('foo', 'baz');
});
expect(result.current[1]).toBe(utils);
expect(result.current[1].set).toBe(set);
});

View File

@ -1,4 +1,4 @@
import { useState } from 'react';
import { useState, useMemo } from 'react';
export interface Actions<T extends object> {
get: <K extends keyof T>(key: K) => T[K];
@ -10,25 +10,27 @@ export interface Actions<T extends object> {
const useMap = <T extends object = any>(initialMap: T = {} as T): [T, Actions<T>] => {
const [map, set] = useState<T>(initialMap);
return [
map,
{
get: (key: keyof T) => map[key as string],
set: <K extends keyof T>(key: K, entry: T[K]) => {
const utils = useMemo<Actions<T>>(
() => ({
get: key => map[key],
set: (key, entry) => {
set(prevMap => ({
...prevMap,
[key]: entry,
}));
},
remove: (key: keyof T) => {
remove: key => {
set(prevMap => {
const { [key]: omit, ...rest } = prevMap;
return rest as T;
});
},
reset: () => set(initialMap),
},
];
}),
[set]
);
return [map, utils];
};
export default useMap;