129 lines
3.5 KiB
TypeScript
129 lines
3.5 KiB
TypeScript
|
import React, { useState } from "react"
|
||
|
import { Center, Flex, Text } from "@chakra-ui/react"
|
||
|
|
||
|
import { Icon } from "../Icon/Icon"
|
||
|
|
||
|
export const SettingsMenu = (props) => {
|
||
|
const [show, setShow] = useState(false)
|
||
|
|
||
|
const showMenu = React.useCallback(() => {
|
||
|
setShow(true)
|
||
|
}, [])
|
||
|
|
||
|
const hideMenu = React.useCallback(() => {
|
||
|
setShow(false)
|
||
|
}, [])
|
||
|
|
||
|
const basePadding = React.useMemo(() => {
|
||
|
return 4
|
||
|
}, [])
|
||
|
|
||
|
const types = React.useMemo(() => {
|
||
|
const ret = ["any", "object", "array", "string", "number", "boolean"]
|
||
|
return ret
|
||
|
}, [])
|
||
|
|
||
|
const onChangeType = React.useCallback(
|
||
|
(type) => {
|
||
|
props?.onChangeType?.(type)
|
||
|
},
|
||
|
[props?.onChangeType]
|
||
|
)
|
||
|
|
||
|
const iconSize = 10
|
||
|
|
||
|
return (
|
||
|
<Center
|
||
|
position="relative"
|
||
|
opacity={props?.opacity}
|
||
|
transition={props?.transition || "all 0.2s ease-in-out"}
|
||
|
onMouseEnter={showMenu}
|
||
|
onMouseLeave={hideMenu}
|
||
|
>
|
||
|
<Flex
|
||
|
paddingLeft={1}
|
||
|
// opacity={showContextIcon ? 1 : 0}
|
||
|
cursor="pointer"
|
||
|
transition="all 0.2s ease-in-out"
|
||
|
// onClick={deleteValue}
|
||
|
>
|
||
|
<Icon name="wizard" size={7}></Icon>
|
||
|
</Flex>
|
||
|
<Flex
|
||
|
position="absolute"
|
||
|
zIndex={999}
|
||
|
top="100%"
|
||
|
left={0}
|
||
|
flexDirection="column"
|
||
|
opacity={show ? 1 : 0}
|
||
|
pointerEvents={show ? "all" : "none"}
|
||
|
>
|
||
|
<Flex
|
||
|
flexDirection="column"
|
||
|
// rowGap={basePadding / 3}
|
||
|
background="greys.lightt"
|
||
|
borderRadius={4}
|
||
|
boxShadow={props?.boxShadow || "0px 2px 7px 0px rgba(0,0,0,0.2)"}
|
||
|
cursor="pointer"
|
||
|
paddingY={basePadding}
|
||
|
>
|
||
|
<Flex
|
||
|
alignItems="center"
|
||
|
flexDirection="row"
|
||
|
_hover={{
|
||
|
background: "greys.light",
|
||
|
}}
|
||
|
paddingX={basePadding * 1}
|
||
|
paddingY={basePadding / 2}
|
||
|
>
|
||
|
<Icon marginBottom="-2px" name="cyclone" size={iconSize}></Icon>
|
||
|
<Text marginTop="-2px" paddingLeft={2} fontSize="xs">
|
||
|
Types
|
||
|
</Text>
|
||
|
</Flex>
|
||
|
<Flex
|
||
|
flexDirection="column"
|
||
|
// rowGap={basePadding}
|
||
|
background="greys.lightt"
|
||
|
cursor="pointer"
|
||
|
>
|
||
|
{types.map((type, idx) => {
|
||
|
const ret = (
|
||
|
<Flex
|
||
|
key={props?.uuid + props?.fullPath + "-type-menu-" + idx}
|
||
|
width="100%"
|
||
|
_hover={{
|
||
|
"&>div": {
|
||
|
background: "greys.light",
|
||
|
},
|
||
|
}}
|
||
|
onClick={() => onChangeType(type?.key || type)}
|
||
|
paddingY={1}
|
||
|
>
|
||
|
<Flex
|
||
|
alignItems="center"
|
||
|
flexDirection="row"
|
||
|
width="100%"
|
||
|
paddingX={basePadding * 2}
|
||
|
paddingY={basePadding / 2}
|
||
|
>
|
||
|
<Icon
|
||
|
marginBottom="-2px"
|
||
|
name={type?.icon || type?.key || type?.label || type}
|
||
|
size={iconSize}
|
||
|
></Icon>
|
||
|
<Text marginTop="-2px" paddingLeft={2} fontSize="xs">
|
||
|
{type?.label || type?.key || type}
|
||
|
</Text>
|
||
|
</Flex>
|
||
|
</Flex>
|
||
|
)
|
||
|
return ret
|
||
|
})}
|
||
|
</Flex>
|
||
|
</Flex>
|
||
|
</Flex>
|
||
|
</Center>
|
||
|
)
|
||
|
}
|