import React, { useRef, useState } from "react"; import { Box, Button, Image as UIImage, Flex, Label, Input, Text, } from "theme-ui"; import Modal from "../components/Modal"; function AddMapModal({ isOpen, onRequestClose, onDone, onImageUpload, gridX, onGridXChange, gridY, onGridYChange, imageLoaded, mapSource, }) { const fileInputRef = useRef(); function handleImageUpload(file) { if (file.name) { // Match against a regex to find the grid size in the file name // e.g. Cave 22x23 will return [["22x22", "22", "x", "23"]] const gridMatches = [...file.name.matchAll(/(\d+) ?(x|X) ?(\d+)/g)]; if (gridMatches.length > 0) { const lastMatch = gridMatches[gridMatches.length - 1]; const matchX = parseInt(lastMatch[1]); const matchY = parseInt(lastMatch[3]); if (!isNaN(matchX) && !isNaN(matchY)) { onImageUpload(file, matchX, matchY); return; } } } onImageUpload(file); } function openImageDialog() { if (fileInputRef.current) { fileInputRef.current.click(); } } const [dragging, setDragging] = useState(false); function handleImageDragEnter(event) { event.preventDefault(); event.stopPropagation(); setDragging(true); } function handleImageDragLeave(event) { event.preventDefault(); event.stopPropagation(); setDragging(false); } function handleImageDrop(event) { event.preventDefault(); event.stopPropagation(); const file = event.dataTransfer.files[0]; if (file && file.type.startsWith("image")) { handleImageUpload(file); } setDragging(false); } return ( { e.preventDefault(); onDone(); }} onDragEnter={handleImageDragEnter} > handleImageUpload(event.target.files[0])} type="file" accept="image/*" style={{ display: "none" }} ref={fileInputRef} /> onGridXChange(e.target.value)} /> onGridYChange(e.target.value)} /> {mapSource ? ( ) : ( )} {dragging && ( { e.preventDefault(); e.stopPropagation(); e.dataTransfer.dropEffect = "copy"; }} onDrop={handleImageDrop} > Drop map to upload )} ); } export default AddMapModal;