94 lines
2.5 KiB
JavaScript
Raw Normal View History

2017-01-17 13:40:59 +01:00
/**
* app.js
*
* This is the entry file for the application,
* only setup and plugin code.
*/
2017-05-10 11:41:53 +02:00
import { syncHistoryWithStore } from 'react-router-redux';
2017-01-17 13:40:59 +01:00
import configureStore from './store';
2017-03-18 17:34:00 +01:00
import React from 'react';
import { Provider } from 'react-redux';
2017-01-17 13:40:59 +01:00
// Create redux store with history
// this uses the singleton browserHistory provided by react-router
// Optionally, this could be changed to leverage a created history
// e.g. `const browserHistory = useRouterHistory(createBrowserHistory)();`
2017-05-10 11:41:53 +02:00
const store = configureStore({}, window.Strapi.router);
// Sync history and store, as the react-router-redux reducer
// is under the non-default key ("routing"), selectLocationState
// must be provided for resolving how to retrieve the "route" in the state
import { selectLocationState } from 'containers/App/selectors';
syncHistoryWithStore(window.Strapi.router, store, {
selectLocationState: selectLocationState(),
});
2017-01-17 13:40:59 +01:00
// Set up the router, wrapping all Routes in the App component
import App from 'containers/App';
import createRoutes from './routes';
import { translationMessages } from './i18n';
// Plugin identifier based on the package.json `name` value
2017-05-11 10:54:44 +02:00
const pluginId = require('../package.json').name.replace(
/^strapi-plugin-/i,
''
);
2017-01-17 13:40:59 +01:00
2017-05-09 17:35:36 +02:00
// Define Strapi admin router
2017-05-11 10:54:44 +02:00
let router; // eslint-disable-line import/no-mutable-exports
2017-05-09 17:35:36 +02:00
2017-05-11 10:54:44 +02:00
class comp extends React.Component {
2017-05-09 17:35:36 +02:00
componentWillMount() {
// Expose Strapi admin router
router = this.context.router;
}
2017-03-18 17:34:00 +01:00
render() {
return (
<Provider store={store}>
<App {...this.props} />
2017-03-18 17:34:00 +01:00
</Provider>
);
}
}
2017-05-09 17:35:36 +02:00
comp.contextTypes = {
router: React.PropTypes.object.isRequired,
};
2017-01-17 13:40:59 +01:00
// Register the plugin
if (window.Strapi) {
window.Strapi.registerPlugin({
2017-01-18 11:59:46 +01:00
name: 'Content Manager',
icon: 'ion-document-text',
2017-01-17 13:40:59 +01:00
id: pluginId,
2017-03-18 17:34:00 +01:00
leftMenuLinks: [],
mainComponent: comp,
2017-01-17 13:40:59 +01:00
routes: createRoutes(store),
translationMessages,
});
}
// Hot reloadable translation json files
if (module.hot) {
// modules.hot.accept does not accept dynamic dependencies,
// have to be constants at compile-time
module.hot.accept('./i18n', () => {
if (window.Strapi) {
2017-05-11 10:54:44 +02:00
System.import('./i18n').then(result => {
const translationMessagesUpdated = result.translationMessages;
window.Strapi
.refresh(pluginId)
.translationMessages(translationMessagesUpdated);
});
2017-01-17 13:40:59 +01:00
}
});
}
// API
const apiUrl = window.Strapi && `${window.Strapi.apiUrl}/${pluginId}`;
// Export store
2017-05-11 10:54:44 +02:00
export { store, apiUrl, pluginId, router };