public/js/app.js (52 lines of code) (raw):
import React from 'react';
import {render} from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import {browserHistory} from 'react-router';
import {syncHistoryWithStore} from 'react-router-redux';
import configurePresence from './util/configurePresence';
import {configureStore} from './util/store';
import {setStore} from './util/storeAccessor';
import {paramStringToObject} from './util/urlParameters';
import {BaseApp} from './BaseApp.js';
import '../styles/main.scss';
import '@guardian/prosemirror-editor/dist/style.css';
function extractConfigFromPage() {
const configEl = document.getElementById('config');
if (!configEl) {
return {};
}
return JSON.parse(configEl.innerHTML);
}
const store = configureStore();
const history = syncHistoryWithStore(browserHistory, store);
const config = extractConfigFromPage();
const presenceClient = config.presenceEnabled ? configurePresence(config.presenceDomain, config.user) : {};
setStore(store);
// Send config to store on init
store.dispatch({
type: 'CONFIG_RECEIVED',
config: config,
receivedAt: Date.now()
});
// Start presence on init
store.dispatch({
type: 'PRESENCE_CLIENT_STARTED',
presenceClient: presenceClient,
receivedAt: Date.now()
});
// Get initial URL params
store.dispatch({
type: "QUERYPARAMS_UPDATE",
queryParams: paramStringToObject(location.search),
receivedAt: Date.now()
});
const renderComponent = Component => {
render(
<AppContainer>
<Component store={store} history={history}/>
</AppContainer>
, document.getElementById('react-mount'));
};
renderComponent(BaseApp);
/* global module:false */
if (module.hot) {
module.hot.accept('./BaseApp', () => {
renderComponent(BaseApp);
});
}