From d1f3afbabdcb44b7b7514cbbae4353823075a4c8 Mon Sep 17 00:00:00 2001 From: Brendan Daoud Date: Thu, 5 Sep 2019 15:11:35 +0200 Subject: [PATCH 1/2] Memoized utils methods for useMap --- src/__tests__/useMap.test.ts | 11 +++++++++++ src/useMap.ts | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/__tests__/useMap.test.ts b/src/__tests__/useMap.test.ts index cc9d57a8..8108634a 100644 --- a/src/__tests__/useMap.test.ts +++ b/src/__tests__/useMap.test.ts @@ -106,3 +106,14 @@ 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; + + act(() => { + utils.set('foo', 'baz'); + }); + + expect(result.current[1]).toBe(utils); +}); diff --git a/src/useMap.ts b/src/useMap.ts index 2e1f896c..85a83b5a 100644 --- a/src/useMap.ts +++ b/src/useMap.ts @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useMemo } from 'react'; export interface Actions { get: (key: K) => T[K]; @@ -10,25 +10,27 @@ export interface Actions { const useMap = (initialMap: T = {} as T): [T, Actions] => { const [map, set] = useState(initialMap); - return [ - map, - { - get: (key: keyof T) => map[key as string], - set: (key: K, entry: T[K]) => { + const utils = useMemo>( + () => ({ + 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; From 9e48050de4287d14cb342ef721eeb797b175772e Mon Sep 17 00:00:00 2001 From: Brendan Daoud Date: Thu, 5 Sep 2019 15:36:35 +0200 Subject: [PATCH 2/2] Test for 'set' callback also --- src/__tests__/useMap.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/__tests__/useMap.test.ts b/src/__tests__/useMap.test.ts index 8108634a..fd7592f4 100644 --- a/src/__tests__/useMap.test.ts +++ b/src/__tests__/useMap.test.ts @@ -110,10 +110,12 @@ it('should reset map to initial object provided', () => { it('should memoized its utils methods', () => { const { result } = setUp({ foo: 'bar', a: 1 }); const [, utils] = result.current; + const { set } = utils; act(() => { - utils.set('foo', 'baz'); + set('foo', 'baz'); }); expect(result.current[1]).toBe(utils); + expect(result.current[1].set).toBe(set); });