Skip to content

Commit 88a7cd0

Browse files
Setup VanillaJS stories
1 parent 0016cea commit 88a7cd0

File tree

5 files changed

+196
-3
lines changed

5 files changed

+196
-3
lines changed

docs/vanilla.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
} from "@microbit/makecode-embed/vanilla";
3737

3838
// Set up an iframe element.
39-
let iframe = document.createElement("iframe");
39+
const iframe = document.createElement("iframe");
4040
iframe.allow = "usb; autoplay; camera; microphone;";
4141
iframe.src = createMakeCodeURL(
4242
"https://makecode.microbit.org",
@@ -53,7 +53,7 @@ document.querySelector<HTMLDivElement>("#app")!.appendChild(iframe);
5353
// Create and initialise an instance of MakeCodeFrameDriver.
5454
const driverRef = new MakeCodeFrameDriver(
5555
{
56-
initialProjects: async () => [defaultMakeCodeProject],
56+
initialProjects: async () => [makeCodeProject],
5757
onEditorContentLoaded: (e) => console.log("editorContentLoaded", e),
5858
onWorkspaceLoaded: (e) => console.log("workspaceLoaded", e),
5959
onWorkspaceSync: (e) => console.log("workspaceSync", e),

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: { id?: string; children?: ReactNode }) => (
44
<div
5+
id={props.id}
56
style={{
67
display: 'flex',
78
flexDirection: 'column',
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { Meta, StoryObj } from '@storybook/react';
2+
import {
3+
createMakeCodeRenderBlocks,
4+
MakeCodeRenderBlocksOptions,
5+
} from '../vanilla/makecode-render-blocks.js';
6+
import {
7+
initialProject,
8+
project,
9+
projectWithCustomBlock,
10+
projectWithDatalogging,
11+
projectWithExtensionBlock,
12+
projectWithLayout,
13+
projectWithMelody,
14+
projectWithTwoExtensions,
15+
} from './fixtures.js';
16+
import { Project } from '../vanilla/pxt.js';
17+
18+
interface StoryArgs {
19+
options: MakeCodeRenderBlocksOptions | undefined;
20+
project: Project;
21+
}
22+
23+
const meta: Meta<StoryArgs> = {
24+
title: 'createMakeCodeRenderBlocks',
25+
};
26+
27+
export default meta;
28+
29+
type Story = StoryObj<StoryArgs>;
30+
31+
const renderBlocks = (args: StoryArgs) => {
32+
const elementId = 'story-wrapper';
33+
const renderer = createMakeCodeRenderBlocks(args.options ?? {});
34+
renderer.initialize();
35+
const waitForElementLoaded = () => {
36+
const targetEl = document.getElementById(elementId);
37+
if (!targetEl) {
38+
window.setTimeout(waitForElementLoaded, 500);
39+
return;
40+
}
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 <div id={elementId}></div>;
53+
};
54+
55+
export const Simple: Story = {
56+
render: renderBlocks,
57+
args: { project: project },
58+
};
59+
60+
export const XML: Story = {
61+
render: renderBlocks,
62+
args: { project: projectWithLayout },
63+
};
64+
65+
export const Melody: Story = {
66+
render: renderBlocks,
67+
args: { project: projectWithMelody },
68+
};
69+
70+
export const ExtensionBlockSingle: Story = {
71+
render: renderBlocks,
72+
args: { project: projectWithExtensionBlock },
73+
};
74+
75+
export const ExtensionBlockTwo: Story = {
76+
render: renderBlocks,
77+
args: { project: projectWithTwoExtensions },
78+
};
79+
80+
export const ExtensionBlockDatalogging: Story = {
81+
render: renderBlocks,
82+
args: { project: projectWithDatalogging },
83+
};
84+
85+
export const CustomBlock: Story = {
86+
render: renderBlocks,
87+
args: { project: projectWithCustomBlock },
88+
};
89+
90+
export const InitialBlankProject: Story = {
91+
render: renderBlocks,
92+
args: { project: initialProject },
93+
};
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { Meta, StoryObj } from '@storybook/react';
2+
import {
3+
createMakeCodeURL,
4+
MakeCodeFrameDriver,
5+
Options,
6+
} from '../vanilla/makecode-frame-driver.js';
7+
import { Project } from '../vanilla/pxt.js';
8+
import StoryWrapper from './StoryWrapper.js';
9+
import { defaultMakeCodeProject } from '../vanilla/examples.js';
10+
11+
interface StoryArgs {
12+
options?: {
13+
version?: string;
14+
lang?: string;
15+
controller?: 1 | 2;
16+
queryParams?: Record<string, string>;
17+
};
18+
project?: Project;
19+
callbacks?: Partial<Options>;
20+
}
21+
22+
const meta: Meta<StoryArgs> = {
23+
title: 'makeCodeFrameDriver',
24+
};
25+
26+
export default meta;
27+
28+
type Story = StoryObj<StoryArgs>;
29+
30+
const renderEditor = (args: StoryArgs) => {
31+
const elementId = 'story-wrapper';
32+
33+
// Create an iframe element.
34+
const iframe = document.createElement('iframe');
35+
iframe.allow = 'usb; autoplay; camera; microphone;';
36+
iframe.src = createMakeCodeURL(
37+
'https://makecode.microbit.org',
38+
args.options?.version === 'default' ? undefined : args.options?.version,
39+
args.options?.lang,
40+
args.options?.controller ?? 1,
41+
args.options?.queryParams
42+
);
43+
iframe.width = '100%';
44+
iframe.height = '100%';
45+
46+
// Create and initialise an instance of MakeCodeFrameDriver.
47+
const driverRef = new MakeCodeFrameDriver(
48+
{
49+
initialProjects: async () => (args.project ? [args.project] : []),
50+
onEditorContentLoaded: (e) => console.log('editorContentLoaded', e),
51+
onWorkspaceLoaded: (e) => console.log('workspaceLoaded', e),
52+
onWorkspaceSync: (e) => console.log('workspaceSync', e),
53+
onWorkspaceReset: (e) => console.log('workspaceReset', e),
54+
onWorkspaceEvent: (e) => console.log('workspaceEvent', e),
55+
onWorkspaceSave: (e) => {
56+
console.log(e.project!.header!.id, e.project);
57+
},
58+
onTutorialEvent: (e) => console.log('tutorialEvent', e),
59+
...(args.callbacks ?? {}),
60+
},
61+
() => iframe
62+
);
63+
64+
const waitForElementLoaded = () => {
65+
const targetEl = document.getElementById(elementId);
66+
if (!targetEl) {
67+
window.setTimeout(waitForElementLoaded, 500);
68+
return;
69+
}
70+
targetEl.replaceChildren(iframe);
71+
driverRef.initialize();
72+
};
73+
waitForElementLoaded();
74+
75+
return <StoryWrapper id={elementId} />;
76+
};
77+
78+
export const MakeCodeEditorWithControlsStory: Story = {
79+
name: 'MakeCode Editor with controls',
80+
render: renderEditor,
81+
args: {
82+
options: { version: 'default', queryParams: { hideMenu: '' } },
83+
project: defaultMakeCodeProject,
84+
},
85+
};
86+
87+
export const MakeCodeEditorControllerAppModeStory: Story = {
88+
name: 'MakeCode Editor with controller=2 mode',
89+
render: renderEditor,
90+
args: {
91+
options: { version: 'default', controller: 2 },
92+
callbacks: {
93+
onDownload: (download) => console.log('download', download),
94+
onSave: (save) => console.log('save', save),
95+
onBack: () => console.log('back'),
96+
onBackLongPress: () => console.log('back long'),
97+
},
98+
},
99+
};

src/stories/utils.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)