Skip to content

Commit d0ff088

Browse files
committed
Added the option to load additional imported files to codesandbox examples.
1 parent d3cca17 commit d0ff088

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

packages/react-renderer-demo/src/app/src/components/code-example.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const CodeEditor = dynamic(import('./code-editor'), {
2525
});
2626

2727
const reqSource = require.context('!raw-loader!@docs/examples', true, /\.js/);
28+
const reqCss = require.context('!raw-loader!@docs/examples', true, /\.css/);
2829
const req = require.context('@docs/examples', true, /\.js/);
2930

3031
const useStyles = makeStyles((theme) => ({
@@ -95,9 +96,10 @@ const generateIndex = (type) => `<!DOCTYPE html>
9596
</html>
9697
`;
9798

98-
const getPayload = (type, code) =>
99+
const getPayload = (type, code, sourceFiles = {}) =>
99100
getParameters({
100101
files: {
102+
...sourceFiles,
101103
'public/index.html': {
102104
content: generateIndex(type)
103105
},
@@ -140,12 +142,21 @@ const getPayload = (type, code) =>
140142
}
141143
});
142144

143-
const CodeExample = ({ source, mode, mapper }) => {
145+
const CodeExample = ({ source, mode, mapper, additionalSources }) => {
144146
const classes = useStyles();
145147
const codeSource = reqSource(`./${source}.js`).default;
146148
let Component;
147149
if (mode === 'preview') {
148150
Component = req(`./${source}.js`).default;
151+
const sourceFiles = additionalSources.split(',').reduce(
152+
(acc, curr) => ({
153+
...acc,
154+
[`src/${curr.split('/').pop()}`]: {
155+
content: curr.match(/\.css$/) ? reqCss(`./${curr}`).default : reqSource(`./${curr}`).default
156+
}
157+
}),
158+
{}
159+
);
149160

150161
return (
151162
<Grid container spacing={0} className="DocRawComponent">
@@ -168,7 +179,7 @@ const CodeExample = ({ source, mode, mapper }) => {
168179
)}
169180
<Box display="flex">
170181
<form action="https://codesandbox.io/api/v1/sandboxes/define" method="POST" target="_blank">
171-
<input type="hidden" name="parameters" value={getPayload(mapper, codeSource)} />
182+
<input type="hidden" name="parameters" value={getPayload(mapper, codeSource, sourceFiles)} />
172183
<Tooltip title="Edit in codesandbox">
173184
<IconButton disableFocusRipple type="submit">
174185
<CodesandboxIcon />
@@ -231,12 +242,14 @@ const CodeExample = ({ source, mode, mapper }) => {
231242
CodeExample.propTypes = {
232243
source: PropTypes.string.isRequired,
233244
mode: PropTypes.oneOf(['code', 'preview']),
234-
mapper: PropTypes.oneOf(['pf4', 'mui'])
245+
mapper: PropTypes.oneOf(['pf4', 'mui']),
246+
additionalSources: PropTypes.string // this has to be a string, MDX does not pass objects/arrays
235247
};
236248

237249
CodeExample.defaultProps = {
238250
mode: 'code',
239-
mapper: 'pf4'
251+
mapper: 'pf4',
252+
additionalSources: ''
240253
};
241254

242255
export default CodeExample;

0 commit comments

Comments
 (0)