1- import React , { CSSProperties } from 'react' ;
1+ import React , { CSSProperties , ReactNode } from 'react' ;
22import { createRoot , Root } from 'react-dom/client' ;
33import { Provider } from 'react-redux' ;
44import { Persistor } from 'redux-persist' ;
@@ -20,18 +20,24 @@ const messageStyle: CSSProperties = {
2020} ;
2121
2222let rendered : boolean | undefined ;
23+ let currentRoot : Root | undefined ;
2324let store : Store < StoreStateWithoutSocket , StoreAction > | undefined ;
2425let persistor : Persistor | undefined ;
2526let bgConnection : chrome . runtime . Port ;
2627let naTimeout : NodeJS . Timeout ;
2728
2829const isChrome = navigator . userAgent . indexOf ( 'Firefox' ) === - 1 ;
2930
30- function renderDevTools ( root : Root ) {
31- root . unmount ( ) ;
31+ function renderNodeAtRoot ( node : ReactNode ) {
32+ if ( currentRoot ) currentRoot . unmount ( ) ;
33+ currentRoot = createRoot ( document . getElementById ( 'root' ) ! ) ;
34+ currentRoot . render ( node ) ;
35+ }
36+
37+ function renderDevTools ( ) {
3238 clearTimeout ( naTimeout ) ;
3339 ( { store, persistor } = configureStore ( position , bgConnection ) ) ;
34- root . render (
40+ renderNodeAtRoot (
3541 < Provider store = { store } >
3642 < PersistGate loading = { null } persistor = { persistor } >
3743 < App position = { position } />
@@ -41,7 +47,7 @@ function renderDevTools(root: Root) {
4147 rendered = true ;
4248}
4349
44- function renderNA ( root : Root ) {
50+ function renderNA ( ) {
4551 if ( rendered === false ) return ;
4652 rendered = false ;
4753 naTimeout = setTimeout ( ( ) => {
@@ -74,31 +80,28 @@ function renderNA(root: Root) {
7480 ) ;
7581 }
7682
77- root . unmount ( ) ;
78- root . render ( message ) ;
83+ renderNodeAtRoot ( message ) ;
7984 store = undefined ;
8085 } ) ;
8186 } else {
82- root . unmount ( ) ;
83- root . render ( message ) ;
87+ renderNodeAtRoot ( message ) ;
8488 store = undefined ;
8589 }
8690 } , 3500 ) ;
8791}
8892
8993function init ( id : number ) {
90- const root = createRoot ( document . getElementById ( 'root' ) ! ) ;
91- renderNA ( root ) ;
94+ renderNA ( ) ;
9295 bgConnection = chrome . runtime . connect ( {
9396 name : id ? id . toString ( ) : undefined ,
9497 } ) ;
9598 bgConnection . onMessage . addListener (
9699 < S , A extends Action < unknown > > ( message : PanelMessage < S , A > ) => {
97100 if ( message . type === 'NA' ) {
98- if ( message . id === id ) renderNA ( root ) ;
101+ if ( message . id === id ) renderNA ( ) ;
99102 else store ! . dispatch ( { type : REMOVE_INSTANCE , id : message . id } ) ;
100103 } else {
101- if ( ! rendered ) renderDevTools ( root ) ;
104+ if ( ! rendered ) renderDevTools ( ) ;
102105 store ! . dispatch ( message ) ;
103106 }
104107 }
0 commit comments