Spaces:
Sleeping
Sleeping
File size: 1,114 Bytes
80d8c84 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import { useState, useEffect, useRef } from 'react';
interface TypingTextProps {
text: string;
speed?: number;
onComplete?: () => void;
className?: string;
}
export default function TypingText({ text, speed = 18, onComplete, className }: TypingTextProps) {
const [displayed, setDisplayed] = useState('');
const [done, setDone] = useState(false);
const idxRef = useRef(0);
const prevTextRef = useRef('');
useEffect(() => {
if (text === prevTextRef.current) return;
prevTextRef.current = text;
idxRef.current = 0;
setDisplayed('');
setDone(false);
const interval = setInterval(() => {
idxRef.current += 1;
if (idxRef.current >= text.length) {
setDisplayed(text);
setDone(true);
clearInterval(interval);
onComplete?.();
} else {
setDisplayed(text.slice(0, idxRef.current));
}
}, speed);
return () => clearInterval(interval);
}, [text, speed, onComplete]);
return (
<span className={className}>
{displayed}
{!done && <span className="animate-pulse">|</span>}
</span>
);
}
|