File tree 5 files changed +79
-0
lines changed
5 files changed +79
-0
lines changed Original file line number Diff line number Diff line change @@ -36,6 +36,7 @@ import { useRequest } from '@mints/hooks';
36
36
- [ useAutoRefresh] ( ./docs/use-auto-refresh.md )
37
37
- [ useOutsideClick] ( ./docs/use-outside-click.md )
38
38
- [ useDebounce] ( ./docs/use-debounce.md )
39
+ - [ useToggle] ( ./docs/use-toggle.md )
39
40
40
41
## 🌐 LICENSE
41
42
Original file line number Diff line number Diff line change
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
+ } ) ;
Original file line number Diff line number Diff line change
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
+ ```
Original file line number Diff line number Diff line change @@ -2,3 +2,4 @@ export * from './use-auto-refresh';
2
2
export * from './use-debounce' ;
3
3
export * from './use-outside-click' ;
4
4
export * from './use-request' ;
5
+ export * from './use-toggle' ;
Original file line number Diff line number Diff line change
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
+ } ;
You can’t perform that action at this time.
0 commit comments