diff --git a/packages/shared/src/hooks/index.ts b/packages/shared/src/hooks/index.ts index 9e36381a..999f1cb9 100644 --- a/packages/shared/src/hooks/index.ts +++ b/packages/shared/src/hooks/index.ts @@ -2,3 +2,5 @@ export * from './useForceUpdate'; export * from './useIsInitDep'; export * from './useToggle'; export * from './useClientSize'; +export * from './useForwardRef'; +export * from './useTimeDown'; diff --git a/packages/shared/src/hooks/useForwardRef.ts b/packages/shared/src/hooks/useForwardRef.ts new file mode 100644 index 00000000..e6cbe16d --- /dev/null +++ b/packages/shared/src/hooks/useForwardRef.ts @@ -0,0 +1,15 @@ +import React, { useEffect, useRef } from 'react'; + +export function useForwardRef( + forwardRef: React.ForwardedRef, +): React.RefObject { + const ref = useRef(null); + + useEffect(() => { + if (!forwardRef) return; + if (typeof forwardRef === 'function') forwardRef(ref.current as T); + else forwardRef.current = ref.current as T; + }, [forwardRef]); + + return ref; +} diff --git a/packages/shared/src/hooks/useTimeDown.ts b/packages/shared/src/hooks/useTimeDown.ts new file mode 100644 index 00000000..7e437bba --- /dev/null +++ b/packages/shared/src/hooks/useTimeDown.ts @@ -0,0 +1,24 @@ +import { useCallback, useEffect, useState } from 'react'; + +export function useTimeDown(duration: number, interval = 1000) { + const [stop, _setStop] = useState(false); + const setStop = useCallback((stop: boolean) => _setStop(stop), []); + const [time, setTime] = useState(duration); + + useEffect(() => { + if (stop) return; + + const startTime = Date.now(); + + const timer = setInterval(() => { + // time未加入依赖,会保持启动时的状态 + const t = time - (Date.now() - startTime); + setTime(t); + if (t <= 0) clearInterval(timer); + }, interval); + + return () => clearInterval(timer); + }, [duration, stop, interval]); + + return [time, setStop] as const; +}