mirror of
https://github.com/AykutSarac/jsoncrack.com.git
synced 2025-01-20 05:12:54 +08:00
code cleanup
This commit is contained in:
parent
d16b04e35a
commit
242e16e67a
@ -1,124 +0,0 @@
|
||||
import React from "react";
|
||||
import { Label, Node, Port, NodeProps } from "reaflow";
|
||||
import styled from "styled-components";
|
||||
|
||||
const StyledTextWrapper = styled.div`
|
||||
position: absolute;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 12px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
`;
|
||||
|
||||
const StyledText = styled.pre<{ width: number; height: number }>`
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
width: ${({ width }) => width};
|
||||
height: ${({ height }) => height};
|
||||
color: ${({ theme }) => theme.SILVER};
|
||||
`;
|
||||
|
||||
const StyledForeignObject = styled.foreignObject<{
|
||||
width: number;
|
||||
height: number;
|
||||
}>`
|
||||
position: "relative" !important;
|
||||
pointer-events: "none" !important;
|
||||
width: ${({ width }) => width + "px"};
|
||||
height: ${({ height }) => height + "px"};
|
||||
`;
|
||||
|
||||
const StyledKey = styled.span<{
|
||||
bond?: boolean;
|
||||
arrayValue?: boolean;
|
||||
}>`
|
||||
color: ${({ theme, bond, arrayValue }) =>
|
||||
bond ? theme.SEAGREEN : arrayValue ? theme.ORANGE : theme.BLURPLE};
|
||||
`;
|
||||
|
||||
const baseLabelStyle = {
|
||||
fill: "transparent",
|
||||
stroke: "transparent",
|
||||
strokeWidth: 0,
|
||||
};
|
||||
|
||||
const basePortStyle = {
|
||||
fill: "black",
|
||||
};
|
||||
|
||||
export const CustomNode = (nodeProps: NodeProps) => {
|
||||
const { properties: data } = nodeProps;
|
||||
|
||||
return (
|
||||
<Node
|
||||
{...nodeProps}
|
||||
label={<Label style={baseLabelStyle} />}
|
||||
port={<Port style={basePortStyle} rx={10} ry={10} />}
|
||||
>
|
||||
{(nodeProps: NodeProps) => {
|
||||
const { width, height } = nodeProps;
|
||||
|
||||
if (data.text instanceof Object) {
|
||||
const entries = Object.entries(data.text);
|
||||
|
||||
if (Object.keys(data.text).every((val) => !isNaN(+val))) {
|
||||
const text = Object.values(data.text).join("");
|
||||
|
||||
return (
|
||||
<StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<StyledTextWrapper>
|
||||
<StyledText width={width} height={height}>
|
||||
<StyledKey arrayValue>{text}</StyledKey>
|
||||
</StyledText>
|
||||
</StyledTextWrapper>
|
||||
</StyledForeignObject>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<StyledTextWrapper>
|
||||
<StyledText width={width} height={height}>
|
||||
{entries.map(
|
||||
(val, idx) =>
|
||||
val[1] !== null && (
|
||||
<div
|
||||
key={idx}
|
||||
style={{
|
||||
height: "fit-content",
|
||||
overflow: "hidden",
|
||||
textOverflow: "ellipsis",
|
||||
whiteSpace: "nowrap",
|
||||
padding: "0 auto",
|
||||
width: width - 20,
|
||||
}}
|
||||
>
|
||||
<StyledKey>{val[0]}: </StyledKey>
|
||||
{val[1]}
|
||||
</div>
|
||||
)
|
||||
)}
|
||||
</StyledText>
|
||||
</StyledTextWrapper>
|
||||
</StyledForeignObject>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<StyledTextWrapper>
|
||||
<StyledText width={width} height={height}>
|
||||
<StyledKey bond>{data.text}</StyledKey>
|
||||
</StyledText>
|
||||
</StyledTextWrapper>
|
||||
</StyledForeignObject>
|
||||
);
|
||||
}}
|
||||
</Node>
|
||||
);
|
||||
};
|
17
src/containers/LiveEditor/CustomNode/ArrayNode.tsx
Normal file
17
src/containers/LiveEditor/CustomNode/ArrayNode.tsx
Normal file
@ -0,0 +1,17 @@
|
||||
import React from "react";
|
||||
import { CustomNodeProps } from ".";
|
||||
import * as Styled from "./styles";
|
||||
|
||||
const ArrayNode: React.FC<CustomNodeProps<string>> = ({ width, height, value }) => {
|
||||
return (
|
||||
<Styled.StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<Styled.StyledTextWrapper>
|
||||
<Styled.StyledText width={width} height={height}>
|
||||
<Styled.StyledKey arrayValue>{value}</Styled.StyledKey>
|
||||
</Styled.StyledText>
|
||||
</Styled.StyledTextWrapper>
|
||||
</Styled.StyledForeignObject>
|
||||
);
|
||||
};
|
||||
|
||||
export default ArrayNode;
|
17
src/containers/LiveEditor/CustomNode/BondNode.tsx
Normal file
17
src/containers/LiveEditor/CustomNode/BondNode.tsx
Normal file
@ -0,0 +1,17 @@
|
||||
import React from "react";
|
||||
import { CustomNodeProps } from ".";
|
||||
import * as Styled from "./styles";
|
||||
|
||||
const BondNode: React.FC<CustomNodeProps<string>> = ({ width, height, value }) => {
|
||||
return (
|
||||
<Styled.StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<Styled.StyledTextWrapper>
|
||||
<Styled.StyledText width={width} height={height}>
|
||||
<Styled.StyledKey bond>{value}</Styled.StyledKey>
|
||||
</Styled.StyledText>
|
||||
</Styled.StyledTextWrapper>
|
||||
</Styled.StyledForeignObject>
|
||||
);
|
||||
};
|
||||
|
||||
export default BondNode;
|
29
src/containers/LiveEditor/CustomNode/ObjectNode.tsx
Normal file
29
src/containers/LiveEditor/CustomNode/ObjectNode.tsx
Normal file
@ -0,0 +1,29 @@
|
||||
import React from "react";
|
||||
import { CustomNodeProps } from ".";
|
||||
import * as Styled from "./styles";
|
||||
|
||||
const ObjectNode: React.FC<CustomNodeProps<[string, unknown][]>> = ({
|
||||
width,
|
||||
height,
|
||||
value,
|
||||
}) => {
|
||||
return (
|
||||
<Styled.StyledForeignObject width={width} height={height} x={0} y={0}>
|
||||
<Styled.StyledTextWrapper>
|
||||
<Styled.StyledText width={width} height={height}>
|
||||
{value.map(
|
||||
(val, idx) =>
|
||||
val[1] && (
|
||||
<Styled.StyledRow key={idx} width={width}>
|
||||
<Styled.StyledKey>{val[0]}: </Styled.StyledKey>
|
||||
{val[1]}
|
||||
</Styled.StyledRow>
|
||||
)
|
||||
)}
|
||||
</Styled.StyledText>
|
||||
</Styled.StyledTextWrapper>
|
||||
</Styled.StyledForeignObject>
|
||||
);
|
||||
};
|
||||
|
||||
export default ObjectNode;
|
49
src/containers/LiveEditor/CustomNode/index.tsx
Normal file
49
src/containers/LiveEditor/CustomNode/index.tsx
Normal file
@ -0,0 +1,49 @@
|
||||
import React from "react";
|
||||
import { Label, Node, Port, NodeProps } from "reaflow";
|
||||
import ArrayNode from "./ArrayNode";
|
||||
import BondNode from "./BondNode";
|
||||
import ObjectNode from "./ObjectNode";
|
||||
|
||||
export interface CustomNodeProps<T> {
|
||||
width: number;
|
||||
height: number;
|
||||
value: T;
|
||||
}
|
||||
|
||||
const baseLabelStyle = {
|
||||
fill: "transparent",
|
||||
stroke: "transparent",
|
||||
strokeWidth: 0,
|
||||
};
|
||||
|
||||
const basePortStyle = {
|
||||
fill: "black",
|
||||
};
|
||||
|
||||
export const CustomNode = (nodeProps: NodeProps) => {
|
||||
const { properties: data } = nodeProps;
|
||||
|
||||
return (
|
||||
<Node
|
||||
{...nodeProps}
|
||||
label={<Label style={baseLabelStyle} />}
|
||||
port={<Port style={basePortStyle} rx={10} ry={10} />}
|
||||
>
|
||||
{(nodeProps: NodeProps) => {
|
||||
const { width, height } = nodeProps;
|
||||
|
||||
if (data.text instanceof Object) {
|
||||
if (Object.keys(data.text).every((val) => !isNaN(+val))) {
|
||||
const text = Object.values(data.text).join("");
|
||||
return <ArrayNode width={width} height={height} value={text} />;
|
||||
}
|
||||
|
||||
const entries = Object.entries(data.text);
|
||||
return <ObjectNode width={width} height={height} value={entries} />;
|
||||
}
|
||||
|
||||
return <BondNode width={width} height={height} value={data.text} />;
|
||||
}}
|
||||
</Node>
|
||||
);
|
||||
};
|
49
src/containers/LiveEditor/CustomNode/styles.tsx
Normal file
49
src/containers/LiveEditor/CustomNode/styles.tsx
Normal file
@ -0,0 +1,49 @@
|
||||
import styled from "styled-components";
|
||||
|
||||
export const StyledTextWrapper = styled.div`
|
||||
position: absolute;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 12px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
`;
|
||||
|
||||
export const StyledText = styled.pre<{ width: number; height: number }>`
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
width: ${({ width }) => width};
|
||||
height: ${({ height }) => height};
|
||||
color: ${({ theme }) => theme.SILVER};
|
||||
`;
|
||||
|
||||
export const StyledForeignObject = styled.foreignObject<{
|
||||
width: number;
|
||||
height: number;
|
||||
}>`
|
||||
position: "relative" !important;
|
||||
pointer-events: "none" !important;
|
||||
width: ${({ width }) => width + "px"};
|
||||
height: ${({ height }) => height + "px"};
|
||||
`;
|
||||
|
||||
export const StyledKey = styled.span<{
|
||||
bond?: boolean;
|
||||
arrayValue?: boolean;
|
||||
}>`
|
||||
color: ${({ theme, bond, arrayValue }) =>
|
||||
bond ? theme.SEAGREEN : arrayValue ? theme.ORANGE : theme.BLURPLE};
|
||||
`;
|
||||
|
||||
export const StyledRow = styled.div<{ width: number }>`
|
||||
height: fit-content;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
padding: 0 auto;
|
||||
width: ${({ width }) => `${width - 20}px`};
|
||||
`;
|
Loading…
x
Reference in New Issue
Block a user