forked from silverstripe/silverstripe-framework
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
147 lines (127 loc) · 4.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import $ from 'jQuery';
import React from 'react';
import ReactDOM from 'react-dom';
import { combineReducers, createStore, applyMiddleware } from 'redux';
import { Provider } from 'react-redux';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import { Router as ReactRouter, useRouterHistory } from 'react-router';
import createHistory from 'history/lib/createBrowserHistory';
import Config from 'lib/Config';
import pageRouter from 'lib/Router';
import routeRegister from 'lib/RouteRegister';
import reducerRegister from 'lib/ReducerRegister';
import injector from 'lib/Injector';
import App from 'containers/App/App';
import * as configActions from 'state/config/ConfigActions';
import ConfigReducer from 'state/config/ConfigReducer';
import FormReducer from 'state/form/FormReducer';
import SchemaReducer from 'state/schema/SchemaReducer';
import RecordsReducer from 'state/records/RecordsReducer';
import CampaignReducer from 'state/campaign/CampaignReducer';
import BreadcrumbsReducer from 'state/breadcrumbs/BreadcrumbsReducer';
import TextField from 'components/TextField/TextField';
import HiddenField from 'components/HiddenField/HiddenField';
import GridField from 'components/GridField/GridField';
import { syncHistoryWithStore, routerReducer } from 'react-router-redux';
// Sections
// eslint-disable-next-line no-unused-vars
import CampaignAdmin from 'containers/CampaignAdmin/controller';
function initReactRouter(store) {
routeRegister.updateRootRoute({
component: App,
});
let history = syncHistoryWithStore(
useRouterHistory(createHistory)({
basename: Config.get('adminUrlBase'),
}),
store
);
ReactDOM.render(
<Provider store={store}>
<ReactRouter
history={history}
routes={routeRegister.getRootRoute()}
/>
</Provider>,
document.getElementsByClassName('cms-content')[0]
);
}
function initLegacyRouter(store) {
const sections = Config.get('sections');
// Initialise routes
pageRouter.base(pageRouter.getBase());
pageRouter('*', (ctx, next) => {
// eslint-disable-next-line no-param-reassign
ctx.store = store;
next();
});
// Register all top level routes.
// This can be removed when top level sections are converted to React,
// have their own JavaScript controllers, and register their own routes.
Object.keys(sections).forEach((key) => {
let route = pageRouter.resolveURLToBase(sections[key].route);
route = route.replace(/\/$/, ''); // Remove trailing slash
route = `${route}(/*?)?`; // add optional trailing slash
route = route.replace(/^\/*/, ''); // remove leading slash
// page.js based routing, excludes any React-powered sections
pageRouter(route, (ctx, next) => {
if (document.readyState !== 'complete' || ctx.init) {
next();
return;
}
// Load the panel then call the next route.
$('.cms-container')
.entwine('ss')
.handleStateChange(null, ctx.state);
});
});
pageRouter.start();
}
function appBoot() {
reducerRegister.add('config', ConfigReducer);
reducerRegister.add('form', FormReducer);
reducerRegister.add('schemas', SchemaReducer);
reducerRegister.add('records', RecordsReducer);
reducerRegister.add('campaign', CampaignReducer);
reducerRegister.add('breadcrumbs', BreadcrumbsReducer);
injector.register('TextField', TextField);
injector.register('HiddenField', HiddenField);
injector.register('GridField', GridField);
const initialState = {};
const reducers = reducerRegister.getAll();
const rootReducer = combineReducers({
...reducers,
routing: routerReducer
});
const middleware = [thunkMiddleware];
if (Config.get('environment') === 'dev') {
middleware.push(createLogger());
}
const createStoreWithMiddleware = applyMiddleware(...middleware)(createStore);
const store = createStoreWithMiddleware(rootReducer, initialState);
// Set the initial config state.
store.dispatch(configActions.setConfig(Config.getAll()));
// Legacy routes will always cause a full page reload
const sections = Config.get('sections');
const currentPath = window.location.pathname.replace(/\/$/, '');
const matchesLegacyRoute = Object.keys(sections).find((key) => {
const section = sections[key];
const route = pageRouter.resolveURLToBase(section.route).replace(/\/$/, '');
// Skip react routes
if (section.reactRouter) {
return false;
}
// Check if the beginning of the route is the same as the current location.
// Since we haven't decided on a router yet, we can't use it for route matching.
// TODO Limit full page load when transitioning from legacy to react route or vice versa
return currentPath.match(route);
});
// Decide which router to use
if (matchesLegacyRoute) {
initLegacyRouter(store);
} else {
initReactRouter(store);
}
}
window.onload = appBoot;