Skip to content

Commit 06afdf7

Browse files
authored
Merge pull request #2535 from suisous/pr/suisous
feat: Add clear() to useSet
2 parents ea688b0 + a6bc119 commit 06afdf7

4 files changed

Lines changed: 25 additions & 4 deletions

File tree

docs/useSet.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,22 @@ React state hook that tracks a [Set](https://developer.mozilla.org/en-US/docs/We
44

55
## Usage
66

7+
What is the difference between the "clear()" method and the "reset()" method?
8+
9+
The "reset()" method returns the "Set" to the initial value passed during "useSet
10+
The "clear()" method completely empties the "Set".
11+
712
```jsx
813
import {useSet} from 'react-use';
914

1015
const Demo = () => {
11-
const [set, { add, has, remove, toggle, reset }] = useSet(new Set(['hello']));
16+
const [set, { add, has, remove, toggle, reset, clear }] = useSet(new Set(['hello']));
1217

1318
return (
1419
<div>
1520
<button onClick={() => add(String(Date.now()))}>Add</button>
1621
<button onClick={() => reset()}>Reset</button>
22+
<button onClick={() => clear()}>Clear</button>
1723
<button onClick={() => remove('hello')} disabled={!has('hello')}>
1824
Remove 'hello'
1925
</button>

src/useSet.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface StableActions<K> {
55
remove: (key: K) => void;
66
toggle: (key: K) => void;
77
reset: () => void;
8+
clear: () => void;
89
}
910

1011
export interface Actions<K> extends StableActions<K> {
@@ -25,7 +26,7 @@ const useSet = <K>(initialSet = new Set<K>()): [Set<K>, Actions<K>] => {
2526
: new Set([...Array.from(prevSet), item])
2627
);
2728

28-
return { add, remove, toggle, reset: () => setSet(initialSet) };
29+
return { add, remove, toggle, reset: () => setSet(initialSet), clear: () => setSet(new Set()) };
2930
}, [setSet]);
3031

3132
const utils = {

stories/useSet.story.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import { useSet } from '../src';
44
import ShowDocs from './util/ShowDocs';
55

66
const Demo = () => {
7-
const [set, { add, has, remove, reset, toggle }] = useSet(new Set(['hello']));
7+
const [set, { add, has, remove, reset, clear, toggle }] = useSet(new Set(['hello']));
88

99
return (
1010
<div>
1111
<button onClick={() => add(String(Date.now()))}>Add</button>
1212
<button onClick={() => reset()}>Reset</button>
13+
<button onClick={() => clear()}>Clear</button>
1314
<button onClick={() => remove('hello')} disabled={!has('hello')}>
1415
Remove 'hello'
1516
</button>

tests/useSet.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ it('should init set and utils', () => {
1414
remove: expect.any(Function),
1515
toggle: expect.any(Function),
1616
reset: expect.any(Function),
17+
clear: expect.any(Function),
1718
});
1819
});
1920

@@ -145,10 +146,21 @@ it('should reset to initial set provided', () => {
145146
expect(result.current[0]).toEqual(new Set([1]));
146147
});
147148

149+
it('should be empty', () => {
150+
const { result } = setUp(new Set([1]));
151+
const [, utils] = result.current;
152+
153+
act(() => {
154+
utils.clear();
155+
});
156+
157+
expect(result.current[0]).toEqual(new Set([]));
158+
});
159+
148160
it('should memoized its utils methods', () => {
149161
const { result } = setUp(new Set(['a', 'b']));
150162
const [, utils] = result.current;
151-
const { add, remove, reset, toggle } = utils;
163+
const { add, remove, reset, clear, toggle } = utils;
152164

153165
act(() => {
154166
add('foo');
@@ -158,4 +170,5 @@ it('should memoized its utils methods', () => {
158170
expect(result.current[1].remove).toBe(remove);
159171
expect(result.current[1].toggle).toBe(toggle);
160172
expect(result.current[1].reset).toBe(reset);
173+
expect(result.current[1].clear).toBe(clear);
161174
});

0 commit comments

Comments
 (0)