Skip to content
This repository was archived by the owner on Mar 17, 2024. It is now read-only.

Commit 8b5d9ee

Browse files
committed
refactor web module
1 parent 1a307ca commit 8b5d9ee

File tree

5 files changed

+84
-47
lines changed

5 files changed

+84
-47
lines changed

src/web/Graphviz.tsx

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
import React, { FC, useState, useEffect } from 'react';
22
import { Graphviz } from './Graphviz';
3-
import { Digraph } from '../components/Digraph';
4-
import { Node } from '../components/Node';
5-
import { Edge } from '../components/Edge';
6-
import { Subgraph } from '../components/Subgraph';
7-
import { DOT } from '../components/HtmlLike';
3+
import { Digraph } from '../../components/Digraph';
4+
import { Node } from '../../components/Node';
5+
import { Edge } from '../../components/Edge';
6+
import { Subgraph } from '../../components/Subgraph';
7+
import { DOT } from '../../components/HtmlLike';
88

99
export default { title: 'Graphviz' };
1010

11+
export const Small: FC = () => (
12+
<Graphviz>
13+
<Digraph>
14+
<Node id="n1" />
15+
<Node id="n2" />
16+
<Node id="n3" />
17+
<Edge targets={['n1', 'n2', 'n3']} />
18+
<Edge targets={['n1', 'n3']} />
19+
</Digraph>
20+
</Graphviz>
21+
);
22+
1123
export const Example: FC = () => (
1224
<Graphviz>
1325
<Digraph

src/web/components/Graphviz.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* eslint-disable react/no-danger */
2+
/* eslint-disable react/prop-types */
3+
import React, { FC, ReactElement, useMemo } from 'react';
4+
import { renderToDot } from '../../renderer/render';
5+
import { useRendered, Engine, Image, File } from '../hooks/rendered';
6+
7+
type Props = {
8+
children: ReactElement;
9+
engine?: Engine;
10+
images?: Image[];
11+
files?: File[];
12+
};
13+
14+
export const Graphviz: FC<Props> = ({ children, engine, images, files }) => {
15+
const dot = useMemo(() => renderToDot(children), [children]);
16+
const rendered = useRendered(dot, engine, 'svg', { images, files });
17+
const svg = useMemo((): { __html: string } | undefined => {
18+
if (rendered) {
19+
return {
20+
__html: rendered,
21+
};
22+
}
23+
return undefined;
24+
}, [rendered]);
25+
return <div dangerouslySetInnerHTML={svg} />;
26+
};
27+
28+
Graphviz.defaultProps = {
29+
images: [],
30+
files: [],
31+
};

src/web/hooks/rendered.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { useState, useEffect } from 'react';
2+
import { graphviz } from '@hpcc-js/wasm';
3+
4+
export type Format = 'svg' | 'dot' | 'json' | 'dot_json' | 'xdot_json';
5+
6+
export type Engine = 'circo' | 'dot' | 'fdp' | 'neato' | 'osage' | 'patchwork' | 'twopi';
7+
export type Image = {
8+
path: string;
9+
width: string;
10+
height: string;
11+
};
12+
export type File = {
13+
path: string;
14+
data: string;
15+
};
16+
17+
export const useRendered = (
18+
dot: string,
19+
engine?: Engine,
20+
format?: Format,
21+
ext?: {
22+
images?: Image[];
23+
files?: File[];
24+
},
25+
): string | undefined => {
26+
const [rendered, setRendered] = useState<string>();
27+
useEffect(() => {
28+
(async (): Promise<void> => {
29+
const result = await graphviz.layout(dot, format, engine, ext);
30+
setRendered(result);
31+
})();
32+
}, [dot, engine, format, ext, setRendered]);
33+
return rendered;
34+
};

src/web/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './hooks/rendered';
2+
export * from './components/Graphviz';

0 commit comments

Comments
 (0)