Download src/hooks/useMinDisplayTime.ts from chenbhao/codev: direct link, hf CLI and curl.
- Browser
- Download file 1.01 kB
-
https://huggingface.co/chenbhao/codev/resolve/e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/hooks/useMinDisplayTime.ts
- Command line
-
hf download hf://chenbhao/codev@e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/hooks/useMinDisplayTime.ts
-
curl -L -o useMinDisplayTime.ts https://huggingface.co/chenbhao/codev/resolve/e91c8197c9918ff9e5df3140e8c36282bb30e9a2/src/hooks/useMinDisplayTime.ts
1.01 kB
| import { useEffect, useRef, useState } from 'react' | |
| /** | |
| * Throttles a value so each distinct value stays visible for at least `minMs`. | |
| * Prevents fast-cycling progress text from flickering past before it's readable. | |
| * | |
| * Unlike debounce (wait for quiet) or throttle (limit rate), this guarantees | |
| * each value gets its minimum screen time before being replaced. | |
| */ | |
| export function useMinDisplayTime<T>(value: T, minMs: number): T { | |
| const [displayed, setDisplayed] = useState(value) | |
| const lastShownAtRef = useRef(0) | |
| useEffect(() => { | |
| const elapsed = Date.now() - lastShownAtRef.current | |
| if (elapsed >= minMs) { | |
| lastShownAtRef.current = Date.now() | |
| setDisplayed(value) | |
| return | |
| } | |
| const timer = setTimeout( | |
| (shownAtRef, setFn, v) => { | |
| shownAtRef.current = Date.now() | |
| setFn(v) | |
| }, | |
| minMs - elapsed, | |
| lastShownAtRef, | |
| setDisplayed, | |
| value, | |
| ) | |
| return () => clearTimeout(timer) | |
| }, [value, minMs]) | |
| return displayed | |
| } | |