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-01-19 16:42:16 +01: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
|
|
|
|
let router;
|
|
|
|
|
2017-03-18 17:34:00 +01:00
|
|
|
class comp extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
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}>
|
2017-03-18 17:38:55 +01:00
|
|
|
<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',
|
2017-01-20 16:22:57 +01:00
|
|
|
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) {
|
|
|
|
System.import('./i18n')
|
|
|
|
.then((result) => {
|
|
|
|
const translationMessagesUpdated = result.translationMessages;
|
|
|
|
window.Strapi.refresh(pluginId).translationMessages(translationMessagesUpdated);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// API
|
|
|
|
const apiUrl = window.Strapi && `${window.Strapi.apiUrl}/${pluginId}`;
|
|
|
|
|
|
|
|
// Export store
|
|
|
|
export {
|
|
|
|
store,
|
|
|
|
apiUrl,
|
2017-03-18 17:34:00 +01:00
|
|
|
pluginId,
|
2017-05-09 17:35:36 +02:00
|
|
|
router,
|
2017-01-17 13:40:59 +01:00
|
|
|
};
|