From 4f1d8c2cbd773f2a26e2eee4fbad88883ea4b405 Mon Sep 17 00:00:00 2001 From: Stefan Loeschcke Date: Tue, 10 Dec 2019 09:48:00 +0100 Subject: [PATCH] fix(useSet): "has" method in useSet updated to reference latest set object --- src/useSet.ts | 17 ++++++++++++----- tests/useSet.test.ts | 20 ++++++++++++++++++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/useSet.ts b/src/useSet.ts index eb79a32b..01a9ca23 100644 --- a/src/useSet.ts +++ b/src/useSet.ts @@ -1,18 +1,20 @@ -import { useState, useMemo } from 'react'; +import { useState, useMemo, useCallback } from 'react'; -export interface Actions { - has: (key: K) => boolean; +export interface StableActions { add: (key: K) => void; remove: (key: K) => void; reset: () => void; } +export interface Actions extends StableActions { + has: (key: K) => boolean; +} + const useSet = (initialSet = new Set()): [Set, Actions] => { const [set, setSet] = useState(initialSet); - const utils = useMemo>( + const stableActions = useMemo>( () => ({ - has: item => set.has(item), add: item => setSet(prevSet => new Set([...Array.from(prevSet), item])), remove: item => setSet(prevSet => new Set(Array.from(prevSet).filter(i => i !== item))), reset: () => setSet(initialSet), @@ -20,6 +22,11 @@ const useSet = (initialSet = new Set()): [Set, Actions] => { [setSet] ); + const utils = { + has: useCallback(item => set.has(item), [set]), + ...stableActions, + } as Actions; + return [set, utils]; }; diff --git a/tests/useSet.test.ts b/tests/useSet.test.ts index d4744680..20e734b4 100644 --- a/tests/useSet.test.ts +++ b/tests/useSet.test.ts @@ -34,6 +34,21 @@ it('should have an initially provided key', () => { expect(value).toBe(true); }); +it('should have an added key', () => { + const { result } = setUp(new Set()); + + act(() => { + result.current[1].add('newKey'); + }); + + let value; + act(() => { + value = result.current[1].has('newKey'); + }); + + expect(value).toBe(true); +}); + it('should get false for non-existing key', () => { const { result } = setUp(new Set(['a'])); const [, utils] = result.current; @@ -110,12 +125,13 @@ it('should reset to initial set provided', () => { it('should memoized its utils methods', () => { const { result } = setUp(new Set(['a', 'b'])); const [, utils] = result.current; - const { add } = utils; + const { add, remove, reset } = utils; act(() => { add('foo'); }); - expect(result.current[1]).toBe(utils); expect(result.current[1].add).toBe(add); + expect(result.current[1].remove).toBe(remove); + expect(result.current[1].reset).toBe(reset); });