|
1 | 1 | import React, { CSSProperties } from 'react'; |
2 | | -import { render, unmountComponentAtNode } from 'react-dom'; |
| 2 | +import { createRoot, Root } from 'react-dom/client'; |
3 | 3 | import { Provider } from 'react-redux'; |
4 | 4 | import { Persistor } from 'redux-persist'; |
5 | 5 | import { REMOVE_INSTANCE, StoreAction } from '@redux-devtools/app'; |
@@ -27,23 +27,21 @@ let naTimeout: NodeJS.Timeout; |
27 | 27 |
|
28 | 28 | const isChrome = navigator.userAgent.indexOf('Firefox') === -1; |
29 | 29 |
|
30 | | -function renderDevTools() { |
31 | | - const node = document.getElementById('root'); |
32 | | - unmountComponentAtNode(node!); |
| 30 | +function renderDevTools(root: Root) { |
| 31 | + root.unmount(); |
33 | 32 | clearTimeout(naTimeout); |
34 | 33 | ({ store, persistor } = configureStore(position, bgConnection)); |
35 | | - render( |
| 34 | + root.render( |
36 | 35 | <Provider store={store}> |
37 | 36 | <PersistGate loading={null} persistor={persistor}> |
38 | 37 | <App position={position} /> |
39 | 38 | </PersistGate> |
40 | | - </Provider>, |
41 | | - node |
| 39 | + </Provider> |
42 | 40 | ); |
43 | 41 | rendered = true; |
44 | 42 | } |
45 | 43 |
|
46 | | -function renderNA() { |
| 44 | +function renderNA(root: Root) { |
47 | 45 | if (rendered === false) return; |
48 | 46 | rendered = false; |
49 | 47 | naTimeout = setTimeout(() => { |
@@ -76,32 +74,31 @@ function renderNA() { |
76 | 74 | ); |
77 | 75 | } |
78 | 76 |
|
79 | | - const node = document.getElementById('root'); |
80 | | - unmountComponentAtNode(node!); |
81 | | - render(message, node); |
| 77 | + root.unmount(); |
| 78 | + root.render(message); |
82 | 79 | store = undefined; |
83 | 80 | }); |
84 | 81 | } else { |
85 | | - const node = document.getElementById('root'); |
86 | | - unmountComponentAtNode(node!); |
87 | | - render(message, node); |
| 82 | + root.unmount(); |
| 83 | + root.render(message); |
88 | 84 | store = undefined; |
89 | 85 | } |
90 | 86 | }, 3500); |
91 | 87 | } |
92 | 88 |
|
93 | 89 | function init(id: number) { |
94 | | - renderNA(); |
| 90 | + const root = createRoot(document.getElementById('root')!); |
| 91 | + renderNA(root); |
95 | 92 | bgConnection = chrome.runtime.connect({ |
96 | 93 | name: id ? id.toString() : undefined, |
97 | 94 | }); |
98 | 95 | bgConnection.onMessage.addListener( |
99 | 96 | <S, A extends Action<unknown>>(message: PanelMessage<S, A>) => { |
100 | 97 | if (message.type === 'NA') { |
101 | | - if (message.id === id) renderNA(); |
| 98 | + if (message.id === id) renderNA(root); |
102 | 99 | else store!.dispatch({ type: REMOVE_INSTANCE, id: message.id }); |
103 | 100 | } else { |
104 | | - if (!rendered) renderDevTools(); |
| 101 | + if (!rendered) renderDevTools(root); |
105 | 102 | store!.dispatch(message); |
106 | 103 | } |
107 | 104 | } |
|
0 commit comments