From 78fba6457b92a473a8a2471f34304460840688f0 Mon Sep 17 00:00:00 2001 From: berlin <1580940252@qq.com> Date: Thu, 30 Mar 2023 20:38:34 +0800 Subject: [PATCH] chore: release v2.2.4 --- packages/core/changelog.md | 6 ++++ packages/core/hooks/index.ts | 3 ++ packages/core/hooks/useCountDown.ts | 48 +++++++++++++++++++++++++++++ packages/core/package.json | 2 +- 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 packages/core/hooks/useCountDown.ts diff --git a/packages/core/changelog.md b/packages/core/changelog.md index 316a06ab..d1df90fa 100644 --- a/packages/core/changelog.md +++ b/packages/core/changelog.md @@ -96,3 +96,9 @@ * fix bug in useDarkMode * delete option ignoreDefault in useLocalStorage and useSessionStorage * add option csrData in useLocalStorage and useSessionStorage + +### 2.2.4(March 30, 2023) + +### Core + +* add useCountDown Hook diff --git a/packages/core/hooks/index.ts b/packages/core/hooks/index.ts index ddf234c2..7fec9e68 100644 --- a/packages/core/hooks/index.ts +++ b/packages/core/hooks/index.ts @@ -79,6 +79,7 @@ import useReducedMotion from "./useReduceMotion"; import useScrollIntoView from "./useScrollIntoView"; import useSticky from "./useSticky"; import useAsyncEffect from "./useAsyncEffect"; +import useCountDown from "./useCountDown"; export { usePrevious, @@ -162,6 +163,7 @@ export { useScrollIntoView, useSticky, useAsyncEffect, + useCountDown, }; export * from "./useToggle"; @@ -245,3 +247,4 @@ export * from "./useReduceMotion"; export * from "./useScrollIntoView"; export * from "./useSticky"; export * from "./useAsyncEffect"; +export * from "./useCountDown"; diff --git a/packages/core/hooks/useCountDown.ts b/packages/core/hooks/useCountDown.ts new file mode 100644 index 00000000..948ed29f --- /dev/null +++ b/packages/core/hooks/useCountDown.ts @@ -0,0 +1,48 @@ +import { useEffect, useState } from "react"; +import useInterval from "./useInterval"; + +const padZero = (time: number): string => { + return `${time}`.length < 2 ? `0${time}` : `${time}`; +}; + +export const getHMSTime = (timeDiff: number): [string, string, string] => { + if (timeDiff <= 0) { + return ["00", "00", "00"]; + } + if (timeDiff > 100 * 3600) { + return ["99", "59", "59"]; + } + const hour = Math.floor(timeDiff / 3600); + const minute = Math.floor((timeDiff - hour * 3600) / 60); + const second = timeDiff - hour * 3600 - minute * 60; + return [padZero(hour), padZero(minute), padZero(second)]; +}; + +const useCountDown = ( + time: number, + format: (number) => [string, string, string] = getHMSTime, + callback?: () => void +) => { + const [remainTime, setRemainTime] = useState(time); + const [delay, setDelay] = useState(1000); + + useInterval(() => { + if (remainTime <= 0) { + setDelay(null); + return; + } + setRemainTime(remainTime - 1); + }, delay); + + useEffect(() => { + if (time > 0 && remainTime <= 0) { + callback && callback(); + } + }, [callback, remainTime, time]); + + const [hour, minute, secoud] = format(remainTime); + + return [hour, minute, secoud] as const; +}; + +export default useCountDown; diff --git a/packages/core/package.json b/packages/core/package.json index 6ebc6e8b..20b72e2f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@reactuses/core", - "version": "2.2.3", + "version": "2.2.4", "main": "./dist/index.cjs", "module": "./dist/index.mjs", "types": "./dist/index.d.ts",