xinnni's picture
Upload 146 files
f909d7c verified
import React from "react";
import { Button, HoverCard } from "@mantine/core";
import { styled, DefaultTheme } from "styled-components";
import _get from "lodash.get";
import { VscEdit } from "react-icons/vsc";
import { KeyPath } from "react-json-tree";
import useJson from "src/store/useJson";
interface LabelProps {
keyPath: KeyPath;
nodeType: string;
setOpened: React.Dispatch<React.SetStateAction<boolean>>;
setSelectedValue: React.Dispatch<React.SetStateAction<string | number | null>>;
setPath: React.Dispatch<React.SetStateAction<(string | number)[]>>;
setValue: React.Dispatch<React.SetStateAction<string>>;
}
function getLabelColor({ $type, theme }: { $type?: string; theme: DefaultTheme }) {
if ($type === "Object") return theme.NODE_COLORS.PARENT_OBJ;
if ($type === "Array") return theme.NODE_COLORS.PARENT_ARR;
return theme.NODE_COLORS.PARENT_OBJ;
}
const StyledLabel = styled.span<{ $nodeType?: string }>`
color: ${({ theme, $nodeType }) => getLabelColor({ theme, $type: $nodeType })};
&:hover {
filter: brightness(1.5);
transition: filter 0.2s ease-in-out;
}
`;
export const Label = ({
keyPath,
nodeType,
setOpened,
setSelectedValue,
setPath,
setValue,
}: LabelProps) => {
const getJson = useJson(state => state.getJson);
return (
<HoverCard shadow="sm" openDelay={50} closeDelay={250} withArrow position="left">
<HoverCard.Target>
<StyledLabel $nodeType={nodeType}>{keyPath[0]}:</StyledLabel>
</HoverCard.Target>
<HoverCard.Dropdown py={4}>
<Button
variant="transparent"
size="xs"
onClick={() => {
setOpened(true);
setSelectedValue(keyPath[0]);
const path = keyPath.toReversed();
const value = _get(JSON.parse(getJson()), path);
setPath(path);
setValue(JSON.stringify(value));
}}
leftSection={<VscEdit size="12" />}
>
Edit
</Button>
</HoverCard.Dropdown>
</HoverCard>
);
};