UNPKG

1.75 kBTypeScriptView Raw
1import { BrowserRouter } from 'react-router-dom';
2import { ClientStorage } from 'client/Common/Storage';
3import { HelmetProvider } from 'react-helmet-async';
4import { hydrate, render } from 'react-dom';
5import { loadableReady } from '@loadable/component';
6import { StorageContext } from 'client/useStorage';
7import { ThemeProvider } from 'client/Common/provider/ThemeProvider';
8import { ThemeWrap } from './ThemeWrap';
9import Axios from 'axios';
10import React from 'react';
11import type { ComponentType } from 'react';
12// 15s timeout
13Axios.defaults.timeout = 15000;
14
15const isoDateRegex =
16 /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;
17
18Axios.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 // Ignoring
32 }
33 }
34 return data;
35 },
36];
37
38const storage = new ClientStorage();
39
40const 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
52const container = document.getElementById('app');
53
54void loadableReady(() => {
55 hydrate(renderApp(ThemeWrap), container);
56});
57
58// @ts-expect-error hot not typed
59if (module.hot) {
60 // @ts-expect-error hot not typed
61 module.hot.accept('./ThemeWrap', () => {
62 const App = require('./ThemeWrap').default;
63
64 render(renderApp(App), container);
65 });
66}