Skip to content

Commit 52f3c26

Browse files
committed
feat: add a new hook useToggle
1 parent 7e60972 commit 52f3c26

File tree

5 files changed

+79
-0
lines changed

5 files changed

+79
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { useRequest } from '@mints/hooks';
3636
- [useAutoRefresh](./docs/use-auto-refresh.md)
3737
- [useOutsideClick](./docs/use-outside-click.md)
3838
- [useDebounce](./docs/use-debounce.md)
39+
- [useToggle](./docs/use-toggle.md)
3940

4041
## 🌐 LICENSE
4142

__test__/use-toggle.test.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { renderHook, act } from '@testing-library/react';
2+
3+
import { useToggle } from '../src';
4+
5+
describe('useToggle', () => {
6+
it('should return the default state', () => {
7+
const { result } = renderHook(() => useToggle());
8+
expect(result.current[0]).toBe(false);
9+
});
10+
11+
it('should return the reverse state when the toggle is called', async () => {
12+
const { result } = renderHook(() => useToggle());
13+
expect(result.current[0]).toBe(false);
14+
15+
await act(() => {
16+
result.current[1]();
17+
});
18+
expect(result.current[0]).toBe(true);
19+
});
20+
21+
it('should return the default or reverse state when set a default value', async () => {
22+
const { result } = renderHook(() => useToggle('Hello', 'World'));
23+
expect(result.current[0]).toBe('Hello');
24+
25+
await act(() => {
26+
result.current[1]();
27+
});
28+
expect(result.current[0]).toBe('World');
29+
});
30+
});

docs/use-toggle.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# useToggle
2+
3+
> A hook that toggle states.
4+
5+
## Usage
6+
7+
```javascript
8+
import { useToggle } from '@mints/hooks';
9+
10+
const Example = () => {
11+
const [state, toggle] = useToggle('Hello', 'World');
12+
13+
return (
14+
<div>
15+
<span>{state}</span>
16+
<span onClick={toggle}>Toggle</span>
17+
</div>
18+
);
19+
};
20+
```
21+
22+
## API
23+
24+
```typescript
25+
useToggle = <T, U>(
26+
defaultState: T = false as T,
27+
reverseState?: U,
28+
): [T | U, () => void]
29+
```

src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './use-auto-refresh';
22
export * from './use-debounce';
33
export * from './use-outside-click';
44
export * from './use-request';
5+
export * from './use-toggle';

src/use-toggle.ts

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useState } from 'react';
2+
3+
export const useToggle = <T, U>(
4+
defaultState: T = false as T,
5+
reverseState?: U,
6+
): [T | U, () => void] => {
7+
const [state, setState] = useState<T | U>(defaultState);
8+
9+
const toggle = () => {
10+
setState((prev) =>
11+
prev === defaultState
12+
? (reverseState ?? (!defaultState as U))
13+
: defaultState,
14+
);
15+
};
16+
17+
return [state, toggle];
18+
};

0 commit comments

Comments
 (0)