import { useEffect, useRef, useState } from 'react'; import { generateConnectingSequenceBar } from '../animationSequences/connectingSequence'; import { generateListeningSequenceBar } from '../animationSequences/listeningSequence'; import type { AgentState } from '../../../hooks'; export const useBarAnimator = ( state: AgentState | undefined, columns: number, interval: number, ): number[] => { const [index, setIndex] = useState(0); const [sequence, setSequence] = useState([[]]); useEffect(() => { if (state === 'thinking') { setSequence(generateListeningSequenceBar(columns)); } else if (state === 'connecting' || state === 'initializing') { const sequence = [...generateConnectingSequenceBar(columns)]; setSequence(sequence); } else if (state === 'listening') { setSequence(generateListeningSequenceBar(columns)); } else if (state === undefined || state === 'speaking') { setSequence([new Array(columns).fill(0).map((_, idx) => idx)]); } else { setSequence([[]]); } setIndex(0); }, [state, columns]); const animationFrameId = useRef(null); useEffect(() => { let startTime = performance.now(); const animate = (time: DOMHighResTimeStamp) => { const timeElapsed = time - startTime; if (timeElapsed >= interval) { setIndex((prev) => prev + 1); startTime = time; } animationFrameId.current = requestAnimationFrame(animate); }; animationFrameId.current = requestAnimationFrame(animate); return () => { if (animationFrameId.current !== null) { cancelAnimationFrame(animationFrameId.current); } }; }, [interval, columns, state, sequence.length]); return sequence[index % sequence.length]; };