"use client"; import { Check, CheckCheck, Copy, X } from "lucide-react"; import { memo, useEffect, useRef, useState } from "react"; import type { VideoTranscript } from "../types"; interface TranscriptPanelProps { open: boolean; onClose: () => void; transcript: VideoTranscript | null; } export const TranscriptPanel = memo(function TranscriptPanel({ open, onClose, transcript, }: TranscriptPanelProps) { const [copiedIndex, setCopiedIndex] = useState(null); const [copiedAll, setCopiedAll] = useState(false); const copyTimerRef = useRef | null>(null); const copyAllTimerRef = useRef | null>(null); useEffect(() => { return () => { if (copyTimerRef.current !== null) clearTimeout(copyTimerRef.current); if (copyAllTimerRef.current !== null) clearTimeout(copyAllTimerRef.current); }; }, []); if (!open) return null; const handleCopy = (text: string, index: number): void => { void navigator.clipboard.writeText(text).then(() => { setCopiedIndex(index); if (copyTimerRef.current !== null) clearTimeout(copyTimerRef.current); copyTimerRef.current = setTimeout(() => setCopiedIndex(null), 2000); }); }; const handleCopyAll = (): void => { if (!transcript?.transcript) return; const allText = transcript.transcript.join("\n"); void navigator.clipboard.writeText(allText).then(() => { setCopiedAll(true); if (copyAllTimerRef.current !== null) clearTimeout(copyAllTimerRef.current); copyAllTimerRef.current = setTimeout(() => setCopiedAll(false), 2000); }); }; if (!transcript?.transcript?.length) { return (
e.stopPropagation()} >

语音转录

{transcript ? "未识别到文字" : "该视频尚未转写"}

); } return (
e.stopPropagation()} >

语音转录

{transcript.transcript.map((text, index) => (
handleCopy(text, index)} >
#{index + 1}

{text}

))}
共 {transcript.transcript.length} 段转录内容
); });