Skip to content

Commit 1e829c7

Browse files
Refactor
1 parent 71b9bf4 commit 1e829c7

File tree

4 files changed

+61
-56
lines changed

4 files changed

+61
-56
lines changed

src/stories/HtmlToReactWrapper.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ReactNode } from 'react';
2+
import StoryWrapper from './StoryWrapper.js';
3+
4+
interface HtmlToReactWrapperProps {
5+
htmlEl: HTMLElement;
6+
children?: ReactNode;
7+
}
8+
9+
export const HtmlToReactWrapper = ({
10+
htmlEl,
11+
children,
12+
}: HtmlToReactWrapperProps) => {
13+
const elementId = 'story-wrapper';
14+
const waitForElementLoaded = () => {
15+
const targetEl = document.getElementById(elementId);
16+
if (!targetEl) {
17+
window.setTimeout(waitForElementLoaded, 500);
18+
return;
19+
}
20+
targetEl.replaceChildren(htmlEl);
21+
};
22+
waitForElementLoaded();
23+
return (
24+
<>
25+
{children}
26+
<StoryWrapper id={elementId}>
27+
<p>Loading...</p>
28+
</StoryWrapper>
29+
</>
30+
);
31+
};

src/stories/StoryWrapper.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { ReactNode } from 'react';
22

3-
const StoryWrapper = (props: { children: ReactNode }) => (
3+
const StoryWrapper = (props: { children: ReactNode; id?: string }) => (
44
<div
5+
id={props.id}
56
style={{
67
display: 'flex',
78
flexDirection: 'column',

src/stories/createMakeCodeRenderBlocks.stories.tsx

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
projectWithTwoExtensions,
1515
} from './fixtures.js';
1616
import { Project } from '../vanilla/pxt.js';
17+
import { HtmlToReactWrapper } from './HtmlToReactWrapper.js';
1718

1819
interface StoryArgs {
1920
options: MakeCodeRenderBlocksOptions | undefined;
@@ -28,34 +29,26 @@ export default meta;
2829

2930
type Story = StoryObj<StoryArgs>;
3031

31-
const renderBlocks = (args: StoryArgs) => {
32-
const elementId = 'story-wrapper';
32+
const createMakeCodeBlockHTMLElement = (args: StoryArgs): HTMLElement => {
3333
const renderer = createMakeCodeRenderBlocks(args.options ?? {});
3434
renderer.initialize();
35-
const waitForElementLoaded = () => {
36-
const targetEl = document.getElementById(elementId);
37-
if (!targetEl) {
38-
window.setTimeout(waitForElementLoaded, 500);
39-
return;
35+
const div = document.createElement('div');
36+
renderer.renderBlocks({ code: args.project }).then((r) => {
37+
if (r.svg) {
38+
div.innerHTML = `
39+
<div>
40+
${r.svg}
41+
</div>
42+
`;
4043
}
41-
renderer.renderBlocks({ code: args.project }).then((r) => {
42-
if (r.svg) {
43-
targetEl.innerHTML = `
44-
<div>
45-
${r.svg}
46-
</div>
47-
`;
48-
}
49-
});
50-
};
51-
waitForElementLoaded();
52-
return (
53-
<div id={elementId}>
54-
<p>Loading...</p>
55-
</div>
56-
);
44+
});
45+
return div;
5746
};
5847

48+
const renderBlocks = (args: StoryArgs) => (
49+
<HtmlToReactWrapper htmlEl={createMakeCodeBlockHTMLElement(args)} />
50+
);
51+
5952
export const Simple: Story = {
6053
render: renderBlocks,
6154
args: { project: project },

src/stories/makeCodeFrameDriver.stories.tsx

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from '../vanilla/makecode-frame-driver.js';
77
import { Project } from '../vanilla/pxt.js';
88
import { defaultMakeCodeProject } from '../vanilla/examples.js';
9+
import { HtmlToReactWrapper } from './HtmlToReactWrapper.js';
910

1011
interface StoryArgs {
1112
options?: {
@@ -26,9 +27,15 @@ export default meta;
2627

2728
type Story = StoryObj<StoryArgs>;
2829

29-
const renderEditor = (args: StoryArgs) => {
30-
const elementId = 'story-wrapper';
30+
const toolbarStyles = {
31+
fontFamily: 'sans-serif',
32+
display: 'flex',
33+
flexWrap: 'wrap',
34+
gap: '5px',
35+
margin: '10px 0',
36+
} as const;
3137

38+
const renderEditor = (args: StoryArgs) => {
3239
// Create an iframe element.
3340
const iframe = document.createElement('iframe');
3441
iframe.allow = 'usb; autoplay; camera; microphone;';
@@ -43,13 +50,6 @@ const renderEditor = (args: StoryArgs) => {
4350
iframe.height = '100%';
4451

4552
const savedProjects: Map<string, Project> = new Map();
46-
const toolbarStyles = {
47-
fontFamily: 'sans-serif',
48-
display: 'flex',
49-
flexWrap: 'wrap',
50-
gap: '5px',
51-
margin: '10px 0',
52-
} as const;
5353

5454
// Create and initialise an instance of MakeCodeFrameDriver.
5555
const driverRef = new MakeCodeFrameDriver(
@@ -71,19 +71,10 @@ const renderEditor = (args: StoryArgs) => {
7171
() => iframe
7272
);
7373

74-
const waitForElementLoaded = () => {
75-
const targetEl = document.getElementById(elementId);
76-
if (!targetEl) {
77-
window.setTimeout(waitForElementLoaded, 500);
78-
return;
79-
}
80-
targetEl.replaceChildren(iframe);
81-
driverRef.initialize();
82-
};
83-
waitForElementLoaded();
74+
driverRef.initialize();
8475

8576
return (
86-
<>
77+
<HtmlToReactWrapper htmlEl={iframe}>
8778
<div style={{ display: 'flex', flexDirection: 'column' }}>
8879
<div style={toolbarStyles}>
8980
<button onClick={() => driverRef.switchJavascript()}>
@@ -264,18 +255,7 @@ const renderEditor = (args: StoryArgs) => {
264255
</button>
265256
</div>
266257
</div>
267-
<div
268-
id={elementId}
269-
style={{
270-
display: 'flex',
271-
flexDirection: 'column',
272-
width: '100%',
273-
height: 700,
274-
}}
275-
>
276-
<p>Loading...</p>
277-
</div>
278-
</>
258+
</HtmlToReactWrapper>
279259
);
280260
};
281261

0 commit comments

Comments
 (0)