Skip to content

Commit 970feb8

Browse files
author
Ives van Hoorne
committed
Progress
1 parent 18a6473 commit 970feb8

File tree

12 files changed

+436
-61
lines changed

12 files changed

+436
-61
lines changed

packages/codesandbox-playground/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
},
2727
"dependencies": {
2828
"codemirror": "^5.32.0",
29+
"codesandbox": "^1.1.14",
2930
"prop-types": "^15.6.0"
3031
}
3132
}

packages/codesandbox-playground/src/components/CodeEditor/CodeEditor.js

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @flow
2-
import * as React from 'react';
2+
import React from 'react';
33
import PropTypes from 'prop-types';
44

55
import CodeMirror from 'codemirror';
@@ -52,14 +52,6 @@ export default class CodeEditor extends React.Component {
5252
};
5353

5454
render() {
55-
return (
56-
<div
57-
style={{
58-
height: '100%',
59-
width: '100%',
60-
}}
61-
ref={this.getCodeMirror}
62-
/>
63-
);
55+
return <div style={{ width: '100%' }} ref={this.getCodeMirror} />;
6456
}
6557
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import React from 'react';
2+
import { getParameters } from 'codesandbox/lib/api/define';
3+
4+
import { filePropTypes } from '../../utils/prop-types';
5+
6+
export default class OpenInCodeSandbox extends React.Component {
7+
static propTypes = {
8+
...filePropTypes,
9+
};
10+
11+
static defaultProps = {
12+
entry: '/index.js',
13+
};
14+
15+
getFileParameters = () => {
16+
const { files, dependencies } = this.props;
17+
const paramFiles = { ...files };
18+
const packageJSON = {
19+
main: this.props.entry,
20+
dependencies,
21+
};
22+
23+
paramFiles['/package.json'] = { code: JSON.stringify(packageJSON) };
24+
25+
const normalized = Object.keys(paramFiles).reduce(
26+
(prev, next) => ({
27+
...prev,
28+
[next.replace('/', '')]: {
29+
...paramFiles[next],
30+
content: paramFiles[next].code,
31+
},
32+
}),
33+
{}
34+
);
35+
36+
return getParameters({ files: normalized });
37+
};
38+
39+
render() {
40+
const { files, dependencies, ...props } = this.props;
41+
return (
42+
<form
43+
action="https://codesandbox.io/api/v1/sandboxes/define"
44+
method="POST"
45+
target="_blank"
46+
{...props}
47+
>
48+
<input
49+
type="hidden"
50+
name="parameters"
51+
value={this.getFileParameters()}
52+
/>
53+
<input type="submit" value="Open in CodeSandbox" />
54+
</form>
55+
);
56+
}
57+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default from './OpenInCodeSandbox';

packages/codesandbox-playground/src/components/Playground/Playground.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { filePropTypes } from '../../utils/prop-types';
33

44
import CodeEditor from '../CodeEditor';
55
import Preview from '../Preview';
6+
import OpenInCodeSandbox from '../OpenInCodeSandbox';
67

78
export default class Playground extends React.Component {
89
static propTypes = {
@@ -31,23 +32,26 @@ export default class Playground extends React.Component {
3132
};
3233

3334
render() {
34-
const code = this.state.files[this.props.entry].code;
35+
const entryCode = this.state.files[this.props.entry].code;
36+
const updatedProps = {
37+
...this.props,
38+
files: this.state.files,
39+
};
3540

3641
return (
37-
<div>
42+
<div style={{ position: 'relative' }}>
3843
<div
3944
style={{
40-
height: '3rem',
4145
width: '100%',
4246
backgroundColor: '#1C2022',
4347
color: 'white',
4448
}}
4549
>
46-
CodeSandbox
50+
<OpenInCodeSandbox {...updatedProps} />
4751
</div>
4852
<div style={{ display: 'flex' }}>
49-
<CodeEditor code={code} onChangeCode={this.handleChange} />
50-
<Preview {...this.props} files={this.state.files} />
53+
<CodeEditor code={entryCode} onChangeCode={this.handleChange} />
54+
<Preview {...updatedProps} />
5155
</div>
5256
</div>
5357
);

packages/codesandbox-playground/src/components/Preview/Preview.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export default class Preview extends React.PureComponent {
1010
static defaultProps = {
1111
dependencies: {},
1212
resources: [],
13+
entry: '/index.js',
1314
};
1415

1516
setupFrame = el => {
@@ -33,7 +34,7 @@ export default class Preview extends React.PureComponent {
3334
codesandbox: true,
3435
version: 2,
3536
modules,
36-
entry: '/index.js',
37+
entry: this.props.entry,
3738
externalResources: this.props.resources,
3839
dependencies: this.props.dependencies,
3940
},
@@ -42,7 +43,12 @@ export default class Preview extends React.PureComponent {
4243
};
4344

4445
componentDidUpdate(prevProps) {
45-
if (this.props.files !== prevProps.files) {
46+
if (
47+
this.props.files !== prevProps.files ||
48+
this.props.resources !== prevProps.resources ||
49+
this.props.dependencies !== prevProps.dependencies ||
50+
this.props.entry !== prevProps.entry
51+
) {
4652
this.sendCode();
4753
}
4854
}
Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +0,0 @@
1-
import React from 'react';
2-
import PropTypes from 'prop-types';
3-
import { filePropTypes } from './utils/prop-types';
4-
5-
import CodeEditor from './components/CodeEditor';
6-
import Preview from './components/Preview';
7-
8-
export default class Playground extends React.Component {
9-
static propTypes = {
10-
...filePropTypes,
11-
};
12-
static defaultProps = {
13-
entry: 'index.js',
14-
};
15-
16-
render() {
17-
return (
18-
<div>
19-
{/* <CodeEditor /> */}
20-
<Preview />
21-
</div>
22-
);
23-
}
24-
}

packages/codesandbox-playground/src/utils/prop-types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ export const filePropTypes = {
88
}).isRequired,
99
dependencies: PropTypes.objectOf(PropTypes.string),
1010
resources: PropTypes.arrayOf(PropTypes.string),
11+
entry: PropTypes.string,
1112
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
3+
import { storiesOf } from '@storybook/react';
4+
5+
import OpenInCodeSandbox from '../src/components/OpenInCodeSandbox';
6+
7+
const stories = storiesOf('Export To CodeSandbox', module);
8+
9+
stories.add('with multiple files', () => (
10+
<OpenInCodeSandbox
11+
files={{
12+
'/index.js': {
13+
code: `import Hello from './Hello.js';
14+
15+
document.body.innerHTML = JSON.stringify(Hello);
16+
`,
17+
},
18+
'/Hello.js': {
19+
code: `export default "Hello from another file!"`,
20+
},
21+
}}
22+
dependencies={{
23+
uuid: 'latest',
24+
}}
25+
/>
26+
));

packages/codesandbox-playground/stories/Playground.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ stories.add('with multiple files', () => (
2323
<Playground
2424
files={{
2525
'/index.js': {
26-
code: `
27-
import Hello from './Hello.js';
26+
code: `import Hello from './Hello.js';
2827
29-
document.body.innerHTML = JSON.stringify(Hello);
30-
`,
28+
document.body.innerHTML = JSON.stringify(Hello);
29+
`,
3130
},
3231
'/Hello.js': {
3332
code: `export default "Hello from another file!"`,

0 commit comments

Comments
 (0)