dify/web/app/components/base/markdown-blocks/use-elapsed-timer.ts
L1nSn0w 725e4da29d
feat(chatflow): stream LLM reasoning to a live thinking panel (#37460)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-06-23 09:49:01 +00:00

35 lines
1.1 KiB
TypeScript

import { useEffect, useRef, useState } from 'react'
/**
* Elapsed-time timer shared by the tagged-markdown `ThinkBlock` and the
* stream-driven `ReasoningPanel`. Counts up every 100ms until `complete`
* latches true, then freezes. Initializing complete=true (e.g. historical
* conversations) never starts the timer.
*/
export const useElapsedTimer = (complete: boolean) => {
const [startTime] = useState(() => Date.now())
const [elapsedTime, setElapsedTime] = useState(0)
// Latch completion so a transient flip back to "not complete" never restarts the timer.
const completedRef = useRef(complete)
if (complete)
completedRef.current = true
const isComplete = completedRef.current
const timerRef = useRef<NodeJS.Timeout | null>(null)
useEffect(() => {
if (isComplete)
return
timerRef.current = setInterval(() => {
setElapsedTime(Math.floor((Date.now() - startTime) / 100) / 10)
}, 100)
return () => {
if (timerRef.current)
clearInterval(timerRef.current)
}
}, [startTime, isComplete])
return { elapsedTime, isComplete }
}