import React, { useEffect, useState } from "react"; import { Flex, Box, Label, Input, Checkbox, IconButton } from "theme-ui"; import ExpandMoreIcon from "../../icons/ExpandMoreIcon"; import useDebounce from "../../helpers/useDebounce"; import usePrevious from "../../helpers/usePrevious"; function MapSettings({ map, mapState, onSettingsChange, onStateSettingsChange, showMore, onShowMoreChange, }) { function handleFlagChange(event, flag) { if (event.target.checked) { onStateSettingsChange("editFlags", [...mapState.editFlags, flag]); } else { onStateSettingsChange( "editFlags", mapState.editFlags.filter((f) => f !== flag) ); } } // Create a local state for the map name to debounce calls to settings change // and avoid performance issues with db access const [localMapName, setLocalMapName] = useState(""); const prevMap = usePrevious(map); useEffect(() => { // Check map changed if (map && (!prevMap || map.id !== prevMap.id)) { setLocalMapName(map.name); } }, [map]); const debouncedLocalMapName = useDebounce(localMapName, 100); useEffect(() => { if (map) { onSettingsChange("name", debouncedLocalMapName); } }, [debouncedLocalMapName]); return ( onSettingsChange("gridX", parseInt(e.target.value)) } disabled={map === null || map.type === "default"} min={1} my={1} /> onSettingsChange("gridY", parseInt(e.target.value)) } disabled={map === null || map.type === "default"} min={1} my={1} /> {showMore && ( <> setLocalMapName(e.target.value)} disabled={map === null || map.type === "default"} my={1} /> )} { e.stopPropagation(); e.preventDefault(); onShowMoreChange(!showMore); }} sx={{ transform: `rotate(${showMore ? "180deg" : "0"})`, alignSelf: "center", }} aria-label={showMore ? "Show Less" : "Show More"} title={showMore ? "Show Less" : "Show More"} disabled={map === null} > ); } export default MapSettings;