Skip to content

Commit 395e82b

Browse files
committed
feat: 🎸 improve useCounter interface
BREAKING CHANGE: useCounter interface changed
1 parent 9a1e9ce commit 395e82b

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

src/__stories__/useCounter.story.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import {useCounter} from '..';
44
import ShowDocs from '../util/ShowDocs';
55

66
const Demo = () => {
7-
const [value, inc, set] = useCounter();
7+
const [value, {inc, dec, get, set, reset}] = useCounter(5);
88

99
return (
1010
<div>
11-
<div>{value}</div>
11+
<div>{value} is {get()}</div>
1212
<button onClick={() => inc()}>Increment</button>
13+
<button onClick={() => dec()}>Decrement</button>
14+
<button onClick={() => inc(5)}>Increment (+5)</button>
15+
<button onClick={() => dec(5)}>Decrement (-5)</button>
1316
<button onClick={() => set(100)}>Set 100</button>
17+
<button onClick={() => reset()}>Reset</button>
18+
<button onClick={() => reset(25)}>Reset (25)</button>
1419
</div>
1520
);
1621
};

src/useCounter.ts

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
1-
import {useState} from './react';
1+
import useGetSet from './useGetSet';
2+
import {useCallback} from './react';
23

3-
export type Increment = (inc?: number) => void;
4-
export type Set = (value: number) => void;
4+
export interface CounterActions {
5+
inc: (delta?: number) => void;
6+
dec: (delta?: number) => void;
7+
get: () => number;
8+
set: (value: number) => void;
9+
reset: (value?: number) => void;
10+
}
511

6-
const useCounter = (initialValue: number = 0): [number, Increment, Set] => {
7-
const [value, set] = useState<number>(initialValue);
12+
const useCounter = (initialValue: number = 0): [number, CounterActions] => {
13+
const [get, set] = useGetSet<number>(initialValue);
14+
const inc = useCallback((delta: number = 1) => set(get() + delta), []);
15+
const dec = useCallback((delta: number = 1) => inc(-delta), []);
16+
const reset = useCallback((value: number = initialValue) => {
17+
initialValue = value;
18+
set(value);
19+
}, []);
20+
const actions = {
21+
inc,
22+
dec,
23+
get,
24+
set,
25+
reset,
26+
};
827

9-
return [value, (inc = 1) => set(value + inc), set];
28+
return [get(), actions];
1029
};
1130

1231
export default useCounter;

src/useGetSet.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import {useRef} from './react';
1+
import {useRef, useCallback} from './react';
22
import useUpdate from './useUpdate';
33

44
const useGetSet = <T>(initialValue: T): [() => T, (value: T) => void] => {
5-
const update = useUpdate();
65
let state = useRef(initialValue);
7-
8-
const get = () => state.current;
9-
const set = (value: T) => {
6+
const update = useUpdate();
7+
const get = useCallback(() => state.current, []);
8+
const set = useCallback((value: T) => {
109
state.current = value;
1110
update();
12-
};
11+
}, []);
1312

1413
return [get, set];
1514
};

0 commit comments

Comments
 (0)