'use client' import { useState } from 'react' import Image from 'next/image' import { STANDARD_MODEL_WHITE_BG_VIEWS, type StandardModelWhiteBgKey, } from '@/lib/standard-model-white-background' interface StandardModelWhiteBackgroundUploadProps { imageUrls: Partial> onSelectImage: (key: StandardModelWhiteBgKey, file: File) => void onRemoveImage: (key: StandardModelWhiteBgKey) => void } export default function StandardModelWhiteBackgroundUpload({ imageUrls, onSelectImage, onRemoveImage, }: StandardModelWhiteBackgroundUploadProps) { const [draggingKey, setDraggingKey] = useState(null) const handleDragEnter = (event: React.DragEvent, key: StandardModelWhiteBgKey) => { event.preventDefault() event.stopPropagation() setDraggingKey(key) } const handleDragLeave = (event: React.DragEvent, key: StandardModelWhiteBgKey) => { event.preventDefault() event.stopPropagation() const rect = (event.currentTarget as HTMLElement).getBoundingClientRect() const { clientX, clientY } = event if (clientX <= rect.left || clientX >= rect.right || clientY <= rect.top || clientY >= rect.bottom) { if (draggingKey === key) { setDraggingKey(null) } } } const handleDragOver = (event: React.DragEvent) => { event.preventDefault() event.stopPropagation() event.dataTransfer.dropEffect = 'copy' } const handleDrop = (event: React.DragEvent, key: StandardModelWhiteBgKey) => { event.preventDefault() event.stopPropagation() setDraggingKey(null) const file = event.dataTransfer.files?.[0] if (!file) { return } onSelectImage(key, file) } return (

产品白底图(6张) *

{STANDARD_MODEL_WHITE_BG_VIEWS.map((view) => { const inputId = `white-bg-${view.key}` const imageUrl = imageUrls[view.key] const isDragging = draggingKey === view.key return (

{view.label}

{ const file = event.target.files?.[0] if (file) { onSelectImage(view.key, file) } event.currentTarget.value = '' }} /> {/* biome-ignore lint/a11y/noStaticElementInteractions: 上传槽位需要处理拖拽上传事件 */}
handleDragEnter(event, view.key)} onDragLeave={(event) => handleDragLeave(event, view.key)} onDragOver={handleDragOver} onDrop={(event) => handleDrop(event, view.key)} > {imageUrl ? (
{view.label}

支持拖拽图片替换

) : ( )}
) })}

白底图需一次上传完整6张,系统会自动打包为白底图压缩包用于下载。

💡 每个角度支持拖拽上传,拖入后会自动替换对应位置图片。

) }