Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 935ed9a

Browse files
committedNov 10, 2024·
Refactor Graphviz component and improve code formatting
1 parent 595eae9 commit 935ed9a

File tree

5 files changed

+43
-43
lines changed

5 files changed

+43
-43
lines changed
 

‎src/components/Graphviz/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// import { type GraphvizOptions, graphviz } from 'd3-graphviz';
21
import { translate } from '@docusaurus/Translate';
32
import type { Engine } from '@hpcc-js/wasm-graphviz';
4-
import { useGraphviz } from '@site/src/contexts/Graphviz';
53
import { useEffect, useState } from 'react';
64

5+
import { useGraphviz } from '@site/src/contexts/Graphviz';
6+
77
interface GraphvizProps {
88
/**
99
* A string containing a graph representation using the Graphviz DOT language.

‎src/components/TSGraphvizPreviewEditor/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function TSGraphvizPreviewEditor({ script, className }: Props): JSX.Element {
2727
if (!dot && container.status === 'ready') {
2828
container.run(script).then(setDot);
2929
}
30-
}, [dot, container]);
30+
}, [dot, container.status, container.run, script, setDot]);
3131

3232
const [tsCode, setTsCode] = useState<string>(script);
3333
const onChangeCallback = useCallback(

‎src/contexts/Graphviz/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
useState,
1010
} from 'react';
1111

12-
const GraphVizContext = createContext<Graphviz>(null);
12+
const GraphVizContext = createContext<Graphviz | null>(null);
1313

1414
type GraphvizAPI = {
1515
status: 'loading' | 'ready';

‎src/contexts/WebContainer/index.tsx

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface Container {
1616
run(script: string): Promise<string>;
1717
}
1818

19-
const ContainerContext = createContext<Container | null>(null);
19+
const ContainerContext = createContext<WebContainer | null>(null);
2020

2121
const SCRIPT = `
2222
const { Script, createContext } = require('node:vm');
@@ -61,13 +61,11 @@ type Status = 'booted' | 'installing' | 'ready' | 'processing';
6161
export const ContainerProvider: FC<{ children: ReactNode }> = memo(
6262
({ children }) => {
6363
const [instance, setInstance] = useState<WebContainer>();
64-
const [status, setStatus] = useState<Status>();
6564
useEffect(() => {
6665
(async () => {
6766
const instance = await WebContainer.boot({
6867
coep: 'none',
6968
});
70-
setStatus('booted');
7169
await instance.mount({
7270
'package.json': {
7371
file: {
@@ -98,50 +96,51 @@ export const ContainerProvider: FC<{ children: ReactNode }> = memo(
9896
});
9997
setInstance(instance);
10098
})();
101-
}, [setStatus, setInstance]);
102-
103-
const init = useCallback(async () => {
104-
if (!instance || status !== 'booted') {
105-
return;
106-
}
107-
setStatus('installing');
108-
const install = await instance.spawn('npm', ['install']);
109-
if ((await install.exit) === 0) {
110-
setStatus('ready');
111-
}
112-
}, [instance, status, setStatus]);
113-
114-
const run = useCallback(
115-
async (script: string) => {
116-
console.log('run', script, instance, status);
117-
if (!instance || status !== 'ready') {
118-
return;
119-
}
120-
setStatus('processing');
121-
try {
122-
await instance.fs.writeFile('./diagram.ts', script);
123-
const exec = await instance.spawn('node', ['./main.js']);
124-
console.log('exit', await exec.exit);
125-
return await instance.fs.readFile('./diagram.dot', 'utf8');
126-
} finally {
127-
await instance.fs.rm('./diagram.ts', { force: true });
128-
await instance.fs.rm('./diagram.dot', { force: true });
129-
setStatus('ready');
130-
}
131-
},
132-
[instance, status, setStatus],
133-
);
99+
}, [setInstance]);
134100

135101
return (
136-
<ContainerContext.Provider value={{ status, init, run }}>
102+
<ContainerContext.Provider value={instance}>
137103
{children}
138104
</ContainerContext.Provider>
139105
);
140106
},
141107
);
142108

143109
export const useContainer = (): Container => {
144-
const { status, init, run } = useContext(ContainerContext);
110+
const instance = useContext(ContainerContext);
111+
const [status, setStatus] = useState<Status>('booted');
112+
const init = useCallback(async () => {
113+
if (!instance || status !== 'booted') {
114+
return;
115+
}
116+
setStatus('installing');
117+
const install = await instance.spawn('npm', ['install']);
118+
if ((await install.exit) === 0) {
119+
setStatus('ready');
120+
}
121+
}, [instance, status, setStatus]);
122+
123+
const run = useCallback(
124+
async (script: string) => {
125+
console.log('run', script, instance, status);
126+
if (!instance || status !== 'ready') {
127+
return;
128+
}
129+
setStatus('processing');
130+
try {
131+
await instance.fs.writeFile('./diagram.ts', script);
132+
const exec = await instance.spawn('node', ['./main.js']);
133+
console.log('exit', await exec.exit);
134+
return await instance.fs.readFile('./diagram.dot', 'utf8');
135+
} finally {
136+
await instance.fs.rm('./diagram.ts', { force: true });
137+
await instance.fs.rm('./diagram.dot', { force: true });
138+
setStatus('ready');
139+
}
140+
},
141+
[instance, status, setStatus],
142+
);
143+
145144
useEffect(() => {
146145
if (status === 'booted') {
147146
init();

‎src/theme/Root.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import type { ReactNode } from 'react';
33
import { GraphvizProvider } from '@site/src/contexts/Graphviz';
44
import { ContainerProvider } from '@site/src/contexts/WebContainer';
55

6-
const Root = ({ children }: { children: ReactNode }): JSX.Element => { return (
6+
const Root = ({ children }: { children: ReactNode }): JSX.Element => {
7+
return (
78
<ContainerProvider>
89
<GraphvizProvider>{children}</GraphvizProvider>
910
</ContainerProvider>

0 commit comments

Comments
 (0)
Please sign in to comment.