Skip to content

Commit 65f59d3

Browse files
committed
chore: adjust code
1 parent f55a1e8 commit 65f59d3

5 files changed

Lines changed: 160 additions & 37 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
},
6767
"dependencies": {
6868
"@babel/runtime": "^7.12.5",
69-
"@planjs/utils": "^1.8.4",
69+
"@planjs/utils": "^1.11.3",
7070
"fast-deep-equal": "^3.1.3",
7171
"resize-observer-polyfill": "^1.5.1"
7272
},
@@ -85,7 +85,7 @@
8585
"lint-staged": "^10.2.13",
8686
"react": "16.14.0",
8787
"react-dom": "16.14.0",
88-
"stan-builder": "^0.9.14",
88+
"stan-builder": "^0.9.21",
8989
"standard-version": "^9.0.0",
9090
"ts-jest": "^27.0.3",
9191
"typescript": "4.1.5"

src/hooks/useCountdown.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useState } from 'react';
2+
import useInterval from './useInterval';
3+
4+
type CountdownOptions = {
5+
interval?: number;
6+
onDown?: Function;
7+
onEnd?: Function;
8+
};
9+
10+
/**
11+
* useCountdown
12+
* @param endTime Time to countdown
13+
* @param options Countdown options
14+
*/
15+
function useCountdown(endTime: Date, options: CountdownOptions = {}): number {
16+
const { interval = 1_000, onDown, onEnd } = options;
17+
const [time, setTime] = useState<Date>(() => new Date());
18+
const restTime = endTime.getTime() - time.getTime();
19+
const count = restTime > 0 ? Math.ceil(restTime / interval) : 0;
20+
21+
useInterval(onTick, count ? interval : null, true);
22+
23+
return count;
24+
25+
function onTick() {
26+
const newTime = new Date();
27+
if (newTime > endTime) {
28+
if (onEnd) {
29+
onEnd(newTime);
30+
}
31+
setTime(endTime);
32+
33+
return;
34+
}
35+
36+
if (onDown) {
37+
onDown(restTime, newTime);
38+
}
39+
setTime(newTime);
40+
}
41+
}
42+
43+
export default useCountdown;

src/hooks/useInterval.ts

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,81 @@
1-
import { useEffect, useRef } from 'react';
1+
import { useState, useEffect, useRef } from 'react';
2+
import { prefSetInterval, clearPrefSetInterval } from '@planjs/utils';
23

3-
const useInterval = (callback: Function, delay?: number | null) => {
4-
const savedCallback = useRef<Function>(() => {});
4+
type IntervalHandlerAsObject = {
5+
/**
6+
* Function to start the interval
7+
*/
8+
start: () => void;
9+
/**
10+
* Function to stop the interval
11+
*/
12+
stop: () => void;
13+
/**
14+
* IntervalId of the interval
15+
*/
16+
intervalId: number | null;
17+
};
18+
19+
type IntervalHandlerAsArray = [() => void, () => void, number | null];
20+
21+
type IntervalHandler = IntervalHandlerAsArray & IntervalHandlerAsObject;
22+
23+
/**
24+
* useInterval
25+
* @param {Function} callback
26+
* @param {number} intervalDuration
27+
* @param {boolean} startImmediate
28+
* @returns {IntervalHandler} default false
29+
*/
30+
function useInterval(
31+
callback: () => any,
32+
intervalDuration: number | null,
33+
startImmediate: boolean = false,
34+
): IntervalHandler {
35+
const internalIdRef = useRef<number | null>(null);
36+
const [isRunning, setIsRunning] = useState(startImmediate);
37+
const savedCallback = useRef<() => any>();
38+
39+
function start() {
40+
if (!isRunning) {
41+
setIsRunning(true);
42+
}
43+
}
544

45+
function stop() {
46+
if (isRunning) {
47+
setIsRunning(false);
48+
}
49+
}
50+
51+
// Remember the latest callback.
652
useEffect(() => {
753
savedCallback.current = callback;
854
});
955

56+
// Set up the interval.
1057
useEffect(() => {
11-
if (delay !== null) {
12-
const interval = setInterval(() => savedCallback.current(), delay || 0);
13-
return () => clearInterval(interval);
58+
function tick() {
59+
savedCallback.current && savedCallback.current();
1460
}
61+
if (intervalDuration !== null && isRunning) {
62+
const id = prefSetInterval(tick, intervalDuration);
63+
internalIdRef.current = id;
1564

16-
return undefined;
17-
}, [delay]);
18-
};
65+
return () => {
66+
internalIdRef.current = null;
67+
clearPrefSetInterval(id);
68+
};
69+
}
70+
}, [intervalDuration, isRunning]);
71+
72+
let handler: unknown;
73+
(handler as IntervalHandlerAsArray) = [start, stop, internalIdRef.current];
74+
(handler as IntervalHandlerAsObject).start = start;
75+
(handler as IntervalHandlerAsObject).stop = stop;
76+
(handler as IntervalHandlerAsObject).intervalId = internalIdRef.current;
77+
78+
return handler as IntervalHandler;
79+
}
1980

2081
export default useInterval;

src/hooks/useUntil.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import React from 'react';
22

33
import { until } from '@planjs/utils';
44

5-
import type { BaseRetryOption } from '@planjs/utils/typings/promise/interfaces';
6-
import type { ThenReturn } from '@planjs/utils/es/type';
5+
import type { BaseRetryOption } from '@planjs/utils/typings/promise/type';
6+
import type { ThenReturn } from '@planjs/utils/typings/type';
77

88
function useUntil<T extends (...args: any[]) => Promise<any>>(fn: T, options: BaseRetryOption) {
99
const isRunning = React.useRef(false);

yarn.lock

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,13 @@
10041004
dependencies:
10051005
regenerator-runtime "^0.13.4"
10061006

1007+
"@babel/runtime@^7.15.4":
1008+
version "7.15.4"
1009+
resolved "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.4.tgz?cache=0&sync_timestamp=1630618785994&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
1010+
integrity sha1-/RfRa/34eObdAtGXU6OfqKjZyEo=
1011+
dependencies:
1012+
regenerator-runtime "^0.13.4"
1013+
10071014
"@babel/runtime@^7.9.6":
10081015
version "7.14.8"
10091016
resolved "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446"
@@ -1492,14 +1499,14 @@
14921499
stylelint-declaration-block-no-ignored-properties "^1.1.0"
14931500
stylelint-order "^0.8.1"
14941501

1495-
"@planjs/utils@^1.8.4":
1496-
version "1.8.4"
1497-
resolved "https://registry.nlark.com/@planjs/utils/download/@planjs/utils-1.8.4.tgz#c0c81c43afa6e52367f5bcc3623386d2d7196324"
1498-
integrity sha1-wMgcQ6+m5SNn9bzDYjOG0tcZYyQ=
1502+
"@planjs/utils@^1.10.0", "@planjs/utils@^1.11.3":
1503+
version "1.11.3"
1504+
resolved "https://registry.nlark.com/@planjs/utils/download/@planjs/utils-1.11.3.tgz#2cef88b4ddbb9e791391a7bd3fb7273a24e90f11"
1505+
integrity sha1-LO+ItN27nnkTkae9P7cnOiTpDxE=
14991506
dependencies:
1500-
"@babel/runtime" "^7.12.5"
1501-
decimal.js "^10.2.1"
1502-
query-string "^7.0.0"
1507+
"@babel/runtime" "^7.15.4"
1508+
decimal.js "^10.3.1"
1509+
query-string "^7.0.1"
15031510

15041511
"@rollup/plugin-alias@^3.1.2":
15051512
version "3.1.4"
@@ -3727,7 +3734,7 @@ decamelize@^1.1.0, decamelize@^1.2.0:
37273734
resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1610348634503&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
37283735
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
37293736

3730-
decimal.js@^10.2.1:
3737+
decimal.js@^10.2.1, decimal.js@^10.3.1:
37313738
version "10.3.1"
37323739
resolved "https://registry.nlark.com/decimal.js/download/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
37333740
integrity sha1-2MOkRKnGd0umDKatcmHDqU/V54M=
@@ -7123,6 +7130,17 @@ multimatch@^4.0.0:
71237130
arrify "^2.0.1"
71247131
minimatch "^3.0.4"
71257132

7133+
multimatch@^5.0.0:
7134+
version "5.0.0"
7135+
resolved "https://registry.npm.taobao.org/multimatch/download/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6"
7136+
integrity sha1-kyuACWPOp6MaAzMo+h4MOhh02+Y=
7137+
dependencies:
7138+
"@types/minimatch" "^3.0.3"
7139+
array-differ "^3.0.0"
7140+
array-union "^2.1.0"
7141+
arrify "^2.0.1"
7142+
minimatch "^3.0.4"
7143+
71267144
nanoid@^3.1.22:
71277145
version "3.1.23"
71287146
resolved "https://registry.nlark.com/nanoid/download/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
@@ -8328,7 +8346,7 @@ q@^1.1.2, q@^1.5.1:
83288346
resolved "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz?cache=0&sync_timestamp=1599054212574&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fq%2Fdownload%2Fq-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
83298347
integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
83308348

8331-
query-string@^7.0.0:
8349+
query-string@^7.0.1:
83328350
version "7.0.1"
83338351
resolved "https://registry.nlark.com/query-string/download/query-string-7.0.1.tgz?cache=0&sync_timestamp=1624297034221&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fquery-string%2Fdownload%2Fquery-string-7.0.1.tgz#45bd149cf586aaa582dffc7ec7a8ad97dd02f75d"
83348352
integrity sha1-Rb0UnPWGqqWC3/x+x6itl90C910=
@@ -8840,10 +8858,10 @@ rollup@^2.42.3:
88408858
optionalDependencies:
88418859
fsevents "~2.3.2"
88428860

8843-
rollup@^2.53.2:
8844-
version "2.53.3"
8845-
resolved "https://registry.nlark.com/rollup/download/rollup-2.53.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frollup%2Fdownload%2Frollup-2.53.3.tgz#14b0e57f0874d4ad23bdbb13050cf70bcd1eabf7"
8846-
integrity sha1-FLDlfwh01K0jvbsTBQz3C80eq/c=
8861+
rollup@^2.56.3:
8862+
version "2.56.3"
8863+
resolved "https://registry.nlark.com/rollup/download/rollup-2.56.3.tgz#b63edadd9851b0d618a6d0e6af8201955a77aeff"
8864+
integrity sha1-tj7a3ZhRsNYYptDmr4IBlVp3rv8=
88478865
optionalDependencies:
88488866
fsevents "~2.3.2"
88498867

@@ -9225,10 +9243,10 @@ stack-utils@^2.0.3:
92259243
dependencies:
92269244
escape-string-regexp "^2.0.0"
92279245

9228-
stan-builder@^0.9.14:
9229-
version "0.9.14"
9230-
resolved "https://registry.nlark.com/stan-builder/download/stan-builder-0.9.14.tgz#904efa3a42a20589880f7a1a807385cecae6a804"
9231-
integrity sha1-kE76OkKiBYmID3oagHOFzsrmqAQ=
9246+
stan-builder@^0.9.21:
9247+
version "0.9.21"
9248+
resolved "https://registry.nlark.com/stan-builder/download/stan-builder-0.9.21.tgz#d8a5d33a2f3db3c711071c9dfc058c4fb2c6aadb"
9249+
integrity sha1-2KXTOi89s8cRBxyd/AWMT7LGqts=
92329250
dependencies:
92339251
"@babel/core" "^7.14.2"
92349252
"@babel/plugin-proposal-decorators" "^7.14.2"
@@ -9270,24 +9288,24 @@ stan-builder@^0.9.14:
92709288
gulp-typescript "^6.0.0-alpha.1"
92719289
merge2 "^1.4.1"
92729290
postcss-load-config "^2.1.2"
9273-
rollup "^2.53.2"
9291+
rollup "^2.56.3"
92749292
rollup-plugin-postcss "^3.1.8"
92759293
rollup-plugin-terser "^7.0.2"
92769294
rollup-plugin-typescript2 "0.30.0"
92779295
rollup-plugin-visualizer "^4.1.1"
9278-
stan-utils "^0.6.12"
9296+
stan-utils "^0.6.19"
92799297
through2 "^4.0.2"
92809298
vinyl-fs "^3.0.3"
92819299
vue-template-compiler "^2.6.12"
92829300
optionalDependencies:
92839301
fsevents "~2.3.2"
92849302

9285-
stan-utils@^0.6.12:
9286-
version "0.6.12"
9287-
resolved "https://registry.nlark.com/stan-utils/download/stan-utils-0.6.12.tgz#c7d890f6df9f584b9d8f07eaa31696bcd6065d7d"
9288-
integrity sha1-x9iQ9t+fWEudjwfqoxaWvNYGXX0=
9303+
stan-utils@^0.6.19:
9304+
version "0.6.19"
9305+
resolved "https://registry.nlark.com/stan-utils/download/stan-utils-0.6.19.tgz#e3e0b87e2ec29c993ac3cd37d79ba1880e626147"
9306+
integrity sha1-4+C4fi7CnJk6w80315uhiA5iYUc=
92899307
dependencies:
9290-
"@planjs/utils" "^1.8.4"
9308+
"@planjs/utils" "^1.10.0"
92919309
"@types/cross-spawn" "^6.0.2"
92929310
"@types/debug" "^4.1.5"
92939311
"@types/fs-extra" "^9.0.11"
@@ -9313,6 +9331,7 @@ stan-utils@^0.6.12:
93139331
joi "^17.2.1"
93149332
lodash "^4.17.20"
93159333
mkdirp "^1.0.4"
9334+
multimatch "^5.0.0"
93169335
ora "^5.1.0"
93179336
prettier "2.1.2"
93189337
pretty-ms "^7.0.1"

0 commit comments

Comments
 (0)