import { useCallback, useEffect } from 'react'; import { RefreshCw } from 'lucide-react'; import { toast } from 'sonner'; import TextInputArea from '@/components/TextInputArea'; import ImageUploader from './ImageUploader'; import { useQrCodeContext } from '../contexts/QrCodeContext'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { cn } from '@/lib/utils'; export default function ParsePanel() { const { parserState, setParserState, handleFileChange, handleClearFile } = useQrCodeContext(); const hasFile = parserState.selectedFile !== null; const handlePaste = useCallback( async (e: ClipboardEvent) => { const items = e.clipboardData?.items; if (!items) return; for (let i = 0; i < items.length; i++) { if (items[i].type.startsWith('image/')) { e.preventDefault(); const file = items[i].getAsFile(); if (file) { handleFileChange(file); toast.success('图片粘贴成功,正在解析...'); } return; } } const text = e.clipboardData?.getData('text/plain'); if (text && text.startsWith('data:image/')) { e.preventDefault(); try { const response = await fetch(text); const blob = await response.blob(); const file = new File([blob], 'pasted-image.png', { type: blob.type }); handleFileChange(file); toast.success('图片粘贴成功,正在解析...'); } catch (error) { console.error('处理 Base64 图片失败:', error); toast.error('粘贴图片失败,请重试'); } } }, [handleFileChange], ); useEffect(() => { document.addEventListener('paste', handlePaste); return () => { document.removeEventListener('paste', handlePaste); }; }, [handlePaste]); if (!hasFile) { return (
{parserState.selectedFile?.name}
{parserState.parsing && (解析中...
)}