import React from 'react';
/**
 * 逐字显示 Hook
 * @param targetText 目标文本（完整文本）
 * @param options 配置选项
 * @returns 当前显示的文本
 */
export const useTypewriter = (targetText, options = {}) => {
    const { speed = 30, enabled = true } = options;
    const [displayText, setDisplayText] = React.useState('');
    const timerRef = React.useRef(null);
    const currentIndexRef = React.useRef(0);
    const previousTargetTextRef = React.useRef('');
    React.useEffect(() => {
        // 如果禁用，直接显示完整文本
        if (!enabled) {
            setDisplayText(targetText);
            currentIndexRef.current = targetText.length;
            previousTargetTextRef.current = targetText;
            return;
        }
        // 如果目标文本为空，清空显示
        if (!targetText) {
            setDisplayText('');
            currentIndexRef.current = 0;
            previousTargetTextRef.current = '';
            return;
        }
        // 如果目标文本比之前短，说明是新的消息，重置
        if (targetText.length < previousTargetTextRef.current.length) {
            setDisplayText('');
            currentIndexRef.current = 0;
        }
        // 如果目标文本已经全部显示完成，直接返回
        if (currentIndexRef.current >= targetText.length) {
            setDisplayText(targetText);
            previousTargetTextRef.current = targetText;
            return;
        }
        // 清除之前的定时器
        if (timerRef.current) {
            clearTimeout(timerRef.current);
            timerRef.current = null;
        }
        // 逐字显示函数
        const typeNextChar = () => {
            if (currentIndexRef.current < targetText.length) {
                const nextIndex = currentIndexRef.current + 1;
                setDisplayText(targetText.slice(0, nextIndex));
                currentIndexRef.current = nextIndex;
                // 继续显示下一个字符
                if (nextIndex < targetText.length) {
                    timerRef.current = setTimeout(typeNextChar, speed);
                }
                else {
                    // 显示完成，更新引用
                    previousTargetTextRef.current = targetText;
                }
            }
        };
        // 如果当前显示位置小于目标文本长度，继续逐字显示
        if (currentIndexRef.current < targetText.length) {
            typeNextChar();
        }
        // 更新目标文本引用
        previousTargetTextRef.current = targetText;
        // 清理函数
        return () => {
            if (timerRef.current) {
                clearTimeout(timerRef.current);
                timerRef.current = null;
            }
        };
    }, [targetText, speed, enabled]);
    // 组件卸载时清理
    React.useEffect(() => {
        return () => {
            if (timerRef.current) {
                clearTimeout(timerRef.current);
                timerRef.current = null;
            }
        };
    }, []);
    return displayText;
};
