|
import React from "react"; |
|
import { useTheme } from "styled-components"; |
|
import { JSONTree } from "react-json-tree"; |
|
import useJson from "src/store/useJson"; |
|
import { EditModal } from "./EditModal"; |
|
import { Label } from "./Label"; |
|
import { Value } from "./Value"; |
|
|
|
export const TreeView = () => { |
|
const theme = useTheme(); |
|
const json = useJson(state => state.json); |
|
const [opened, setOpened] = React.useState(false); |
|
const [selectedValue, setSelectedValue] = React.useState<string | number | null>(null); |
|
const [path, setPath] = React.useState<(string | number)[]>([]); |
|
const [value, setValue] = React.useState(""); |
|
const [errorMessage, setErrorMessage] = React.useState<string | null>(null); |
|
|
|
return ( |
|
<> |
|
<JSONTree |
|
hideRoot |
|
data={JSON.parse(json)} |
|
valueRenderer={(valueAsString, value) => <Value {...{ valueAsString, value }} />} |
|
labelRenderer={(keyPath, nodeType) => ( |
|
<Label |
|
{...{ |
|
keyPath, |
|
nodeType, |
|
setOpened, |
|
setSelectedValue, |
|
setPath, |
|
setValue, |
|
}} |
|
/> |
|
)} |
|
theme={{ |
|
extend: { |
|
overflow: "scroll", |
|
height: "100%", |
|
scheme: "monokai", |
|
author: "wimer hazenberg (http://www.monokai.nl)", |
|
base00: theme.GRID_BG_COLOR, |
|
}, |
|
}} |
|
/> |
|
<EditModal |
|
{...{ |
|
opened, |
|
setOpened, |
|
selectedValue, |
|
path, |
|
value, |
|
setValue, |
|
errorMessage, |
|
setErrorMessage, |
|
}} |
|
/> |
|
</> |
|
); |
|
}; |
|
|