import { ArrowDownTray } from "@medusajs/icons" import { Text, clx } from "@medusajs/ui" import { ChangeEvent, DragEvent, useRef, useState } from "react" export interface FileType { id: string url: string file: File } export interface FileUploadProps { label: string multiple?: boolean hint?: string hasError?: boolean formats: string[] onUploaded: (files: FileType[]) => void } export const FileUpload = ({ label, hint, multiple = true, hasError, formats, onUploaded, }: FileUploadProps) => { const [isDragOver, setIsDragOver] = useState(false) const inputRef = useRef(null) const dropZoneRef = useRef(null) const handleOpenFileSelector = () => { inputRef.current?.click() } const handleDragEnter = (event: DragEvent) => { event.preventDefault() event.stopPropagation() const files = event.dataTransfer?.files if (!files) { return } setIsDragOver(true) } const handleDragLeave = (event: DragEvent) => { event.preventDefault() event.stopPropagation() if ( !dropZoneRef.current || dropZoneRef.current.contains(event.relatedTarget as Node) ) { return } setIsDragOver(false) } const handleUploaded = (files: FileList | null) => { if (!files) { return } const fileList = Array.from(files) const fileObj = fileList.map((file) => { const id = Math.random().toString(36).substring(7) const previewUrl = URL.createObjectURL(file) return { id: id, url: previewUrl, file, } }) onUploaded(fileObj) } const handleDrop = (event: DragEvent) => { event.preventDefault() event.stopPropagation() setIsDragOver(false) handleUploaded(event.dataTransfer?.files) } const handleFileChange = async (event: ChangeEvent) => { handleUploaded(event.target.files) } return (
) }