import { useCallback, useEffect, useRef } from 'react'; import { Image, X } from 'lucide-react'; import { useSnackbar } from '@/components/GlobalSnackbar'; import { useI18n } from '@/utils/chromeI18n'; interface ImageUploaderProps { /** 选中的文件 */ selectedFile: File | null; /** 文件变更回调 */ onFileChange: (file: File) => void; /** 清除文件回调 */ onClearFile: () => void; /** 文件预览 URL */ previewUrl: string; /** 预览 URL 变更回调 */ onPreviewUrlChange: (url: string) => void; /** 是否正在拖拽 */ dragging: boolean; /** 拖拽状态变更回调 */ onDraggingChange: (dragging: boolean) => void; } const ImageUploader = ({ selectedFile, onFileChange, onClearFile, previewUrl, onPreviewUrlChange, dragging, onDraggingChange, }: ImageUploaderProps) => { const { t } = useI18n('qrCode'); const { showMessage } = useSnackbar(); const fileInputRef = useRef(null); const handleFileChange = useCallback( (file: File) => { onFileChange(file); onPreviewUrlChange(URL.createObjectURL(file)); }, [onFileChange, onPreviewUrlChange], ); const handleClearFile = useCallback(() => { if (previewUrl) { URL.revokeObjectURL(previewUrl); } onClearFile(); showMessage(t('qrCode:imageCleared'), { severity: 'success', autoHideDuration: 1000, }); }, [previewUrl, onClearFile, showMessage, t]); const handleInputChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { handleFileChange(e.target.files[0]); } }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); onDraggingChange(true); }; const handleDragLeave = () => { onDraggingChange(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); onDraggingChange(false); const droppedFile = e.dataTransfer.files?.[0]; if (droppedFile) { handleFileChange(droppedFile); } }; // 监听粘贴事件 useEffect(() => { const handlePaste = 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) { try { handleFileChange(file); showMessage(t('qrCode:imagePasted'), { severity: 'success', autoHideDuration: 1000 }); } catch (error) { console.error('处理粘贴图片失败:', error); showMessage(t('qrCode:imagePasteError'), { severity: 'error', autoHideDuration: 3000, }); } } break; } } }; document.addEventListener('paste', handlePaste); return () => { document.removeEventListener('paste', handlePaste); }; }, [showMessage, handleFileChange, t]); return (
); }; export default ImageUploader;