import React, { ComponentType, Suspense } from 'react' import ReactDOM from 'react-dom' import { name } from '../package.json' import devNodeEnv from './utils/nodeEnvIs/devNodeEnv' import { addLocationChangeCallback, log } from './utils' import { Provider } from 'react-redux' import { store } from './store' import APP from './App' function render(RootComponent: ComponentType) { ReactDOM.render( <Provider store={store}> <Suspense fallback={<div>on suspensing....</div>}> <RootComponent /> <div></div> </Suspense> </Provider>, document.getElementById(name) ) } // Do required initial work. Gets called every time the URL changes, // so that elements can be re-inserted as a user navigates a page with // different routes. async function main() { document.body.insertAdjacentHTML('beforeend', `<div id="${name}"></div>`) render(APP) } addLocationChangeCallback(() => { // Tampermonkey doesn't bubble errors up to the main console, // so we have to catch them manually and log them main().catch((e) => log(e)) }) if (devNodeEnv && module.hot) { module.hot.accept('./App.tsx', () => { render(APP) }) }