1 | import { BrowserRouter } from 'react-router-dom';
|
2 | import { ClientStorage } from 'client/Common/Storage';
|
3 | import { HelmetProvider } from 'react-helmet-async';
|
4 | import { hydrate, render } from 'react-dom';
|
5 | import { loadableReady } from '@loadable/component';
|
6 | import { StorageContext } from 'client/useStorage';
|
7 | import { ThemeProvider } from 'client/Common/provider/ThemeProvider';
|
8 | import { ThemeWrap } from './ThemeWrap';
|
9 | import Axios from 'axios';
|
10 | import React from 'react';
|
11 | import type { ComponentType } from 'react';
|
12 |
|
13 | Axios.defaults.timeout = 15000;
|
14 |
|
15 | const isoDateRegex =
|
16 | /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
|
17 |
|
18 | Axios.defaults.transformResponse = [
|
19 | (data) => {
|
20 | if (typeof data === 'string') {
|
21 | try {
|
22 | return JSON.parse(data, (_key, value) => {
|
23 | if (typeof value === 'string') {
|
24 | if (isoDateRegex.exec(value)) {
|
25 | return new Date(value);
|
26 | }
|
27 | }
|
28 | return value;
|
29 | });
|
30 | } catch {
|
31 |
|
32 | }
|
33 | }
|
34 | return data;
|
35 | },
|
36 | ];
|
37 |
|
38 | const storage = new ClientStorage();
|
39 |
|
40 | const renderApp = (App: ComponentType) => (
|
41 | <HelmetProvider>
|
42 | <BrowserRouter>
|
43 | <StorageContext.Provider value={storage}>
|
44 | <ThemeProvider>
|
45 | <App />
|
46 | </ThemeProvider>
|
47 | </StorageContext.Provider>
|
48 | </BrowserRouter>
|
49 | </HelmetProvider>
|
50 | );
|
51 |
|
52 | const container = document.getElementById('app');
|
53 |
|
54 | void loadableReady(() => {
|
55 | hydrate(renderApp(ThemeWrap), container);
|
56 | });
|
57 |
|
58 |
|
59 | if (module.hot) {
|
60 |
|
61 | module.hot.accept('./ThemeWrap', () => {
|
62 | const App = require('./ThemeWrap').default;
|
63 |
|
64 | render(renderApp(App), container);
|
65 | });
|
66 | }
|