Skip to content

Commit 21de0af

Browse files
committed
Add env switcher to code examples
1 parent df32868 commit 21de0af

File tree

8 files changed

+140
-33
lines changed

8 files changed

+140
-33
lines changed

packages/react-renderer-demo/src/components/code-editor/index.js

Lines changed: 95 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
import PropTypes from 'prop-types';
33
import makeStyles from '@material-ui/core/styles/makeStyles';
44
import Highlight, { defaultProps } from 'prism-react-renderer/';
55
import ghTheme from 'prism-react-renderer/themes/github';
66
import vsTheme from 'prism-react-renderer/themes/vsDark';
7+
import { Select } from '@material-ui/core';
8+
import tranformImports from './transform-imports';
79

810
const useStyles = makeStyles({
911
pre: {
@@ -32,31 +34,109 @@ Pre.propTypes = {
3234
children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)])
3335
};
3436

35-
const CodeEditor = ({ value, children, className, ...props }) => {
37+
const useStylesCode = makeStyles((theme) => ({
38+
wrapper: {
39+
position: 'relative',
40+
maxWidth: '100%',
41+
[theme.breakpoints.down('sm')]: {
42+
maxWidth: '100vw'
43+
}
44+
},
45+
switchwrapper: {
46+
right: 0,
47+
position: 'absolute'
48+
},
49+
select: {
50+
fontSize: 'inherit',
51+
color: 'white',
52+
'& option': {
53+
color: 'black'
54+
},
55+
'& svg': {
56+
color: 'white'
57+
},
58+
'&:before': {
59+
display: 'none'
60+
}
61+
},
62+
emptyLine: {
63+
// additional line added to snippets on mobile, so the select dont block the code
64+
display: 'none',
65+
[theme.breakpoints.down('sm')]: {
66+
marginBottom: 24,
67+
display: 'block'
68+
}
69+
}
70+
}));
71+
72+
const CodeEditor = ({ value, children, className, switchable, ...props }) => {
73+
const [env, setEnv] = useState('cjs');
74+
const classes = useStylesCode();
75+
3676
const lang = className ? className.toLowerCase().replace('language-', '') : undefined;
3777
let content = value || children || '';
3878
content = content.substring(0, content.length - 1);
79+
80+
// read props from code in --- { "key": value } ---\n format
81+
let propsFromMD = content.match(/--- .* ---/);
82+
if (propsFromMD) {
83+
propsFromMD = JSON.parse(propsFromMD[0].replace(/-/g, ''));
84+
content = content.replace(/--- .* ---\n/, '');
85+
}
86+
87+
propsFromMD = propsFromMD || {};
88+
const isSwitchable = switchable && propsFromMD.switchable !== false;
89+
const hasSwitcher = isSwitchable && content.match(/import.*data-driven-forms\/(\w*|\d*|-)*('|"|`|)/);
90+
91+
if (isSwitchable && env !== 'umd') {
92+
content = tranformImports(content, env);
93+
}
94+
3995
return (
40-
<Highlight {...defaultProps} theme={lang === 'bash' ? ghTheme : vsTheme} code={content} language={lang || 'jsx'}>
41-
{({ className, style, tokens, getLineProps, getTokenProps }) => (
42-
<Pre className={className} style={style}>
43-
{tokens.map((line, i) => (
44-
<div key={i} {...getLineProps({ line, key: i })}>
45-
{line.map((token, key) => (
46-
<span key={key} {...getTokenProps({ token, key })} />
47-
))}
48-
</div>
49-
))}
50-
</Pre>
96+
<div className={classes.wrapper}>
97+
{hasSwitcher && (
98+
<div className={classes.switchwrapper}>
99+
<Select
100+
native
101+
value={env}
102+
onChange={(e) => setEnv(e.target.value)}
103+
label="Environment"
104+
inputProps={{
105+
name: 'env'
106+
}}
107+
className={classes.select}
108+
>
109+
<option value="cjs">CJS</option>
110+
<option value="esm">ESM</option>
111+
<option value="umd">UMD</option>
112+
</Select>
113+
</div>
51114
)}
52-
</Highlight>
115+
<Highlight {...defaultProps} theme={lang === 'bash' ? ghTheme : vsTheme} code={content} language={lang || 'jsx'}>
116+
{({ className, style, tokens, getLineProps, getTokenProps }) => (
117+
<Pre className={className} style={style}>
118+
<React.Fragment>
119+
{hasSwitcher && <pre className={classes.emptyLine} />}
120+
{tokens.map((line, i) => (
121+
<div key={i} {...getLineProps({ line, key: i })}>
122+
{line.map((token, key) => (
123+
<span key={key} {...getTokenProps({ token, key })} />
124+
))}
125+
</div>
126+
))}
127+
</React.Fragment>
128+
</Pre>
129+
)}
130+
</Highlight>
131+
</div>
53132
);
54133
};
55134

56135
CodeEditor.propTypes = {
57136
value: PropTypes.string,
58137
children: PropTypes.string,
59-
className: PropTypes.string
138+
className: PropTypes.string,
139+
switchable: PropTypes.bool
60140
};
61141

62142
export default CodeEditor;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const tranformImports = (content, env) => {
2+
if (env === 'umd') {
3+
return content;
4+
}
5+
6+
let newContent = content;
7+
8+
const regexp = RegExp('import.*data-driven-forms.*', 'g');
9+
let match;
10+
const matches = [];
11+
12+
// matchAll is not supported in node <12
13+
while ((match = regexp.exec(content)) !== null) {
14+
matches.push(match[0]);
15+
}
16+
17+
matches.forEach((m) => {
18+
const pck = m.match(/'.*'/)[0].replace(/'/g, '');
19+
20+
const imports = m
21+
.replace(/(import|from.*|{|}| *)/g, '')
22+
.split(',')
23+
.map(
24+
(imp) =>
25+
`import ${imp} from '${pck}/dist/${env}/${imp
26+
.split(/(?=[A-Z])/)
27+
.join('-')
28+
.toLowerCase()}';`
29+
)
30+
.join('\n');
31+
32+
newContent = newContent.replace(m, imports);
33+
});
34+
35+
return newContent;
36+
};
37+
38+
export default tranformImports;

packages/react-renderer-demo/src/components/landing-page/landing-page-cards.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,8 @@ import FormExample from './formExample';
2323
import CodeEditor from '@docs/components/code-editor';
2424

2525
const value = `import React from 'react';
26-
import
27-
FormRenderer, { componentTypes }
28-
from '@data-driven-forms/react-form-renderer';
29-
import
30-
{ componentMapper, FormTemplate }
31-
from '@data-driven-forms/pf4-component-mapper';
26+
import FormRenderer, { componentTypes } from '@data-driven-forms/react-form-renderer';
27+
import { componentMapper, FormTemplate } from '@data-driven-forms/pf4-component-mapper';
3228
3329
const validatorMapper = {
3430
'same-email': () => (
@@ -215,7 +211,7 @@ const LandingPageCards = () => {
215211
Write a schema
216212
</Typography>
217213
<div className={classes.editorWrapper}>
218-
<CodeEditor showGutter={false} value={value} fontSize={11} />
214+
<CodeEditor showGutter={false} value={value} fontSize={11} switchable />
219215
</div>
220216
</Grid>
221217
<Grid item xs={12} md={5}>

packages/react-renderer-demo/src/components/mdx/mdx-components.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const MdxComponents = {
7878
{children}
7979
</Typography>
8080
),
81-
code: CodeEditor,
81+
code: (props) => <CodeEditor {...props} switchable />,
8282
a: MdLink,
8383
h1: (props) => <Heading {...props} level={4} component="h1" />,
8484
h2: (props) => <Heading {...props} level={5} component="h2" />,

packages/react-renderer-demo/src/pages/components/field-provider.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ Next example shows simple input field with label and error message.
2626
import React from 'react';
2727

2828
import { FieldProvider } from '@data-driven-forms/react-form-renderer';
29-
// or
30-
import FieldProvider from '@data-driven-forms/react-form-renderer/dist/cjs/field-provider';
31-
// or
32-
import FieldProvider from '@data-driven-forms/react-form-renderer/dist/esm/field-provider';
3329

3430
const CustomComponent = ({input, meta, label}) => (
3531
<div>

packages/react-renderer-demo/src/pages/components/form-template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ To display all form errors, you will need to add a component to your FormTemplat
4747
FormTemplates of the provided DDF mappers offers additional customization via using props.
4848

4949
```jsx
50-
import { FormTemplate } from @data-driven-forms/pf4-component-mapper
50+
import { FormTemplate } from '@data-driven-forms/pf4-component-mapper'
5151

5252
<FormRenderer
5353
...

packages/react-renderer-demo/src/pages/hooks/use-field-api.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ Next example shows simple input field with label and error message.
2323
import React from 'react';
2424

2525
import { useFieldApi } from '@data-driven-forms/react-form-renderer';
26-
// or
27-
import useFieldApi from '@data-driven-forms/react-form-renderer/dist/cjs/use-field-api';
28-
// or
29-
import useFieldApi from '@data-driven-forms/react-form-renderer/dist/esm/use-field-api';
30-
d
26+
3127
const NewComponent = (props) => {
3228
const { input, meta } = useFieldApi(props);
3329

packages/react-renderer-demo/src/pages/optimization.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ In both of CJS and ESM, exported files follow the kebab case. All components are
2727
**Recommendation: UMD is just a fallback option. We strongly recommend to use CJS or ESM. These two modules allow to better optimization via treeshaking and more modern language syntax.**
2828

2929
```jsx
30+
--- { "switchable": false } ---
3031
import FormRenderer, { useField } from '@data-driven-forms/react-form-renderer';
3132
```
3233

0 commit comments

Comments
 (0)