Skip to content

Commit 1106fd1

Browse files
existentialismCompuIves
authored andcommitted
Add prop to override button rendering in OpenInCodeSandbox (codesandbox#744)
1 parent ad68198 commit 1106fd1

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

packages/react-sandpack/src/components/OpenInCodeSandbox/OpenInCodeSandbox.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { IFiles } from '../../types';
44

55
import SandpackConsumer from '../SandpackConsumer';
66

7-
export default class OpenInCodeSandbox extends React.Component {
7+
export interface Props {
8+
render?: () => React.ReactNode;
9+
}
10+
11+
export default class OpenInCodeSandbox extends React.Component<Props> {
812
getFileParameters = (files: IFiles) => {
913
const normalized: {
1014
[path: string]: { content: string; isBinary: boolean };
@@ -22,22 +26,32 @@ export default class OpenInCodeSandbox extends React.Component {
2226
return getParameters({ files: normalized });
2327
};
2428

29+
renderButton() {
30+
if (typeof this.props.render === 'function') {
31+
return this.props.render();
32+
}
33+
34+
return <input type="submit" value="Open in CodeSandbox" />;
35+
}
36+
2537
render() {
38+
const { render, ...props } = this.props;
39+
2640
return (
2741
<SandpackConsumer>
2842
{sandpack => (
2943
<form
3044
action="https://codesandbox.io/api/v1/sandboxes/define"
3145
method="POST"
3246
target="_blank"
33-
{...this.props}
47+
{...props}
3448
>
3549
<input
3650
type="hidden"
3751
name="parameters"
3852
value={this.getFileParameters(sandpack.files)}
3953
/>
40-
<input type="submit" value="Open in CodeSandbox" />
54+
{this.renderButton()}
4155
</form>
4256
)}
4357
</SandpackConsumer>

packages/react-sandpack/stories/OpenInCodeSandbox.js

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,36 @@ import React from 'react';
22
import JSXAddon from 'storybook-addon-jsx';
33
import { storiesOf, setAddon } from '@storybook/react';
44

5+
import SandpackProvider from '../src/components/SandpackProvider/index.ts';
56
import OpenInCodeSandbox from '../src/components/OpenInCodeSandbox/index.ts';
67

78
setAddon(JSXAddon);
89

910
const stories = storiesOf('Export To CodeSandbox', module);
1011

12+
stories.addWithJSX('minimal', () => (
13+
<SandpackProvider
14+
entry="/index.js"
15+
files={{
16+
'/index.js': {
17+
code: '',
18+
},
19+
}}
20+
dependencies={{}}
21+
>
22+
<OpenInCodeSandbox />
23+
</SandpackProvider>
24+
));
25+
1126
stories.addWithJSX('with multiple files', () => (
12-
<OpenInCodeSandbox
27+
<SandpackProvider
28+
entry="/index.js"
1329
files={{
1430
'/index.js': {
1531
code: `import Hello from './Hello.js';
1632
17-
document.body.innerHTML = JSON.stringify(Hello);
18-
`,
33+
document.body.innerHTML = JSON.stringify(Hello);
34+
`,
1935
},
2036
'/Hello.js': {
2137
code: `export default \`Hello from another file, here's an ID: $\{require('uuid')()}!\``,
@@ -24,5 +40,25 @@ document.body.innerHTML = JSON.stringify(Hello);
2440
dependencies={{
2541
uuid: 'latest',
2642
}}
27-
/>
43+
>
44+
<OpenInCodeSandbox />
45+
</SandpackProvider>
46+
));
47+
48+
stories.addWithJSX('with render prop', () => (
49+
<SandpackProvider
50+
entry="/index.js"
51+
files={{
52+
'/index.js': {
53+
code: '',
54+
},
55+
}}
56+
dependencies={{}}
57+
>
58+
<OpenInCodeSandbox
59+
render={() => {
60+
return <button type="submit">CodeSandbox is awesome!</button>;
61+
}}
62+
/>
63+
</SandpackProvider>
2864
));

0 commit comments

Comments
 (0)