import { useCallback, useEffect, useRef, useState } from 'react'; import { copyTextToClipboard } from '../../services/clipboard'; export type CopyFeedbackState = 'idle' | 'copied' | 'failed'; type UseCopyFeedbackOptions = { resetDelayMs?: number; }; /** * 统一剪贴板复制反馈。 * 复制实现、成功/失败状态和定时复位集中在这里,调用方只负责渲染按钮文案。 */ export function useCopyFeedback({ resetDelayMs = 1400, }: UseCopyFeedbackOptions = {}) { const [copyState, setCopyState] = useState('idle'); const resetTimerRef = useRef(null); const clearResetTimer = useCallback(() => { if (resetTimerRef.current !== null) { window.clearTimeout(resetTimerRef.current); resetTimerRef.current = null; } }, []); const resetCopyState = useCallback(() => { clearResetTimer(); setCopyState('idle'); }, [clearResetTimer]); const copyText = useCallback( async (value: string) => { const copied = await copyTextToClipboard(value); setCopyState(copied ? 'copied' : 'failed'); clearResetTimer(); resetTimerRef.current = window.setTimeout(() => { resetTimerRef.current = null; setCopyState('idle'); }, resetDelayMs); return copied; }, [clearResetTimer, resetDelayMs], ); useEffect(() => resetCopyState, [resetCopyState]); return { copyState, copyText, resetCopyState, }; }