[d565449] | 1 | import { useMemo } from 'react';
|
---|
| 2 | import useGetSet from './useGetSet';
|
---|
| 3 | import { resolveHookState } from './misc/hookState';
|
---|
| 4 | export default function useCounter(initialValue, max, min) {
|
---|
| 5 | if (initialValue === void 0) { initialValue = 0; }
|
---|
| 6 | if (max === void 0) { max = null; }
|
---|
| 7 | if (min === void 0) { min = null; }
|
---|
| 8 | var init = resolveHookState(initialValue);
|
---|
| 9 | typeof init !== 'number' &&
|
---|
| 10 | console.error('initialValue has to be a number, got ' + typeof initialValue);
|
---|
| 11 | if (typeof min === 'number') {
|
---|
| 12 | init = Math.max(init, min);
|
---|
| 13 | }
|
---|
| 14 | else if (min !== null) {
|
---|
| 15 | console.error('min has to be a number, got ' + typeof min);
|
---|
| 16 | }
|
---|
| 17 | if (typeof max === 'number') {
|
---|
| 18 | init = Math.min(init, max);
|
---|
| 19 | }
|
---|
| 20 | else if (max !== null) {
|
---|
| 21 | console.error('max has to be a number, got ' + typeof max);
|
---|
| 22 | }
|
---|
| 23 | var _a = useGetSet(init), get = _a[0], setInternal = _a[1];
|
---|
| 24 | return [
|
---|
| 25 | get(),
|
---|
| 26 | useMemo(function () {
|
---|
| 27 | var set = function (newState) {
|
---|
| 28 | var prevState = get();
|
---|
| 29 | var rState = resolveHookState(newState, prevState);
|
---|
| 30 | if (prevState !== rState) {
|
---|
| 31 | if (typeof min === 'number') {
|
---|
| 32 | rState = Math.max(rState, min);
|
---|
| 33 | }
|
---|
| 34 | if (typeof max === 'number') {
|
---|
| 35 | rState = Math.min(rState, max);
|
---|
| 36 | }
|
---|
| 37 | prevState !== rState && setInternal(rState);
|
---|
| 38 | }
|
---|
| 39 | };
|
---|
| 40 | return {
|
---|
| 41 | get: get,
|
---|
| 42 | set: set,
|
---|
| 43 | inc: function (delta) {
|
---|
| 44 | if (delta === void 0) { delta = 1; }
|
---|
| 45 | var rDelta = resolveHookState(delta, get());
|
---|
| 46 | if (typeof rDelta !== 'number') {
|
---|
| 47 | console.error('delta has to be a number or function returning a number, got ' + typeof rDelta);
|
---|
| 48 | }
|
---|
| 49 | set(function (num) { return num + rDelta; });
|
---|
| 50 | },
|
---|
| 51 | dec: function (delta) {
|
---|
| 52 | if (delta === void 0) { delta = 1; }
|
---|
| 53 | var rDelta = resolveHookState(delta, get());
|
---|
| 54 | if (typeof rDelta !== 'number') {
|
---|
| 55 | console.error('delta has to be a number or function returning a number, got ' + typeof rDelta);
|
---|
| 56 | }
|
---|
| 57 | set(function (num) { return num - rDelta; });
|
---|
| 58 | },
|
---|
| 59 | reset: function (value) {
|
---|
| 60 | if (value === void 0) { value = init; }
|
---|
| 61 | var rValue = resolveHookState(value, get());
|
---|
| 62 | if (typeof rValue !== 'number') {
|
---|
| 63 | console.error('value has to be a number or function returning a number, got ' + typeof rValue);
|
---|
| 64 | }
|
---|
| 65 | // eslint-disable-next-line react-hooks/exhaustive-deps
|
---|
| 66 | init = rValue;
|
---|
| 67 | set(rValue);
|
---|
| 68 | },
|
---|
| 69 | };
|
---|
| 70 | }, [init, min, max]),
|
---|
| 71 | ];
|
---|
| 72 | }
|
---|