import React, { useState, useEffect } from "react"; import { Flex, Box, IconButton, Label } from "theme-ui"; import AddMapButton from "./AddMapButton"; import ExpandMoreIcon from "../icons/ExpandMoreIcon"; import PanToolIcon from "../icons/PanToolIcon"; import BrushToolIcon from "../icons/BrushToolIcon"; import EraseToolIcon from "../icons/EraseToolIcon"; import UndoIcon from "../icons/UndoIcon"; import RedoIcon from "../icons/RedoIcon"; import GridOnIcon from "../icons/GridOnIcon"; import GridOffIcon from "../icons/GridOffIcon"; import colors, { colorOptions } from "../helpers/colors"; import MapMenu from "./MapMenu"; import EraseAllIcon from "../icons/EraseAllIcon"; function MapControls({ onMapChange, onToolChange, selectedTool, disabledTools, onUndo, onRedo, undoDisabled, redoDisabled, brushColor, onBrushColorChange, onEraseAll, useBrushGridSnapping, onBrushGridSnappingChange, }) { const [isExpanded, setIsExpanded] = useState(false); const subMenus = { brush: ( {colorOptions.map((color) => ( onBrushColorChange(color)} > {brushColor === color && ( )} ))} ), erase: ( ), }; const [currentSubmenu, setCurrentSubmenu] = useState(null); const [currentSubmenuOptions, setCurrentSubmenuOptions] = useState({}); function handleToolClick(event, tool) { if (tool !== selectedTool) { onToolChange(tool); } else if (subMenus[tool]) { const toolRect = event.target.getBoundingClientRect(); setCurrentSubmenu(tool); setCurrentSubmenuOptions({ // Align the right of the submenu to the left of the tool and center vertically left: `${toolRect.left - 16}px`, top: `${toolRect.bottom - toolRect.height / 2}px`, style: { transform: "translate(-100%, -50%)" }, }); } } // Detect when a tool becomes disabled and switch to to the pan tool useEffect(() => { if (disabledTools.includes(selectedTool)) { onToolChange("pan"); } }, [selectedTool, disabledTools, onToolChange]); const divider = ( ); return ( <> setIsExpanded(!isExpanded)} sx={{ transform: `rotate(${isExpanded ? "0" : "180deg"})`, display: "block", backgroundColor: "overlay", borderRadius: "50%", }} m={2} > {divider} handleToolClick(e, "pan")} sx={{ color: selectedTool === "pan" ? "primary" : "text" }} disabled={disabledTools.includes("pan")} > handleToolClick(e, "brush")} sx={{ color: selectedTool === "brush" ? "primary" : "text" }} disabled={disabledTools.includes("brush")} > handleToolClick(e, "erase")} sx={{ color: selectedTool === "erase" ? "primary" : "text" }} disabled={disabledTools.includes("erase")} > {divider} onUndo()} disabled={undoDisabled} > onRedo()} disabled={redoDisabled} > { setCurrentSubmenu(null); setCurrentSubmenuOptions({}); }} {...currentSubmenuOptions} > {currentSubmenu && subMenus[currentSubmenu]} ); } export default MapControls;