import { useContext, useEffect, useRef, useState } from "react"; import { useDropzone } from "react-dropzone"; import { CircleAlertIcon, LinkIcon, UploadIcon } from "lucide-react"; import { CanvasContext } from "@/context/Canvas"; import { ImageContext } from "@/context/Image"; import { LoadingContext } from "@/context/Loading"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { CheckedState } from "@radix-ui/react-checkbox"; import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Toggle } from "@/components/ui/toggle"; import { getBlockData } from "@/utils/getBlockData"; import BlockSelector from "./open-image/BlockSelector"; function OpenImage({ close }: DialogProps) { const { version } = useContext(CanvasContext); const { setLoading } = useContext(LoadingContext); const { setImage: setContextImage, setImageDimensions: setContextImageDimensions } = useContext(ImageContext); const { acceptedFiles, getRootProps, getInputProps } = useDropzone({ accept: { "image/*": [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".webp", ".tiff", ".svg"], }, }); const divRef = useRef(null); const [image, setImage] = useState(); const [imageDimensions, setImageDimensions] = useState({ width: 0, height: 0 }); const [aspectRatio, setAspectRatio] = useState(1); const [linkAspectRatio, setLinkAspectRatio] = useState(true); const [searchInput, setSearchInput] = useState(""); const [stageWidth, setStageWidth] = useState(0); const [selectedBlocks, setSelectedBlocks] = useState(["stone"]); const [blockTypeCheckboxesChecked, setBlockTypeCheckboxesChecked] = useState({ creative: false, tile_entity: false, fallable: false, }); const blockData = getBlockData(version); useEffect(() => { if (acceptedFiles[0]) { const img = new Image(); img.onload = () => { setImage(img); setImageDimensions({ width: img.width, height: img.height }); setAspectRatio(img.width / img.height); }; img.src = URL.createObjectURL(acceptedFiles[0]); } }, [acceptedFiles]); const onDimensionChange = (e: React.ChangeEvent, isWidth: boolean) => { const newDimension = Number(e.target.value); if (newDimension < 1 || newDimension > 10000) return; setImageDimensions((prev) => { if (isWidth) return linkAspectRatio ? { width: newDimension, height: Math.round(newDimension / aspectRatio) } : { ...prev, width: newDimension }; return linkAspectRatio ? { width: Math.round(newDimension * aspectRatio), height: newDimension } : { ...prev, height: newDimension }; }); }; const onBlockTypeCheckedChange = (checked: CheckedState, property: keyof BlockData[string]) => { const blocksWithProperty = Object.entries(blockData) .filter(([, data]) => data[property] === true) .map(([blockName]) => blockName); if (checked) { setSelectedBlocks((prev) => [...prev, ...blocksWithProperty]); } else { setSelectedBlocks((prev) => prev.filter((block) => !blocksWithProperty.includes(block))); } setBlockTypeCheckboxesChecked((prev) => ({ ...prev, [property]: checked })); }; const onSubmit = () => { if (image) { setLoading(true); // Wait for loading indicator to appear setTimeout(() => { setContextImage(image); setContextImageDimensions(imageDimensions); close(); }, 100); } }; useEffect(() => { Object.keys(blockTypeCheckboxesChecked).forEach((property) => { const blocksWithProperty = Object.entries(blockData) .filter(([, data]) => data[property as keyof BlockData[string]] === true) .map(([blockName]) => blockName); const propertyChecked = blocksWithProperty.every((block) => selectedBlocks.includes(block)); setBlockTypeCheckboxesChecked((prev) => ({ ...prev, [property]: propertyChecked })); }); }, [selectedBlocks]); useEffect(() => { if (!divRef.current) return; setStageWidth(divRef.current.clientWidth); console.log(stageWidth); }, []); return ( Open Image Open your image to load as blocks into the canvas
Image Blocks

Drag and drop your image here or click to open

{image && acceptedFiles[0] && ( <> your image

{acceptedFiles[0].name}

onDimensionChange(e, true)} />
setLinkAspectRatio(!linkAspectRatio)} className="h-8 !min-w-8 p-0 mt-auto mb-1" >
onDimensionChange(e, false)} />
{imageDimensions.height > 384 && (
The height is above 384 blocks!
)}
)}
onBlockTypeCheckedChange(value, "creative")} />
onBlockTypeCheckedChange(value, "tile_entity")} />
onBlockTypeCheckedChange(value, "fallable")} />
setSearchInput(e.target.value)} />
{/* todo: add version selector here */}
); } export default OpenImage;