'use client'; import { useState, useCallback } from 'react'; import { motion } from 'framer-motion'; const IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/webp']; function getDroppedImageFiles(dataTransfer) { if (!dataTransfer?.files?.length) return []; return Array.from(dataTransfer.files).filter((f) => IMAGE_TYPES.includes(f.type) ); } export default function ScanPickModal({ onClose, onPick, onFilesDrop, isScanning }) { const [isDragging, setIsDragging] = useState(false); const handleDragOver = useCallback((e) => { e.preventDefault(); e.stopPropagation(); if (!isScanning) setIsDragging(true); }, [isScanning]); const handleDragLeave = useCallback((e) => { e.preventDefault(); e.stopPropagation(); if (!e.currentTarget.contains(e.relatedTarget)) setIsDragging(false); }, []); const handleDrop = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (isScanning || !onFilesDrop) return; const files = getDroppedImageFiles(e.dataTransfer); if (files.length) onFilesDrop(files); }, [isScanning, onFilesDrop]); const dropZoneStyle = { marginBottom: 12, padding: '20px 16px', borderRadius: 12, transition: 'border-color 0.2s ease, background 0.2s ease', cursor: isScanning ? 'not-allowed' : 'pointer', pointerEvents: isScanning ? 'none' : 'auto', }; return ( e.stopPropagation()} style={{ width: 420, maxWidth: '90vw' }} >
选择持仓截图
从相册选择一张或多张持仓截图,系统将自动识别其中的基金代码(6位数字),并支持批量导入。
{ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); if (!isScanning) onPick?.(); } }} >
{isDragging ? '松开即可导入' : '拖拽图片到此处,或点击选择'}
); }