Skip to content

Commit a90d06b

Browse files
Flatten options into props for render blocks React.
1 parent 3e19e46 commit a90d06b

File tree

3 files changed

+75
-79
lines changed

3 files changed

+75
-79
lines changed

docs/react.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ import {
1616
MakeCodeBlocksRendering,
1717
} from '@microbit/makecode-embed/react';
1818

19-
<MakeCodeRenderBlocksProvider options={options}>
19+
<MakeCodeRenderBlocksProvider>
2020
<MakeCodeBlocksRendering code={project} />
2121
</MakeCodeRenderBlocksProvider>;
2222
```
2323

24+
The provider manages a hidden, embedded MakeCode. If you have more than one code embed then place the provider at a suitable location. You can use the `disabled` prop to avoid loading MakeCode if you know it's not needed.
25+
2426
For more examples, take a look at the [MakeCode blocks rendering demo source code](../src/stories/react/MakeCodeBlocksRendering.stories.tsx).
2527

2628
## Embed MakeCode editor

src/react/MakeCodeRenderBlocksProvider.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { ReactNode, createContext, useContext } from 'react';
2-
import { MakeCodeRenderBlocksOptions } from '../vanilla/makecode-render-blocks.js';
1+
import { ReactNode, createContext, useContext, useMemo } from 'react';
32
import useMakeCodeRenderBlocks, {
43
UseMakeCodeRenderBlocksReturn,
54
} from './useMakeCodeRenderBlocks.js';
@@ -12,12 +11,28 @@ const MakeCodeRenderBlocksContext =
1211
});
1312

1413
export const MakeCodeRenderBlocksProvider = ({
15-
options,
14+
disabled,
15+
version,
16+
lang,
1617
children,
1718
}: {
18-
options: MakeCodeRenderBlocksOptions;
19+
/**
20+
* This can be used to disable loading MakeCode in scenarios where it will be unused.
21+
*/
22+
disabled?: boolean;
23+
/**
24+
* MakeCode version.
25+
*/
26+
version?: string;
27+
/**
28+
* MakeCode language code.
29+
*/
30+
lang?: string;
1931
children: ReactNode;
2032
}) => {
33+
const options = useMemo(() => {
34+
return { disabled, version, lang };
35+
}, [disabled, lang, version]);
2136
const value = useMakeCodeRenderBlocks(options);
2237
return (
2338
<MakeCodeRenderBlocksContext.Provider value={value}>

src/stories/react/MakeCodeBlocksRendering.stories.tsx

Lines changed: 53 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
11
import { Meta, StoryObj } from '@storybook/react';
22
import { ReactNode, useState } from 'react';
33
import MakeCodeBlocksRendering from '../../react/MakeCodeBlocksRendering.js';
4+
import { MakeCodeRenderBlocksProvider } from '../../react/MakeCodeRenderBlocksProvider.js';
5+
import { BlockLayout, Project } from '../../vanilla/pxt.js';
46
import {
57
initialProject,
68
project,
9+
projectWithCustomBlock,
710
projectWithDatalogging,
811
projectWithExtensionBlock,
912
projectWithLayout,
10-
projectWithCustomBlock,
1113
projectWithMelody,
1214
projectWithTwoExtensions,
1315
projectWithUserLayout,
1416
strawbeesExample,
1517
} from '../fixtures.js';
16-
import { MakeCodeRenderBlocksProvider } from '../../react/MakeCodeRenderBlocksProvider.js';
17-
import { MakeCodeRenderBlocksOptions } from '../../vanilla/makecode-render-blocks.js';
18-
import { BlockLayout, Project } from '../../vanilla/pxt.js';
1918

2019
const meta: Meta<typeof MakeCodeRenderBlocksProvider> = {
2120
title: 'stories/React/MakeCodeBlocksRendering',
2221
component: MakeCodeRenderBlocksProvider,
2322
argTypes: {
24-
options: {
23+
version: {
2524
options: ['default', 'beta'],
2625
defaultValue: 'default',
27-
name: 'version',
2826
control: { type: 'radio' },
2927
},
3028
},
@@ -47,23 +45,17 @@ const StoryWrapper = (props: { children: ReactNode }) => (
4745
</div>
4846
);
4947

50-
const getOptionsFromVersion = (
51-
version: string
52-
): MakeCodeRenderBlocksOptions => {
53-
const options: MakeCodeRenderBlocksOptions = {};
54-
if (version && version !== 'default') {
55-
options['version'] = version;
56-
}
57-
return options;
48+
const adaptStorybookVersion = (
49+
version: string | undefined
50+
): string | undefined => {
51+
return version && version !== 'default' ? version : undefined;
5852
};
5953

6054
export const Simple: Story = {
61-
render: (args) => {
62-
const { options: version } = args;
63-
const options = getOptionsFromVersion(version as string);
55+
render: ({ version }) => {
6456
return (
65-
<StoryWrapper key={options.version}>
66-
<MakeCodeRenderBlocksProvider options={options}>
57+
<StoryWrapper key={version}>
58+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
6759
<MakeCodeBlocksRendering code={project.text!['main.ts']} />
6860
</MakeCodeRenderBlocksProvider>
6961
</StoryWrapper>
@@ -72,12 +64,10 @@ export const Simple: Story = {
7264
};
7365

7466
export const XML: Story = {
75-
render: (args) => {
76-
const { options: version } = args;
77-
const options = getOptionsFromVersion(version as string);
67+
render: ({ version }) => {
7868
return (
79-
<StoryWrapper key={options.version}>
80-
<MakeCodeRenderBlocksProvider options={options}>
69+
<StoryWrapper key={version}>
70+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
8171
<MakeCodeBlocksRendering code={projectWithLayout} />
8272
</MakeCodeRenderBlocksProvider>
8373
</StoryWrapper>
@@ -87,12 +77,10 @@ export const XML: Story = {
8777

8878
export const Published: Story = {
8979
render: (args) => {
90-
const { options: version } = args;
91-
const options = getOptionsFromVersion(version as string);
92-
console.log(options);
80+
const { version } = args;
9381
return (
94-
<StoryWrapper key={options.version}>
95-
<MakeCodeRenderBlocksProvider options={options}>
82+
<StoryWrapper key={version}>
83+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
9684
<MakeCodeBlocksRendering packageId="_iHY3J9371HLf" />
9785
</MakeCodeRenderBlocksProvider>
9886
</StoryWrapper>
@@ -102,11 +90,10 @@ export const Published: Story = {
10290

10391
export const Melody: Story = {
10492
render: (args) => {
105-
const { options: version } = args;
106-
const options = getOptionsFromVersion(version as string);
93+
const { version } = args;
10794
return (
108-
<StoryWrapper key={options.version}>
109-
<MakeCodeRenderBlocksProvider options={options}>
95+
<StoryWrapper key={version}>
96+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
11097
<MakeCodeBlocksRendering code={projectWithMelody} />
11198
</MakeCodeRenderBlocksProvider>
11299
</StoryWrapper>
@@ -117,11 +104,10 @@ export const Melody: Story = {
117104
export const ExtensionBlockSingle: Story = {
118105
name: 'Extension block (single)',
119106
render: (args) => {
120-
const { options: version } = args;
121-
const options = getOptionsFromVersion(version as string);
107+
const { version } = args;
122108
return (
123-
<StoryWrapper key={options.version}>
124-
<MakeCodeRenderBlocksProvider options={options}>
109+
<StoryWrapper key={version}>
110+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
125111
<MakeCodeBlocksRendering code={projectWithExtensionBlock} />
126112
</MakeCodeRenderBlocksProvider>
127113
</StoryWrapper>
@@ -132,11 +118,10 @@ export const ExtensionBlockSingle: Story = {
132118
export const ExtensionBlockTwo: Story = {
133119
name: 'Extension block (two different)',
134120
render: (args) => {
135-
const { options: version } = args;
136-
const options = getOptionsFromVersion(version as string);
121+
const { version } = args;
137122
return (
138-
<StoryWrapper key={options.version}>
139-
<MakeCodeRenderBlocksProvider options={options}>
123+
<StoryWrapper key={version}>
124+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
140125
<MakeCodeBlocksRendering code={projectWithTwoExtensions} />
141126
</MakeCodeRenderBlocksProvider>
142127
</StoryWrapper>
@@ -147,11 +132,10 @@ export const ExtensionBlockTwo: Story = {
147132
export const ExtensionBlockStrawbees: Story = {
148133
name: 'Extension block (Strawbees - spaces in name)',
149134
render: (args) => {
150-
const { options: version } = args;
151-
const options = getOptionsFromVersion(version as string);
135+
const { version } = args;
152136
return (
153-
<StoryWrapper key={options.version}>
154-
<MakeCodeRenderBlocksProvider options={options}>
137+
<StoryWrapper key={version}>
138+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
155139
<MakeCodeBlocksRendering code={strawbeesExample} />
156140
</MakeCodeRenderBlocksProvider>
157141
</StoryWrapper>
@@ -162,11 +146,10 @@ export const ExtensionBlockStrawbees: Story = {
162146
export const ExtensionBlockDatalogging: Story = {
163147
name: 'Extension block (Datalogging)',
164148
render: (args) => {
165-
const { options: version } = args;
166-
const options = getOptionsFromVersion(version as string);
149+
const { version } = args;
167150
return (
168-
<StoryWrapper key={options.version}>
169-
<MakeCodeRenderBlocksProvider options={options}>
151+
<StoryWrapper key={version}>
152+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
170153
<MakeCodeBlocksRendering code={projectWithDatalogging} />
171154
</MakeCodeRenderBlocksProvider>
172155
</StoryWrapper>
@@ -177,11 +160,10 @@ export const ExtensionBlockDatalogging: Story = {
177160
export const CustomBlock: Story = {
178161
name: 'Custom block',
179162
render: (args) => {
180-
const { options: version } = args;
181-
const options = getOptionsFromVersion(version as string);
163+
const { version } = args;
182164
return (
183-
<StoryWrapper key={options.version}>
184-
<MakeCodeRenderBlocksProvider options={options}>
165+
<StoryWrapper key={version}>
166+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
185167
<MakeCodeBlocksRendering code={projectWithCustomBlock} />
186168
</MakeCodeRenderBlocksProvider>
187169
</StoryWrapper>
@@ -193,7 +175,7 @@ export const Error: Story = {
193175
render: () => {
194176
return (
195177
<StoryWrapper>
196-
<MakeCodeRenderBlocksProvider options={{ version: 'intentional-404' }}>
178+
<MakeCodeRenderBlocksProvider version="intentional-404">
197179
<MakeCodeBlocksRendering code={project.text!['main.ts']} />
198180
</MakeCodeRenderBlocksProvider>
199181
</StoryWrapper>
@@ -204,11 +186,10 @@ export const Error: Story = {
204186
export const Robust: Story = {
205187
name: 'Robust against invalid/empty project',
206188
render: (args) => {
207-
const { options: version } = args;
208-
const options = getOptionsFromVersion(version as string);
189+
const { version } = args;
209190
return (
210-
<StoryWrapper key={options.version}>
211-
<MakeCodeRenderBlocksProvider options={options}>
191+
<StoryWrapper key={version}>
192+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
212193
<MakeCodeBlocksRendering code={{} as Project} />
213194
</MakeCodeRenderBlocksProvider>
214195
</StoryWrapper>
@@ -219,11 +200,10 @@ export const Robust: Story = {
219200
export const InitialBlankProject: Story = {
220201
name: 'Initial blank project',
221202
render: (args) => {
222-
const { options: version } = args;
223-
const options = getOptionsFromVersion(version as string);
203+
const { version } = args;
224204
return (
225-
<StoryWrapper key={options.version}>
226-
<MakeCodeRenderBlocksProvider options={options}>
205+
<StoryWrapper key={version}>
206+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
227207
<MakeCodeBlocksRendering code={initialProject} />
228208
</MakeCodeRenderBlocksProvider>
229209
</StoryWrapper>
@@ -234,11 +214,10 @@ export const InitialBlankProject: Story = {
234214
export const EmptyString: Story = {
235215
name: 'Empty string',
236216
render: (args) => {
237-
const { options: version } = args;
238-
const options = getOptionsFromVersion(version as string);
217+
const { version } = args;
239218
return (
240-
<StoryWrapper key={options.version}>
241-
<MakeCodeRenderBlocksProvider options={options}>
219+
<StoryWrapper key={version}>
220+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
242221
<MakeCodeBlocksRendering code="" />
243222
</MakeCodeRenderBlocksProvider>
244223
</StoryWrapper>
@@ -249,13 +228,14 @@ export const EmptyString: Story = {
249228
export const EmptyToBlocksTransition: Story = {
250229
name: 'Empty to blocks transition',
251230
render: (args) => {
252-
const { options: version } = args;
253-
const options = getOptionsFromVersion(version as string);
231+
const { version } = args;
254232
const [project, setProject] = useState<Project>(initialProject);
255233
return (
256-
<StoryWrapper key={options.version}>
234+
<StoryWrapper key={version}>
257235
<div style={{ display: 'grid', gridTemplateColumns: '50% 50%' }}>
258-
<MakeCodeRenderBlocksProvider options={options}>
236+
<MakeCodeRenderBlocksProvider
237+
version={adaptStorybookVersion(version)}
238+
>
259239
<MakeCodeBlocksRendering code={project} />
260240
</MakeCodeRenderBlocksProvider>
261241
<div>
@@ -280,11 +260,10 @@ export const EmptyToBlocksTransition: Story = {
280260
export const RespectUserLayout: Story = {
281261
name: 'Respect user layout',
282262
render: (args) => {
283-
const { options: version } = args;
284-
const options = getOptionsFromVersion(version as string);
263+
const { version } = args;
285264
return (
286-
<StoryWrapper key={options.version}>
287-
<MakeCodeRenderBlocksProvider options={options}>
265+
<StoryWrapper key={version}>
266+
<MakeCodeRenderBlocksProvider version={adaptStorybookVersion(version)}>
288267
<MakeCodeBlocksRendering
289268
code={projectWithUserLayout}
290269
layout={BlockLayout.Clean}

0 commit comments

Comments
 (0)