2020-06-25 18:56:51 +10:00
|
|
|
import React, { useState, useEffect } from "react";
|
|
|
|
|
import { Box, Flex } from "theme-ui";
|
|
|
|
|
|
|
|
|
|
import RadioIconButton from "./RadioIconButton";
|
|
|
|
|
|
|
|
|
|
// Section of map tools with the option to collapse into a vertical list
|
|
|
|
|
function ToolSection({ collapse, tools, onToolClick }) {
|
|
|
|
|
const [showMore, setShowMore] = useState(false);
|
|
|
|
|
const [collapsedTool, setCollapsedTool] = useState();
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const selectedTool = tools.find((tool) => tool.isSelected);
|
|
|
|
|
if (selectedTool) {
|
|
|
|
|
setCollapsedTool(selectedTool);
|
|
|
|
|
} else {
|
2020-07-18 10:46:18 +10:00
|
|
|
// No selected tool, deselect if we have a tool or get the first tool if not
|
|
|
|
|
setCollapsedTool((prevTool) =>
|
|
|
|
|
prevTool ? { ...prevTool, isSelected: false } : tools[0]
|
2020-06-25 18:56:51 +10:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}, [tools]);
|
|
|
|
|
|
|
|
|
|
function handleToolClick(tool) {
|
|
|
|
|
if (collapse && tool.isSelected) {
|
|
|
|
|
setShowMore(!showMore);
|
|
|
|
|
} else if (collapse && !tool.isSelected) {
|
|
|
|
|
setShowMore(false);
|
|
|
|
|
}
|
|
|
|
|
onToolClick(tool);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function renderTool(tool) {
|
|
|
|
|
return (
|
|
|
|
|
<RadioIconButton
|
|
|
|
|
title={tool.title}
|
|
|
|
|
onClick={() => handleToolClick(tool)}
|
|
|
|
|
key={tool.id}
|
|
|
|
|
isSelected={tool.isSelected}
|
|
|
|
|
>
|
|
|
|
|
{tool.icon}
|
|
|
|
|
</RadioIconButton>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (collapse) {
|
|
|
|
|
if (!collapsedTool) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return (
|
|
|
|
|
<Box sx={{ position: "relative" }}>
|
|
|
|
|
{renderTool(collapsedTool)}
|
|
|
|
|
{/* Render chevron when more tools is available */}
|
|
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
width: 0,
|
|
|
|
|
height: 0,
|
|
|
|
|
borderTop: "4px solid",
|
|
|
|
|
borderTopColor: "text",
|
|
|
|
|
borderLeft: "4px solid transparent",
|
|
|
|
|
borderRight: "4px solid transparent",
|
|
|
|
|
transform: "translate(0, -4px) rotate(-45deg)",
|
|
|
|
|
bottom: 0,
|
|
|
|
|
right: 0,
|
|
|
|
|
pointerEvents: "none",
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
{showMore && (
|
|
|
|
|
<Flex
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
top: "40px",
|
|
|
|
|
left: "50%",
|
|
|
|
|
transform: "translateX(-50%)",
|
|
|
|
|
flexDirection: "column",
|
|
|
|
|
borderRadius: "4px",
|
|
|
|
|
}}
|
|
|
|
|
bg="overlay"
|
|
|
|
|
p={2}
|
|
|
|
|
>
|
|
|
|
|
{tools.filter((tool) => !tool.isSelected).map(renderTool)}
|
|
|
|
|
</Flex>
|
|
|
|
|
)}
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
return tools.map((tool) => (
|
|
|
|
|
<RadioIconButton
|
|
|
|
|
title={tool.title}
|
|
|
|
|
onClick={() => handleToolClick(tool)}
|
|
|
|
|
key={tool.id}
|
|
|
|
|
isSelected={tool.isSelected}
|
|
|
|
|
>
|
|
|
|
|
{tool.icon}
|
|
|
|
|
</RadioIconButton>
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-26 12:23:06 +10:00
|
|
|
ToolSection.defaultProps = {
|
|
|
|
|
collapse: false,
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-25 18:56:51 +10:00
|
|
|
export default ToolSection;
|