Skip to content

Commit 310b08a

Browse files
ThomasRoestThomas Roest
andauthored
Upgrade to React 18 (#2087) (#2110)
Upgrade to React 18 * replace ReactDOM.render with createRoot in index.ts * fix new TS errors after upgrading @types * replace ReactDOM.render in Preview.tsx * replace ReactDOM.unmountComponentAtNode with root.unmount() * remove ReactDOM import * upgrade react testing library * replace deprecated React.SFC type with React.FC DefinitelyTyped/DefinitelyTyped#30364 * Fix TS errors in propTypes.children propTypes.node results in TS errors. There doesn't seem to be a good alternative ( other than making the children propTypes more strict, which could result more errors) Instead use something less restrictive (propTypes.any) for children and components. * fix TS errors, extract props interfaces with children * fix TS errors, add context types * TS fix * Fix React unmount error Unmount asynchronously with setTimout https://stackoverflow.com/questions/73459382/react-18-async-way-to-unmount-root error message: Warning: Attempted to synchronously unmount a root while React was already rendering. React cannot finish unmounting the root until the current render has completed, which may lead to a race condition. * make wrapper unmount test async --------- Co-authored-by: Thomas Roest <thomas.roest@moxio.com>
1 parent 2ba612a commit 310b08a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+758
-653
lines changed

package-lock.json

Lines changed: 603 additions & 544 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
"@babel/preset-react": "^7.18.6",
107107
"@babel/preset-typescript": "^7.18.6",
108108
"@testing-library/jest-dom": "^5.11.4",
109-
"@testing-library/react": "^11.1.0",
109+
"@testing-library/react": "^13.4.0",
110110
"@types/buble": "^0.19.2",
111111
"@types/copy-webpack-plugin": "^5.0.2",
112112
"@types/doctrine": "0.0.3",
@@ -119,8 +119,8 @@
119119
"@types/markdown-to-jsx": "^6.9.0",
120120
"@types/node": "^12.12.3",
121121
"@types/prismjs": "^1.16.0",
122-
"@types/react": "^16.9.27",
123-
"@types/react-dom": "^16.9.5",
122+
"@types/react": "^18.0.26",
123+
"@types/react-dom": "^18.0.9",
124124
"@types/terser-webpack-plugin": "^2.2.3",
125125
"@types/type-detect": "^4.0.1",
126126
"@types/webpack": "^5.28.0",
@@ -153,9 +153,9 @@
153153
"memfs": "~2.15.5",
154154
"prettier": "2.1.2",
155155
"raf": "^3.4.1",
156-
"react": "^17.0.2",
157-
"react-dom": "^17.0.2",
158-
"react-test-renderer": "^17.0.2",
156+
"react": "^18.2.0",
157+
"react-dom": "^18.2.0",
158+
"react-test-renderer": "^18.2.0",
159159
"strip-shebang": "^1.0.2",
160160
"style-loader": "^3.3.1",
161161
"typescript": "^4.7.4",

src/client/index.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable import/first */
22
import './polyfills';
33
import './styles';
4-
import ReactDOM from 'react-dom';
4+
import { createRoot, Root } from 'react-dom/client';
55
import renderStyleguide from './utils/renderStyleguide';
66
import { getParameterByName, hasInHash, getHash } from './utils/handleHash';
77

@@ -33,14 +33,22 @@ const scrollToOrigin = () => {
3333
}
3434
};
3535

36+
let reactRoot: Root | null = null;
37+
3638
const render = () => {
3739
// eslint-disable-next-line @typescript-eslint/no-var-requires
3840
const styleguide = require('!!../loaders/styleguide-loader!./index.js');
3941

40-
ReactDOM.render(
41-
renderStyleguide(styleguide, codeRevision),
42-
document.getElementById(styleguide.config.mountPointId)
43-
);
42+
if (!reactRoot) {
43+
const rootNode = document.getElementById(styleguide.config.mountPointId);
44+
if (rootNode) {
45+
reactRoot = createRoot(rootNode);
46+
}
47+
}
48+
49+
if (reactRoot) {
50+
reactRoot.render(renderStyleguide(styleguide, codeRevision));
51+
}
4452
};
4553

4654
window.addEventListener('hashchange', render);

src/client/rsg-components/Code/CodeRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const CodeRenderer: React.FunctionComponent<CodeProps> = ({ classes, chil
2222
};
2323
CodeRenderer.propTypes = {
2424
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
25-
children: PropTypes.node.isRequired,
25+
children: PropTypes.any.isRequired,
2626
};
2727

2828
export default Styled<CodeProps>(styles)(CodeRenderer);

src/client/rsg-components/Examples/ExamplesRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const ExamplesRenderer: React.FunctionComponent<ExamplesRendererProps> =
2727
ExamplesRenderer.propTypes = {
2828
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
2929
name: PropTypes.string.isRequired,
30-
children: PropTypes.node,
30+
children: PropTypes.any,
3131
};
3232

3333
export default Styled<ExamplesRendererProps>(styles)(ExamplesRenderer);

src/client/rsg-components/Heading/HeadingRenderer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ const HeadingRenderer: React.FunctionComponent<HeadingProps> = ({
4444
children,
4545
...props
4646
}) => {
47-
const Tag = `h${level}` as ('h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6');
47+
const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
4848
const headingClasses = cx(classes.heading, classes[`heading${level}`]);
4949

5050
return (
@@ -57,7 +57,7 @@ const HeadingRenderer: React.FunctionComponent<HeadingProps> = ({
5757
HeadingRenderer.propTypes = {
5858
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
5959
level: PropTypes.oneOf([1, 2, 3, 4, 5, 6]).isRequired,
60-
children: PropTypes.node,
60+
children: PropTypes.any,
6161
};
6262

6363
export default Styled<HeadingProps>(styles)(HeadingRenderer);

src/client/rsg-components/Link/LinkRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const LinkRenderer: React.FunctionComponent<LinkProps> = ({
4141

4242
LinkRenderer.propTypes = {
4343
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
44-
children: PropTypes.node,
44+
children: PropTypes.any,
4545
className: PropTypes.string,
4646
href: PropTypes.string,
4747
};

src/client/rsg-components/Logo/LogoRenderer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ const styles = ({ color, fontFamily, fontSize }: Rsg.Theme) => ({
1212
},
1313
});
1414

15-
export const LogoRenderer: React.FunctionComponent<JssInjectedProps> = ({ classes, children }) => {
15+
interface Props extends JssInjectedProps {
16+
children?: React.ReactNode;
17+
}
18+
19+
export const LogoRenderer = ({ classes, children }: Props) => {
1620
return <h1 className={classes.logo}>{children}</h1>;
1721
};
1822

src/client/rsg-components/Markdown/Blockquote/BlockquoteRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export const BlockquoteRenderer: React.FunctionComponent<BlockquoteProps> = ({
3232
BlockquoteRenderer.propTypes = {
3333
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
3434
className: PropTypes.string,
35-
children: PropTypes.node.isRequired,
35+
children: PropTypes.any.isRequired,
3636
};
3737

3838
export default Styled<BlockquoteProps>(styles)(BlockquoteRenderer);

src/client/rsg-components/Markdown/Details/DetailsRenderer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const DetailsRenderer: React.FunctionComponent<DetailsProps> = ({ classes
2222

2323
DetailsRenderer.propTypes = {
2424
classes: PropTypes.objectOf(PropTypes.string.isRequired).isRequired,
25-
children: PropTypes.node.isRequired,
25+
children: PropTypes.any.isRequired,
2626
};
2727

2828
export default Styled<DetailsProps>(styles)(DetailsRenderer);

0 commit comments

Comments
 (0)